(Auto)update libjingle 72403605-> 72407428
git-svn-id: http://webrtc.googlecode.com/svn/trunk@6811 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
parent
6955213eca
commit
3bc48247b7
talk
@ -489,8 +489,6 @@
|
|||||||
'media/base/mediacommon.h',
|
'media/base/mediacommon.h',
|
||||||
'media/base/mediaengine.cc',
|
'media/base/mediaengine.cc',
|
||||||
'media/base/mediaengine.h',
|
'media/base/mediaengine.h',
|
||||||
'media/base/mutedvideocapturer.cc',
|
|
||||||
'media/base/mutedvideocapturer.h',
|
|
||||||
'media/base/rtpdataengine.cc',
|
'media/base/rtpdataengine.cc',
|
||||||
'media/base/rtpdataengine.h',
|
'media/base/rtpdataengine.h',
|
||||||
'media/base/rtpdump.cc',
|
'media/base/rtpdump.cc',
|
||||||
@ -508,6 +506,7 @@
|
|||||||
'media/base/videocommon.h',
|
'media/base/videocommon.h',
|
||||||
'media/base/videoframe.cc',
|
'media/base/videoframe.cc',
|
||||||
'media/base/videoframe.h',
|
'media/base/videoframe.h',
|
||||||
|
'media/base/videoframefactory.h',
|
||||||
'media/base/videoprocessor.h',
|
'media/base/videoprocessor.h',
|
||||||
'media/base/videorenderer.h',
|
'media/base/videorenderer.h',
|
||||||
'media/base/voiceprocessor.h',
|
'media/base/voiceprocessor.h',
|
||||||
@ -543,6 +542,8 @@
|
|||||||
'media/webrtc/webrtcvideoengine2.h',
|
'media/webrtc/webrtcvideoengine2.h',
|
||||||
'media/webrtc/webrtcvideoframe.cc',
|
'media/webrtc/webrtcvideoframe.cc',
|
||||||
'media/webrtc/webrtcvideoframe.h',
|
'media/webrtc/webrtcvideoframe.h',
|
||||||
|
'media/webrtc/webrtcvideoframefactory.cc',
|
||||||
|
'media/webrtc/webrtcvideoframefactory.h',
|
||||||
'media/webrtc/webrtcvie.h',
|
'media/webrtc/webrtcvie.h',
|
||||||
'media/webrtc/webrtcvoe.h',
|
'media/webrtc/webrtcvoe.h',
|
||||||
'media/webrtc/webrtcvoiceengine.cc',
|
'media/webrtc/webrtcvoiceengine.cc',
|
||||||
|
@ -148,6 +148,7 @@
|
|||||||
'media/base/streamparams_unittest.cc',
|
'media/base/streamparams_unittest.cc',
|
||||||
'media/base/testutils.cc',
|
'media/base/testutils.cc',
|
||||||
'media/base/testutils.h',
|
'media/base/testutils.h',
|
||||||
|
'media/base/videoadapter_unittest.cc',
|
||||||
'media/base/videocapturer_unittest.cc',
|
'media/base/videocapturer_unittest.cc',
|
||||||
'media/base/videocommon_unittest.cc',
|
'media/base/videocommon_unittest.cc',
|
||||||
'media/base/videoengine_unittest.h',
|
'media/base/videoengine_unittest.h',
|
||||||
|
@ -36,6 +36,9 @@
|
|||||||
#include "talk/media/base/videocapturer.h"
|
#include "talk/media/base/videocapturer.h"
|
||||||
#include "talk/media/base/videocommon.h"
|
#include "talk/media/base/videocommon.h"
|
||||||
#include "talk/media/base/videoframe.h"
|
#include "talk/media/base/videoframe.h"
|
||||||
|
#ifdef HAVE_WEBRTC_VIDEO
|
||||||
|
#include "talk/media/webrtc/webrtcvideoframefactory.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace cricket {
|
namespace cricket {
|
||||||
|
|
||||||
@ -47,6 +50,9 @@ class FakeVideoCapturer : public cricket::VideoCapturer {
|
|||||||
initial_unix_timestamp_(time(NULL) * rtc::kNumNanosecsPerSec),
|
initial_unix_timestamp_(time(NULL) * rtc::kNumNanosecsPerSec),
|
||||||
next_timestamp_(rtc::kNumNanosecsPerMillisec),
|
next_timestamp_(rtc::kNumNanosecsPerMillisec),
|
||||||
is_screencast_(false) {
|
is_screencast_(false) {
|
||||||
|
#ifdef HAVE_WEBRTC_VIDEO
|
||||||
|
set_frame_factory(new cricket::WebRtcVideoFrameFactory());
|
||||||
|
#endif
|
||||||
// Default supported formats. Use ResetSupportedFormats to over write.
|
// Default supported formats. Use ResetSupportedFormats to over write.
|
||||||
std::vector<cricket::VideoFormat> formats;
|
std::vector<cricket::VideoFormat> formats;
|
||||||
formats.push_back(cricket::VideoFormat(1280, 720,
|
formats.push_back(cricket::VideoFormat(1280, 720,
|
||||||
|
@ -1,135 +1,2 @@
|
|||||||
/*
|
// TODO(pthatcher): Delete this file. Pulse won't work without it for
|
||||||
* libjingle
|
// some reason.
|
||||||
* Copyright 2012 Google Inc.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer in the documentation
|
|
||||||
* and/or other materials provided with the distribution.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
||||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
||||||
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
||||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
||||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
||||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "webrtc/base/logging.h"
|
|
||||||
#include "webrtc/base/thread.h"
|
|
||||||
#include "talk/media/base/mutedvideocapturer.h"
|
|
||||||
#include "talk/media/base/videoframe.h"
|
|
||||||
|
|
||||||
#if defined(HAVE_WEBRTC_VIDEO)
|
|
||||||
#include "talk/media/webrtc/webrtcvideoframe.h"
|
|
||||||
#endif // HAVE_WEBRTC_VIDEO
|
|
||||||
|
|
||||||
|
|
||||||
namespace cricket {
|
|
||||||
|
|
||||||
const char MutedVideoCapturer::kCapturerId[] = "muted_camera";
|
|
||||||
|
|
||||||
class MutedFramesGenerator : public rtc::MessageHandler {
|
|
||||||
public:
|
|
||||||
explicit MutedFramesGenerator(const VideoFormat& format);
|
|
||||||
virtual ~MutedFramesGenerator();
|
|
||||||
|
|
||||||
// Called every |interval| ms. From |format|.interval given in the
|
|
||||||
// constructor.
|
|
||||||
sigslot::signal1<VideoFrame*> SignalFrame;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void OnMessage(rtc::Message* message);
|
|
||||||
|
|
||||||
private:
|
|
||||||
rtc::Thread capture_thread_;
|
|
||||||
rtc::scoped_ptr<VideoFrame> muted_frame_;
|
|
||||||
const VideoFormat format_;
|
|
||||||
const int interval_;
|
|
||||||
uint32 create_time_;
|
|
||||||
};
|
|
||||||
|
|
||||||
MutedFramesGenerator::MutedFramesGenerator(const VideoFormat& format)
|
|
||||||
: format_(format),
|
|
||||||
interval_(static_cast<int>(format.interval /
|
|
||||||
rtc::kNumNanosecsPerMillisec)),
|
|
||||||
create_time_(rtc::Time()) {
|
|
||||||
capture_thread_.Start();
|
|
||||||
capture_thread_.PostDelayed(interval_, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
MutedFramesGenerator::~MutedFramesGenerator() { capture_thread_.Clear(this); }
|
|
||||||
|
|
||||||
void MutedFramesGenerator::OnMessage(rtc::Message* message) {
|
|
||||||
// Queue a new frame as soon as possible to minimize drift.
|
|
||||||
capture_thread_.PostDelayed(interval_, this);
|
|
||||||
if (!muted_frame_) {
|
|
||||||
#if defined(HAVE_WEBRTC_VIDEO)
|
|
||||||
#define VIDEO_FRAME_NAME WebRtcVideoFrame
|
|
||||||
#endif
|
|
||||||
#if defined(VIDEO_FRAME_NAME)
|
|
||||||
muted_frame_.reset(new VIDEO_FRAME_NAME());
|
|
||||||
#else
|
|
||||||
return;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
uint32 current_timestamp = rtc::Time();
|
|
||||||
// Delta between create time and current time will be correct even if there is
|
|
||||||
// a wraparound since they are unsigned integers.
|
|
||||||
uint32 elapsed_time = current_timestamp - create_time_;
|
|
||||||
if (!muted_frame_->InitToBlack(format_.width, format_.height, 1, 1,
|
|
||||||
elapsed_time, current_timestamp)) {
|
|
||||||
LOG(LS_ERROR) << "Failed to create a black frame.";
|
|
||||||
}
|
|
||||||
SignalFrame(muted_frame_.get());
|
|
||||||
}
|
|
||||||
|
|
||||||
MutedVideoCapturer::MutedVideoCapturer() { SetId(kCapturerId); }
|
|
||||||
|
|
||||||
MutedVideoCapturer::~MutedVideoCapturer() { Stop(); }
|
|
||||||
|
|
||||||
bool MutedVideoCapturer::GetBestCaptureFormat(const VideoFormat& desired,
|
|
||||||
VideoFormat* best_format) {
|
|
||||||
*best_format = desired;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
CaptureState MutedVideoCapturer::Start(const VideoFormat& capture_format) {
|
|
||||||
if (frame_generator_.get()) {
|
|
||||||
return CS_RUNNING;
|
|
||||||
}
|
|
||||||
frame_generator_.reset(new MutedFramesGenerator(capture_format));
|
|
||||||
frame_generator_->SignalFrame
|
|
||||||
.connect(this, &MutedVideoCapturer::OnMutedFrame);
|
|
||||||
SetCaptureFormat(&capture_format);
|
|
||||||
return CS_RUNNING;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MutedVideoCapturer::Stop() {
|
|
||||||
frame_generator_.reset();
|
|
||||||
SetCaptureFormat(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MutedVideoCapturer::IsRunning() { return frame_generator_.get() != NULL; }
|
|
||||||
|
|
||||||
bool MutedVideoCapturer::GetPreferredFourccs(std::vector<uint32>* fourccs) {
|
|
||||||
fourccs->clear();
|
|
||||||
fourccs->push_back(cricket::FOURCC_I420);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MutedVideoCapturer::OnMutedFrame(VideoFrame* muted_frame) {
|
|
||||||
SignalVideoFrame(this, muted_frame);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace cricket
|
|
||||||
|
@ -1,96 +0,0 @@
|
|||||||
/*
|
|
||||||
* libjingle
|
|
||||||
* Copyright 2012 Google Inc.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer in the documentation
|
|
||||||
* and/or other materials provided with the distribution.
|
|
||||||
* 3. The name of the author may not be used to endorse or promote products
|
|
||||||
* derived from this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
||||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
||||||
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
||||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
||||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
||||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "talk/media/base/mutedvideocapturer.h"
|
|
||||||
|
|
||||||
#include "webrtc/base/gunit.h"
|
|
||||||
#include "talk/media/base/videoframe.h"
|
|
||||||
|
|
||||||
class MutedVideoCapturerTest : public sigslot::has_slots<>,
|
|
||||||
public testing::Test {
|
|
||||||
protected:
|
|
||||||
void SetUp() {
|
|
||||||
frames_received_ = 0;
|
|
||||||
capturer_.SignalVideoFrame
|
|
||||||
.connect(this, &MutedVideoCapturerTest::OnVideoFrame);
|
|
||||||
}
|
|
||||||
void OnVideoFrame(cricket::VideoCapturer* capturer,
|
|
||||||
const cricket::VideoFrame* muted_frame) {
|
|
||||||
EXPECT_EQ(capturer, &capturer_);
|
|
||||||
++frames_received_;
|
|
||||||
received_width_ = muted_frame->GetWidth();
|
|
||||||
received_height_ = muted_frame->GetHeight();
|
|
||||||
}
|
|
||||||
int frames_received() { return frames_received_; }
|
|
||||||
bool ReceivedCorrectFormat() {
|
|
||||||
return (received_width_ == capturer_.GetCaptureFormat()->width) &&
|
|
||||||
(received_height_ == capturer_.GetCaptureFormat()->height);
|
|
||||||
}
|
|
||||||
|
|
||||||
cricket::MutedVideoCapturer capturer_;
|
|
||||||
int frames_received_;
|
|
||||||
cricket::VideoFormat capture_format_;
|
|
||||||
int received_width_;
|
|
||||||
int received_height_;
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST_F(MutedVideoCapturerTest, GetBestCaptureFormat) {
|
|
||||||
cricket::VideoFormat format(640, 360, cricket::VideoFormat::FpsToInterval(30),
|
|
||||||
cricket::FOURCC_I420);
|
|
||||||
cricket::VideoFormat best_format;
|
|
||||||
EXPECT_TRUE(capturer_.GetBestCaptureFormat(format, &best_format));
|
|
||||||
EXPECT_EQ(format.width, best_format.width);
|
|
||||||
EXPECT_EQ(format.height, best_format.height);
|
|
||||||
EXPECT_EQ(format.interval, best_format.interval);
|
|
||||||
EXPECT_EQ(format.fourcc, best_format.fourcc);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(MutedVideoCapturerTest, IsScreencast) {
|
|
||||||
EXPECT_FALSE(capturer_.IsScreencast());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(MutedVideoCapturerTest, GetPreferredFourccs) {
|
|
||||||
std::vector<uint32> fourccs;
|
|
||||||
EXPECT_TRUE(capturer_.GetPreferredFourccs(&fourccs));
|
|
||||||
EXPECT_EQ(fourccs.size(), 1u);
|
|
||||||
EXPECT_TRUE(capturer_.GetPreferredFourccs(&fourccs));
|
|
||||||
EXPECT_EQ(fourccs.size(), 1u);
|
|
||||||
EXPECT_EQ(fourccs[0], cricket::FOURCC_I420);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_F(MutedVideoCapturerTest, Capturing) {
|
|
||||||
cricket::VideoFormat format(640, 360, cricket::VideoFormat::FpsToInterval(30),
|
|
||||||
cricket::FOURCC_I420);
|
|
||||||
EXPECT_EQ(capturer_.Start(format), cricket::CS_RUNNING);
|
|
||||||
EXPECT_EQ(capturer_.Start(format), cricket::CS_RUNNING);
|
|
||||||
EXPECT_TRUE(capturer_.IsRunning());
|
|
||||||
// 100 ms should be enough to receive 3 frames at FPS of 30.
|
|
||||||
EXPECT_EQ_WAIT(frames_received(), 1, 100);
|
|
||||||
EXPECT_TRUE(ReceivedCorrectFormat());
|
|
||||||
capturer_.Stop();
|
|
||||||
EXPECT_FALSE(capturer_.IsRunning());
|
|
||||||
}
|
|
1285
talk/media/base/videoadapter_unittest.cc
Executable file
1285
talk/media/base/videoadapter_unittest.cc
Executable file
File diff suppressed because it is too large
Load Diff
@ -35,13 +35,14 @@
|
|||||||
#include "webrtc/base/common.h"
|
#include "webrtc/base/common.h"
|
||||||
#include "webrtc/base/logging.h"
|
#include "webrtc/base/logging.h"
|
||||||
#include "webrtc/base/systeminfo.h"
|
#include "webrtc/base/systeminfo.h"
|
||||||
|
#include "talk/media/base/videoframefactory.h"
|
||||||
#include "talk/media/base/videoprocessor.h"
|
#include "talk/media/base/videoprocessor.h"
|
||||||
|
|
||||||
#if defined(HAVE_WEBRTC_VIDEO)
|
#if defined(HAVE_WEBRTC_VIDEO)
|
||||||
#include "talk/media/webrtc/webrtcvideoframe.h"
|
#include "talk/media/webrtc/webrtcvideoframe.h"
|
||||||
|
#include "talk/media/webrtc/webrtcvideoframefactory.h"
|
||||||
#endif // HAVE_WEBRTC_VIDEO
|
#endif // HAVE_WEBRTC_VIDEO
|
||||||
|
|
||||||
|
|
||||||
namespace cricket {
|
namespace cricket {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
@ -352,10 +353,6 @@ void VideoCapturer::OnFrameCaptured(VideoCapturer*,
|
|||||||
if (SignalVideoFrame.is_empty()) {
|
if (SignalVideoFrame.is_empty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#if defined(HAVE_WEBRTC_VIDEO)
|
|
||||||
#define VIDEO_FRAME_NAME WebRtcVideoFrame
|
|
||||||
#endif
|
|
||||||
#if defined(VIDEO_FRAME_NAME)
|
|
||||||
#if !defined(DISABLE_YUV)
|
#if !defined(DISABLE_YUV)
|
||||||
if (IsScreencast()) {
|
if (IsScreencast()) {
|
||||||
int scaled_width, scaled_height;
|
int scaled_width, scaled_height;
|
||||||
@ -501,8 +498,15 @@ void VideoCapturer::OnFrameCaptured(VideoCapturer*,
|
|||||||
&desired_width, &desired_height);
|
&desired_width, &desired_height);
|
||||||
}
|
}
|
||||||
|
|
||||||
VIDEO_FRAME_NAME i420_frame;
|
if (!frame_factory_) {
|
||||||
if (!i420_frame.Alias(captured_frame, desired_width, desired_height)) {
|
LOG(LS_ERROR) << "No video frame factory.";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rtc::scoped_ptr<VideoFrame> i420_frame(
|
||||||
|
frame_factory_->CreateAliasedFrame(
|
||||||
|
captured_frame, desired_width, desired_height));
|
||||||
|
if (!i420_frame) {
|
||||||
// TODO(fbarchard): LOG more information about captured frame attributes.
|
// TODO(fbarchard): LOG more information about captured frame attributes.
|
||||||
LOG(LS_ERROR) << "Couldn't convert to I420! "
|
LOG(LS_ERROR) << "Couldn't convert to I420! "
|
||||||
<< "From " << ToString(captured_frame) << " To "
|
<< "From " << ToString(captured_frame) << " To "
|
||||||
@ -510,7 +514,7 @@ void VideoCapturer::OnFrameCaptured(VideoCapturer*,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
VideoFrame* adapted_frame = &i420_frame;
|
VideoFrame* adapted_frame = i420_frame.get();
|
||||||
if (enable_video_adapter_ && !IsScreencast()) {
|
if (enable_video_adapter_ && !IsScreencast()) {
|
||||||
VideoFrame* out_frame = NULL;
|
VideoFrame* out_frame = NULL;
|
||||||
video_adapter_.AdaptFrame(adapted_frame, &out_frame);
|
video_adapter_.AdaptFrame(adapted_frame, &out_frame);
|
||||||
@ -528,13 +532,12 @@ void VideoCapturer::OnFrameCaptured(VideoCapturer*,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (muted_) {
|
if (muted_) {
|
||||||
|
// TODO(pthatcher): Use frame_factory_->CreateBlackFrame() instead.
|
||||||
adapted_frame->SetToBlack();
|
adapted_frame->SetToBlack();
|
||||||
}
|
}
|
||||||
SignalVideoFrame(this, adapted_frame);
|
SignalVideoFrame(this, adapted_frame);
|
||||||
|
|
||||||
UpdateStats(captured_frame);
|
UpdateStats(captured_frame);
|
||||||
|
|
||||||
#endif // VIDEO_FRAME_NAME
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void VideoCapturer::SetCaptureState(CaptureState state) {
|
void VideoCapturer::SetCaptureState(CaptureState state) {
|
||||||
|
@ -42,6 +42,7 @@
|
|||||||
#include "talk/media/base/mediachannel.h"
|
#include "talk/media/base/mediachannel.h"
|
||||||
#include "talk/media/base/videoadapter.h"
|
#include "talk/media/base/videoadapter.h"
|
||||||
#include "talk/media/base/videocommon.h"
|
#include "talk/media/base/videocommon.h"
|
||||||
|
#include "talk/media/base/videoframefactory.h"
|
||||||
#include "talk/media/devices/devicemanager.h"
|
#include "talk/media/devices/devicemanager.h"
|
||||||
|
|
||||||
|
|
||||||
@ -289,6 +290,11 @@ class VideoCapturer
|
|||||||
return &video_adapter_;
|
return &video_adapter_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Takes ownership.
|
||||||
|
void set_frame_factory(VideoFrameFactory* frame_factory) {
|
||||||
|
frame_factory_.reset(frame_factory);
|
||||||
|
}
|
||||||
|
|
||||||
// Gets statistics for tracked variables recorded since the last call to
|
// Gets statistics for tracked variables recorded since the last call to
|
||||||
// GetStats. Note that calling GetStats resets any gathered data so it
|
// GetStats. Note that calling GetStats resets any gathered data so it
|
||||||
// should be called only periodically to log statistics.
|
// should be called only periodically to log statistics.
|
||||||
@ -326,6 +332,7 @@ class VideoCapturer
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SetSupportedFormats(const std::vector<VideoFormat>& formats);
|
void SetSupportedFormats(const std::vector<VideoFormat>& formats);
|
||||||
|
VideoFrameFactory* frame_factory() { return frame_factory_.get(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void Construct();
|
void Construct();
|
||||||
@ -361,6 +368,7 @@ class VideoCapturer
|
|||||||
rtc::Thread* thread_;
|
rtc::Thread* thread_;
|
||||||
std::string id_;
|
std::string id_;
|
||||||
CaptureState capture_state_;
|
CaptureState capture_state_;
|
||||||
|
rtc::scoped_ptr<VideoFrameFactory> frame_factory_;
|
||||||
rtc::scoped_ptr<VideoFormat> capture_format_;
|
rtc::scoped_ptr<VideoFormat> capture_format_;
|
||||||
std::vector<VideoFormat> supported_formats_;
|
std::vector<VideoFormat> supported_formats_;
|
||||||
rtc::scoped_ptr<VideoFormat> max_format_;
|
rtc::scoped_ptr<VideoFormat> max_format_;
|
||||||
|
@ -1,4 +1,29 @@
|
|||||||
// Copyright 2008 Google Inc.
|
/*
|
||||||
|
* libjingle
|
||||||
|
* Copyright 2008 Google Inc.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -13,15 +38,6 @@
|
|||||||
#include "talk/media/base/videocapturer.h"
|
#include "talk/media/base/videocapturer.h"
|
||||||
#include "talk/media/base/videoprocessor.h"
|
#include "talk/media/base/videoprocessor.h"
|
||||||
|
|
||||||
// If HAS_I420_FRAME is not defined the video capturer will not be able to
|
|
||||||
// provide OnVideoFrame-callbacks since they require cricket::CapturedFrame to
|
|
||||||
// be decoded as a cricket::VideoFrame (i.e. an I420 frame). This functionality
|
|
||||||
// only exist if HAS_I420_FRAME is defined below. I420 frames are also a
|
|
||||||
// requirement for the VideoProcessors so they will not be called either.
|
|
||||||
#if defined(HAVE_WEBRTC_VIDEO)
|
|
||||||
#define HAS_I420_FRAME
|
|
||||||
#endif
|
|
||||||
|
|
||||||
using cricket::FakeVideoCapturer;
|
using cricket::FakeVideoCapturer;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
@ -682,7 +698,12 @@ TEST_F(VideoCapturerTest, TestRequest16x10_9) {
|
|||||||
EXPECT_EQ(360, best.height);
|
EXPECT_EQ(360, best.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(HAS_I420_FRAME)
|
// If HAVE_WEBRTC_VIDEO is not defined the video capturer will not be able to
|
||||||
|
// provide OnVideoFrame-callbacks since they require cricket::CapturedFrame to
|
||||||
|
// be decoded as a cricket::VideoFrame (i.e. an I420 frame). This functionality
|
||||||
|
// only exist if HAVE_WEBRTC_VIDEO is defined below. I420 frames are also a
|
||||||
|
// requirement for the VideoProcessors so they will not be called either.
|
||||||
|
#if defined(HAVE_WEBRTC_VIDEO)
|
||||||
TEST_F(VideoCapturerTest, VideoFrame) {
|
TEST_F(VideoCapturerTest, VideoFrame) {
|
||||||
EXPECT_EQ(cricket::CS_RUNNING, capturer_.Start(cricket::VideoFormat(
|
EXPECT_EQ(cricket::CS_RUNNING, capturer_.Start(cricket::VideoFormat(
|
||||||
640,
|
640,
|
||||||
@ -735,7 +756,7 @@ TEST_F(VideoCapturerTest, ProcessorDropFrame) {
|
|||||||
EXPECT_TRUE(capturer_.CaptureFrame());
|
EXPECT_TRUE(capturer_.CaptureFrame());
|
||||||
EXPECT_EQ(0, video_frames_received());
|
EXPECT_EQ(0, video_frames_received());
|
||||||
}
|
}
|
||||||
#endif // HAS_I420_FRAME
|
#endif // HAVE_WEBRTC_VIDEO
|
||||||
|
|
||||||
bool HdFormatInList(const std::vector<cricket::VideoFormat>& formats) {
|
bool HdFormatInList(const std::vector<cricket::VideoFormat>& formats) {
|
||||||
for (std::vector<cricket::VideoFormat>::const_iterator found =
|
for (std::vector<cricket::VideoFormat>::const_iterator found =
|
||||||
|
@ -503,14 +503,18 @@ class VideoMediaChannelTest : public testing::Test,
|
|||||||
media_error_ = cricket::VideoMediaChannel::ERROR_NONE;
|
media_error_ = cricket::VideoMediaChannel::ERROR_NONE;
|
||||||
channel_->SetRecvCodecs(engine_.codecs());
|
channel_->SetRecvCodecs(engine_.codecs());
|
||||||
EXPECT_TRUE(channel_->AddSendStream(DefaultSendStreamParams()));
|
EXPECT_TRUE(channel_->AddSendStream(DefaultSendStreamParams()));
|
||||||
|
video_capturer_.reset(CreateFakeVideoCapturer());
|
||||||
video_capturer_.reset(new cricket::FakeVideoCapturer);
|
|
||||||
cricket::VideoFormat format(640, 480,
|
cricket::VideoFormat format(640, 480,
|
||||||
cricket::VideoFormat::FpsToInterval(30),
|
cricket::VideoFormat::FpsToInterval(30),
|
||||||
cricket::FOURCC_I420);
|
cricket::FOURCC_I420);
|
||||||
EXPECT_EQ(cricket::CS_RUNNING, video_capturer_->Start(format));
|
EXPECT_EQ(cricket::CS_RUNNING, video_capturer_->Start(format));
|
||||||
EXPECT_TRUE(channel_->SetCapturer(kSsrc, video_capturer_.get()));
|
EXPECT_TRUE(channel_->SetCapturer(kSsrc, video_capturer_.get()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual cricket::FakeVideoCapturer* CreateFakeVideoCapturer() {
|
||||||
|
return new cricket::FakeVideoCapturer();
|
||||||
|
}
|
||||||
|
|
||||||
// Utility method to setup an additional stream to send and receive video.
|
// Utility method to setup an additional stream to send and receive video.
|
||||||
// Used to test send and recv between two streams.
|
// Used to test send and recv between two streams.
|
||||||
void SetUpSecondStream() {
|
void SetUpSecondStream() {
|
||||||
@ -535,7 +539,7 @@ class VideoMediaChannelTest : public testing::Test,
|
|||||||
// We dont add recv for the second stream.
|
// We dont add recv for the second stream.
|
||||||
|
|
||||||
// Setup the receive and renderer for second stream after send.
|
// Setup the receive and renderer for second stream after send.
|
||||||
video_capturer_2_.reset(new cricket::FakeVideoCapturer());
|
video_capturer_2_.reset(CreateFakeVideoCapturer());
|
||||||
cricket::VideoFormat format(640, 480,
|
cricket::VideoFormat format(640, 480,
|
||||||
cricket::VideoFormat::FpsToInterval(30),
|
cricket::VideoFormat::FpsToInterval(30),
|
||||||
cricket::FOURCC_I420);
|
cricket::FOURCC_I420);
|
||||||
@ -967,7 +971,7 @@ class VideoMediaChannelTest : public testing::Test,
|
|||||||
// Add an additional capturer, and hook up a renderer to receive it.
|
// Add an additional capturer, and hook up a renderer to receive it.
|
||||||
cricket::FakeVideoRenderer renderer1;
|
cricket::FakeVideoRenderer renderer1;
|
||||||
rtc::scoped_ptr<cricket::FakeVideoCapturer> capturer(
|
rtc::scoped_ptr<cricket::FakeVideoCapturer> capturer(
|
||||||
new cricket::FakeVideoCapturer);
|
CreateFakeVideoCapturer());
|
||||||
capturer->SetScreencast(true);
|
capturer->SetScreencast(true);
|
||||||
const int kTestWidth = 160;
|
const int kTestWidth = 160;
|
||||||
const int kTestHeight = 120;
|
const int kTestHeight = 120;
|
||||||
@ -1317,7 +1321,7 @@ class VideoMediaChannelTest : public testing::Test,
|
|||||||
EXPECT_TRUE(SendFrame());
|
EXPECT_TRUE(SendFrame());
|
||||||
EXPECT_FRAME_WAIT(1, codec.width, codec.height, kTimeout);
|
EXPECT_FRAME_WAIT(1, codec.width, codec.height, kTimeout);
|
||||||
rtc::scoped_ptr<cricket::FakeVideoCapturer> capturer(
|
rtc::scoped_ptr<cricket::FakeVideoCapturer> capturer(
|
||||||
new cricket::FakeVideoCapturer);
|
CreateFakeVideoCapturer());
|
||||||
capturer->SetScreencast(true);
|
capturer->SetScreencast(true);
|
||||||
cricket::VideoFormat format(480, 360,
|
cricket::VideoFormat format(480, 360,
|
||||||
cricket::VideoFormat::FpsToInterval(30),
|
cricket::VideoFormat::FpsToInterval(30),
|
||||||
@ -1411,7 +1415,7 @@ class VideoMediaChannelTest : public testing::Test,
|
|||||||
EXPECT_TRUE(channel_->AddSendStream(
|
EXPECT_TRUE(channel_->AddSendStream(
|
||||||
cricket::StreamParams::CreateLegacy(1)));
|
cricket::StreamParams::CreateLegacy(1)));
|
||||||
rtc::scoped_ptr<cricket::FakeVideoCapturer> capturer1(
|
rtc::scoped_ptr<cricket::FakeVideoCapturer> capturer1(
|
||||||
new cricket::FakeVideoCapturer);
|
CreateFakeVideoCapturer());
|
||||||
capturer1->SetScreencast(true);
|
capturer1->SetScreencast(true);
|
||||||
EXPECT_EQ(cricket::CS_RUNNING, capturer1->Start(capture_format));
|
EXPECT_EQ(cricket::CS_RUNNING, capturer1->Start(capture_format));
|
||||||
// Set up additional stream 2.
|
// Set up additional stream 2.
|
||||||
@ -1423,7 +1427,7 @@ class VideoMediaChannelTest : public testing::Test,
|
|||||||
EXPECT_TRUE(channel_->AddSendStream(
|
EXPECT_TRUE(channel_->AddSendStream(
|
||||||
cricket::StreamParams::CreateLegacy(2)));
|
cricket::StreamParams::CreateLegacy(2)));
|
||||||
rtc::scoped_ptr<cricket::FakeVideoCapturer> capturer2(
|
rtc::scoped_ptr<cricket::FakeVideoCapturer> capturer2(
|
||||||
new cricket::FakeVideoCapturer);
|
CreateFakeVideoCapturer());
|
||||||
capturer2->SetScreencast(true);
|
capturer2->SetScreencast(true);
|
||||||
EXPECT_EQ(cricket::CS_RUNNING, capturer2->Start(capture_format));
|
EXPECT_EQ(cricket::CS_RUNNING, capturer2->Start(capture_format));
|
||||||
// State for all the streams.
|
// State for all the streams.
|
||||||
@ -1481,7 +1485,7 @@ class VideoMediaChannelTest : public testing::Test,
|
|||||||
// Registering an external capturer is currently the same as screen casting
|
// Registering an external capturer is currently the same as screen casting
|
||||||
// (update the test when this changes).
|
// (update the test when this changes).
|
||||||
rtc::scoped_ptr<cricket::FakeVideoCapturer> capturer(
|
rtc::scoped_ptr<cricket::FakeVideoCapturer> capturer(
|
||||||
new cricket::FakeVideoCapturer);
|
CreateFakeVideoCapturer());
|
||||||
capturer->SetScreencast(true);
|
capturer->SetScreencast(true);
|
||||||
const std::vector<cricket::VideoFormat>* formats =
|
const std::vector<cricket::VideoFormat>* formats =
|
||||||
capturer->GetSupportedFormats();
|
capturer->GetSupportedFormats();
|
||||||
|
52
talk/media/base/videoframefactory.h
Executable file
52
talk/media/base/videoframefactory.h
Executable file
@ -0,0 +1,52 @@
|
|||||||
|
// libjingle
|
||||||
|
// Copyright 2014 Google Inc.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer.
|
||||||
|
// 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
|
// and/or other materials provided with the distribution.
|
||||||
|
// 3. The name of the author may not be used to endorse or promote products
|
||||||
|
// derived from this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||||
|
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef TALK_MEDIA_BASE_VIDEOFRAMEFACTORY_H_
|
||||||
|
#define TALK_MEDIA_BASE_VIDEOFRAMEFACTORY_H_
|
||||||
|
|
||||||
|
namespace cricket {
|
||||||
|
|
||||||
|
struct CapturedFrame;
|
||||||
|
class VideoFrame;
|
||||||
|
|
||||||
|
// Creates cricket::VideoFrames, or a subclass of cricket::VideoFrame
|
||||||
|
// depending on the subclass of VideoFrameFactory.
|
||||||
|
class VideoFrameFactory {
|
||||||
|
public:
|
||||||
|
VideoFrameFactory() {}
|
||||||
|
virtual ~VideoFrameFactory() {}
|
||||||
|
|
||||||
|
// The returned frame aliases the aliased_frame if the input color
|
||||||
|
// space allows for aliasing, otherwise a color conversion will
|
||||||
|
// occur. For safety, |input_frame| must outlive the returned
|
||||||
|
// frame. Returns NULL if conversion fails.
|
||||||
|
virtual VideoFrame* CreateAliasedFrame(
|
||||||
|
const CapturedFrame* input_frame, int width, int height) const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace cricket
|
||||||
|
|
||||||
|
#endif // TALK_MEDIA_BASE_VIDEOFRAMEFACTORY_H_
|
@ -37,6 +37,7 @@
|
|||||||
#include "webrtc/base/thread.h"
|
#include "webrtc/base/thread.h"
|
||||||
#include "webrtc/base/timeutils.h"
|
#include "webrtc/base/timeutils.h"
|
||||||
#include "talk/media/webrtc/webrtcvideoframe.h"
|
#include "talk/media/webrtc/webrtcvideoframe.h"
|
||||||
|
#include "talk/media/webrtc/webrtcvideoframefactory.h"
|
||||||
|
|
||||||
#include "webrtc/base/win32.h" // Need this to #include the impl files.
|
#include "webrtc/base/win32.h" // Need this to #include the impl files.
|
||||||
#include "webrtc/modules/video_capture/include/video_capture_factory.h"
|
#include "webrtc/modules/video_capture/include/video_capture_factory.h"
|
||||||
@ -126,12 +127,14 @@ WebRtcVideoCapturer::WebRtcVideoCapturer()
|
|||||||
: factory_(new WebRtcVcmFactory),
|
: factory_(new WebRtcVcmFactory),
|
||||||
module_(NULL),
|
module_(NULL),
|
||||||
captured_frames_(0) {
|
captured_frames_(0) {
|
||||||
|
set_frame_factory(new WebRtcVideoFrameFactory());
|
||||||
}
|
}
|
||||||
|
|
||||||
WebRtcVideoCapturer::WebRtcVideoCapturer(WebRtcVcmFactoryInterface* factory)
|
WebRtcVideoCapturer::WebRtcVideoCapturer(WebRtcVcmFactoryInterface* factory)
|
||||||
: factory_(factory),
|
: factory_(factory),
|
||||||
module_(NULL),
|
module_(NULL),
|
||||||
captured_frames_(0) {
|
captured_frames_(0) {
|
||||||
|
set_frame_factory(new WebRtcVideoFrameFactory());
|
||||||
}
|
}
|
||||||
|
|
||||||
WebRtcVideoCapturer::~WebRtcVideoCapturer() {
|
WebRtcVideoCapturer::~WebRtcVideoCapturer() {
|
||||||
|
45
talk/media/base/mutedvideocapturer.h → talk/media/webrtc/webrtcvideoframefactory.cc
Normal file → Executable file
45
talk/media/base/mutedvideocapturer.h → talk/media/webrtc/webrtcvideoframefactory.cc
Normal file → Executable file
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* libjingle
|
* libjingle
|
||||||
* Copyright 2012 Google Inc.
|
* Copyright 2014 Google Inc.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* modification, are permitted provided that the following conditions are met:
|
||||||
@ -25,36 +25,23 @@
|
|||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef TALK_MEDIA_BASE_MUTEDVIDEOCAPTURER_H_
|
#include "talk/media/webrtc/webrtcvideoframe.h"
|
||||||
#define TALK_MEDIA_BASE_MUTEDVIDEOCAPTURER_H_
|
#include "talk/media/webrtc/webrtcvideoframefactory.h"
|
||||||
|
#include "webrtc/base/logging.h"
|
||||||
#include "webrtc/base/thread.h"
|
|
||||||
#include "talk/media/base/videocapturer.h"
|
|
||||||
|
|
||||||
namespace cricket {
|
namespace cricket {
|
||||||
|
|
||||||
class MutedFramesGenerator;
|
VideoFrame* WebRtcVideoFrameFactory::CreateAliasedFrame(
|
||||||
|
const CapturedFrame* aliased_frame, int width, int height) const {
|
||||||
class MutedVideoCapturer : public VideoCapturer {
|
// TODO(pthatcher): Move Alias logic into the VideoFrameFactory and
|
||||||
public:
|
// out of the VideoFrame.
|
||||||
static const char kCapturerId[];
|
rtc::scoped_ptr<WebRtcVideoFrame> frame(new WebRtcVideoFrame());
|
||||||
|
if (!frame->Alias(aliased_frame, width, height)) {
|
||||||
MutedVideoCapturer();
|
LOG(LS_ERROR) <<
|
||||||
virtual ~MutedVideoCapturer();
|
"Failed to create WebRtcVideoFrame in CreateAliasedFrame.";
|
||||||
virtual bool GetBestCaptureFormat(const VideoFormat& desired,
|
return NULL;
|
||||||
VideoFormat* best_format);
|
}
|
||||||
virtual CaptureState Start(const VideoFormat& capture_format);
|
return frame.release();
|
||||||
virtual void Stop();
|
}
|
||||||
virtual bool IsRunning();
|
|
||||||
virtual bool IsScreencast() const { return false; }
|
|
||||||
virtual bool GetPreferredFourccs(std::vector<uint32>* fourccs);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void OnMutedFrame(VideoFrame* muted_frame);
|
|
||||||
|
|
||||||
rtc::scoped_ptr<MutedFramesGenerator> frame_generator_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace cricket
|
} // namespace cricket
|
||||||
|
|
||||||
#endif // TALK_MEDIA_BASE_MUTEDVIDEOCAPTURER_H_
|
|
45
talk/media/webrtc/webrtcvideoframefactory.h
Executable file
45
talk/media/webrtc/webrtcvideoframefactory.h
Executable file
@ -0,0 +1,45 @@
|
|||||||
|
// libjingle
|
||||||
|
// Copyright 2014 Google Inc.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer.
|
||||||
|
// 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
|
// and/or other materials provided with the distribution.
|
||||||
|
// 3. The name of the author may not be used to endorse or promote products
|
||||||
|
// derived from this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||||
|
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||||
|
// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef TALK_MEDIA_WEBRTC_WEBRTCVIDEOFRAMEFACTORY_H_
|
||||||
|
#define TALK_MEDIA_WEBRTC_WEBRTCVIDEOFRAMEFACTORY_H_
|
||||||
|
|
||||||
|
#include "talk/media/base/videoframefactory.h"
|
||||||
|
|
||||||
|
namespace cricket {
|
||||||
|
|
||||||
|
struct CapturedFrame;
|
||||||
|
|
||||||
|
// Creates instances of cricket::WebRtcVideoFrame.
|
||||||
|
class WebRtcVideoFrameFactory : public VideoFrameFactory {
|
||||||
|
public:
|
||||||
|
virtual VideoFrame* CreateAliasedFrame(
|
||||||
|
const CapturedFrame* aliased_frame, int width, int height) const OVERRIDE;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace cricket
|
||||||
|
|
||||||
|
#endif // TALK_MEDIA_WEBRTC_WEBRTCVIDEOFRAMEFACTORY_H_
|
Loading…
x
Reference in New Issue
Block a user