diff --git a/talk/app/webrtc/objc/RTCAVFoundationVideoSource.mm b/talk/app/webrtc/objc/RTCAVFoundationVideoSource.mm index 660bb4d6cb..8dc0fe900c 100644 --- a/talk/app/webrtc/objc/RTCAVFoundationVideoSource.mm +++ b/talk/app/webrtc/objc/RTCAVFoundationVideoSource.mm @@ -34,15 +34,20 @@ #include -@implementation RTCAVFoundationVideoSource +@implementation RTCAVFoundationVideoSource { + webrtc::AVFoundationVideoCapturer *_capturer; +} - (instancetype)initWithFactory:(RTCPeerConnectionFactory*)factory constraints:(RTCMediaConstraints*)constraints { NSParameterAssert(factory); - std::unique_ptr capturer; - capturer.reset(new webrtc::AVFoundationVideoCapturer()); + // We pass ownership of the capturer to the source, but since we own + // the source, it should be ok to keep a raw pointer to the + // capturer. + _capturer = new webrtc::AVFoundationVideoCapturer(); rtc::scoped_refptr source = - factory.nativeFactory->CreateVideoSource(capturer.release(), constraints.constraints); + factory.nativeFactory->CreateVideoSource(_capturer, + constraints.constraints); return [super initWithMediaSource:source]; } @@ -63,12 +68,7 @@ } - (webrtc::AVFoundationVideoCapturer*)capturer { - cricket::VideoCapturer* capturer = self.videoSource->GetVideoCapturer(); - // This should be safe because no one should have changed the underlying video - // source. - webrtc::AVFoundationVideoCapturer* foundationCapturer = - static_cast(capturer); - return foundationCapturer; + return _capturer; } @end diff --git a/webrtc/api/mediastreaminterface.h b/webrtc/api/mediastreaminterface.h index 57c0776a32..7f56325024 100644 --- a/webrtc/api/mediastreaminterface.h +++ b/webrtc/api/mediastreaminterface.h @@ -31,7 +31,6 @@ namespace cricket { class AudioRenderer; -class VideoCapturer; class VideoRenderer; class VideoFrame; @@ -113,14 +112,6 @@ class VideoTrackSourceInterface int input_width; int input_height; }; - // Get access to the source implementation of cricket::VideoCapturer. - // This can be used for receiving frames and state notifications. - // But it should not be used for starting or stopping capturing. - // TODO(perkj): We are currently trying to replace all internal use of - // cricket::VideoCapturer with rtc::VideoSourceInterface. Once that - // refactoring is done, - // remove this method. - virtual cricket::VideoCapturer* GetVideoCapturer() = 0; virtual void Stop() = 0; virtual void Restart() = 0; diff --git a/webrtc/api/mediastreamprovider.h b/webrtc/api/mediastreamprovider.h index 6814c416e2..f3bb3f49f3 100644 --- a/webrtc/api/mediastreamprovider.h +++ b/webrtc/api/mediastreamprovider.h @@ -15,13 +15,12 @@ #include "webrtc/base/basictypes.h" #include "webrtc/base/scoped_ptr.h" #include "webrtc/media/base/videosinkinterface.h" +#include "webrtc/media/base/videosourceinterface.h" namespace cricket { class AudioSource; -class VideoCapturer; class VideoFrame; -class VideoRenderer; struct AudioOptions; struct VideoOptions; @@ -75,8 +74,9 @@ class AudioProviderInterface { // of a video track connected to a certain PeerConnection. class VideoProviderInterface { public: - virtual bool SetCaptureDevice(uint32_t ssrc, - cricket::VideoCapturer* camera) = 0; + virtual bool SetSource( + uint32_t ssrc, + rtc::VideoSourceInterface* source) = 0; // Enable/disable the video playout of a remote video track with |ssrc|. virtual void SetVideoPlayout( uint32_t ssrc, diff --git a/webrtc/api/objc/RTCAVFoundationVideoSource.mm b/webrtc/api/objc/RTCAVFoundationVideoSource.mm index 1005c7dfa1..94774f7039 100644 --- a/webrtc/api/objc/RTCAVFoundationVideoSource.mm +++ b/webrtc/api/objc/RTCAVFoundationVideoSource.mm @@ -14,16 +14,21 @@ #import "webrtc/api/objc/RTCPeerConnectionFactory+Private.h" #import "webrtc/api/objc/RTCVideoSource+Private.h" -@implementation RTCAVFoundationVideoSource +@implementation RTCAVFoundationVideoSource { + webrtc::AVFoundationVideoCapturer *_capturer; +} - (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory constraints:(RTCMediaConstraints *)constraints { NSParameterAssert(factory); - rtc::scoped_ptr capturer; - capturer.reset(new webrtc::AVFoundationVideoCapturer()); + // We pass ownership of the capturer to the source, but since we own + // the source, it should be ok to keep a raw pointer to the + // capturer. + _capturer = new webrtc::AVFoundationVideoCapturer(); rtc::scoped_refptr source = factory.nativeFactory->CreateVideoSource( - capturer.release(), constraints.nativeConstraints.get()); + _capturer, constraints.nativeConstraints.get()); + return [super initWithNativeVideoSource:source]; } @@ -44,12 +49,7 @@ } - (webrtc::AVFoundationVideoCapturer *)capturer { - cricket::VideoCapturer *capturer = self.nativeVideoSource->GetVideoCapturer(); - // This should be safe because no one should have changed the underlying video - // source. - webrtc::AVFoundationVideoCapturer *foundationCapturer = - static_cast(capturer); - return foundationCapturer; + return _capturer; } @end diff --git a/webrtc/api/rtpsender.cc b/webrtc/api/rtpsender.cc index 94cea6c2c9..214b4a39ec 100644 --- a/webrtc/api/rtpsender.cc +++ b/webrtc/api/rtpsender.cc @@ -276,18 +276,16 @@ bool VideoRtpSender::SetTrack(MediaStreamTrackInterface* track) { // Update video provider. if (can_send_track()) { - VideoTrackSourceInterface* source = track_->GetSource(); // TODO(deadbeef): If SetTrack is called with a disabled track, and the // previous track was enabled, this could cause a frame from the new track - // to slip out. Really, what we need is for SetCaptureDevice and - // SetVideoSend + // to slip out. Really, what we need is for SetSource and SetVideoSend // to be combined into one atomic operation, all the way down to // WebRtcVideoSendStream. - provider_->SetCaptureDevice(ssrc_, - source ? source->GetVideoCapturer() : nullptr); + + provider_->SetSource(ssrc_, track_); SetVideoSend(); } else if (prev_can_send_track) { - provider_->SetCaptureDevice(ssrc_, nullptr); + provider_->SetSource(ssrc_, nullptr); provider_->SetVideoSend(ssrc_, false, nullptr); } return true; @@ -299,14 +297,12 @@ void VideoRtpSender::SetSsrc(uint32_t ssrc) { } // If we are already sending with a particular SSRC, stop sending. if (can_send_track()) { - provider_->SetCaptureDevice(ssrc_, nullptr); + provider_->SetSource(ssrc_, nullptr); provider_->SetVideoSend(ssrc_, false, nullptr); } ssrc_ = ssrc; if (can_send_track()) { - VideoTrackSourceInterface* source = track_->GetSource(); - provider_->SetCaptureDevice(ssrc_, - source ? source->GetVideoCapturer() : nullptr); + provider_->SetSource(ssrc_, track_); SetVideoSend(); } } @@ -320,7 +316,7 @@ void VideoRtpSender::Stop() { track_->UnregisterObserver(this); } if (can_send_track()) { - provider_->SetCaptureDevice(ssrc_, nullptr); + provider_->SetSource(ssrc_, nullptr); provider_->SetVideoSend(ssrc_, false, nullptr); } stopped_ = true; diff --git a/webrtc/api/rtpsenderreceiver_unittest.cc b/webrtc/api/rtpsenderreceiver_unittest.cc index 7f32f29bc4..188264e7b2 100644 --- a/webrtc/api/rtpsenderreceiver_unittest.cc +++ b/webrtc/api/rtpsenderreceiver_unittest.cc @@ -70,8 +70,9 @@ class MockAudioProvider : public AudioProviderInterface { class MockVideoProvider : public VideoProviderInterface { public: virtual ~MockVideoProvider() {} - MOCK_METHOD2(SetCaptureDevice, - bool(uint32_t ssrc, cricket::VideoCapturer* camera)); + MOCK_METHOD2(SetSource, + bool(uint32_t ssrc, + rtc::VideoSourceInterface* source)); MOCK_METHOD3(SetVideoPlayout, void(uint32_t ssrc, bool enable, @@ -111,9 +112,7 @@ class RtpSenderReceiverTest : public testing::Test { void CreateVideoRtpSender() { AddVideoTrack(); - EXPECT_CALL(video_provider_, - SetCaptureDevice( - kVideoSsrc, video_track_->GetSource()->GetVideoCapturer())); + EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, video_track_.get())); EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _)); video_rtp_sender_ = new VideoRtpSender(stream_->GetVideoTracks()[0], stream_->label(), &video_provider_); @@ -127,7 +126,7 @@ class RtpSenderReceiverTest : public testing::Test { } void DestroyVideoRtpSender() { - EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, NULL)).Times(1); + EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, NULL)).Times(1); EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1); video_rtp_sender_ = nullptr; } @@ -345,14 +344,12 @@ TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) { rtc::scoped_refptr sender = new VideoRtpSender(&video_provider_); sender->SetSsrc(kVideoSsrc); - EXPECT_CALL(video_provider_, - SetCaptureDevice(kVideoSsrc, - video_track_->GetSource()->GetVideoCapturer())); + EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, video_track_.get())); EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _)); sender->SetTrack(video_track_); // Calls expected from destructor. - EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, nullptr)).Times(1); + EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, nullptr)).Times(1); EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1); } @@ -363,14 +360,12 @@ TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) { rtc::scoped_refptr sender = new VideoRtpSender(&video_provider_); sender->SetTrack(video_track_); - EXPECT_CALL(video_provider_, - SetCaptureDevice(kVideoSsrc, - video_track_->GetSource()->GetVideoCapturer())); + EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, video_track_.get())); EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _)); sender->SetSsrc(kVideoSsrc); // Calls expected from destructor. - EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, nullptr)).Times(1); + EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, nullptr)).Times(1); EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1); } @@ -396,21 +391,19 @@ TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) { // set to 0. TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) { AddVideoTrack(); - EXPECT_CALL(video_provider_, - SetCaptureDevice(kVideoSsrc, - video_track_->GetSource()->GetVideoCapturer())); + EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, video_track_.get())); EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _)); rtc::scoped_refptr sender = new VideoRtpSender(video_track_, kStreamLabel1, &video_provider_); sender->SetSsrc(kVideoSsrc); - EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, nullptr)).Times(1); + EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, nullptr)).Times(1); EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1); sender->SetSsrc(0); // Make sure it's SetSsrc that called methods on the provider, and not the // destructor. - EXPECT_CALL(video_provider_, SetCaptureDevice(_, _)).Times(0); + EXPECT_CALL(video_provider_, SetSource(_, _)).Times(0); EXPECT_CALL(video_provider_, SetVideoSend(_, _, _)).Times(0); } @@ -432,21 +425,19 @@ TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) { TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) { AddVideoTrack(); - EXPECT_CALL(video_provider_, - SetCaptureDevice(kVideoSsrc, - video_track_->GetSource()->GetVideoCapturer())); + EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, video_track_.get())); EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _)); rtc::scoped_refptr sender = new VideoRtpSender(video_track_, kStreamLabel1, &video_provider_); sender->SetSsrc(kVideoSsrc); - EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, nullptr)).Times(1); + EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, nullptr)).Times(1); EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1); EXPECT_TRUE(sender->SetTrack(nullptr)); // Make sure it's SetTrack that called methods on the provider, and not the // destructor. - EXPECT_CALL(video_provider_, SetCaptureDevice(_, _)).Times(0); + EXPECT_CALL(video_provider_, SetSource(_, _)).Times(0); EXPECT_CALL(video_provider_, SetVideoSend(_, _, _)).Times(0); } @@ -469,24 +460,20 @@ TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) { TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) { AddVideoTrack(); - EXPECT_CALL(video_provider_, - SetCaptureDevice(kVideoSsrc, - video_track_->GetSource()->GetVideoCapturer())); + EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, video_track_.get())); EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _)); rtc::scoped_refptr sender = new VideoRtpSender(video_track_, kStreamLabel1, &video_provider_); sender->SetSsrc(kVideoSsrc); - EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, nullptr)).Times(1); + EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, nullptr)).Times(1); EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1); - EXPECT_CALL(video_provider_, - SetCaptureDevice(kVideoSsrc2, - video_track_->GetSource()->GetVideoCapturer())); + EXPECT_CALL(video_provider_, SetSource(kVideoSsrc2, video_track_.get())); EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc2, true, _)); sender->SetSsrc(kVideoSsrc2); // Calls expected from destructor. - EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc2, nullptr)).Times(1); + EXPECT_CALL(video_provider_, SetSource(kVideoSsrc2, nullptr)).Times(1); EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc2, false, _)).Times(1); } diff --git a/webrtc/api/videocapturertracksource.h b/webrtc/api/videocapturertracksource.h index 96f8bffc23..2eb7b50741 100644 --- a/webrtc/api/videocapturertracksource.h +++ b/webrtc/api/videocapturertracksource.h @@ -47,10 +47,6 @@ class VideoCapturerTrackSource : public VideoTrackSource, cricket::VideoCapturer* capturer, bool remote); - cricket::VideoCapturer* GetVideoCapturer() override { - return video_capturer_.get(); - } - bool is_screencast() const override { return video_capturer_->IsScreencast(); } diff --git a/webrtc/api/videocapturertracksource_unittest.cc b/webrtc/api/videocapturertracksource_unittest.cc index 39252934eb..6b0d07b0e0 100644 --- a/webrtc/api/videocapturertracksource_unittest.cc +++ b/webrtc/api/videocapturertracksource_unittest.cc @@ -126,7 +126,6 @@ class VideoCapturerTrackSourceTest : public testing::Test { constraints, false); ASSERT_TRUE(source_.get() != NULL); - EXPECT_EQ(capturer_, source_->GetVideoCapturer()); state_observer_.reset(new StateObserver(source_)); source_->RegisterObserver(state_observer_.get()); diff --git a/webrtc/api/videosourceproxy.h b/webrtc/api/videosourceproxy.h index 4d687d4625..0a34967f13 100644 --- a/webrtc/api/videosourceproxy.h +++ b/webrtc/api/videosourceproxy.h @@ -23,7 +23,6 @@ namespace webrtc { BEGIN_WORKER_PROXY_MAP(VideoTrackSource) PROXY_CONSTMETHOD0(SourceState, state) PROXY_CONSTMETHOD0(bool, remote) - PROXY_METHOD0(cricket::VideoCapturer*, GetVideoCapturer) PROXY_METHOD0(void, Stop) PROXY_METHOD0(void, Restart) PROXY_CONSTMETHOD0(bool, is_screencast) diff --git a/webrtc/api/videotracksource.h b/webrtc/api/videotracksource.h index 3d8d502c8f..7100612fcd 100644 --- a/webrtc/api/videotracksource.h +++ b/webrtc/api/videotracksource.h @@ -46,8 +46,6 @@ class VideoTrackSource : public Notifier { const rtc::VideoSinkWants& wants) override; void RemoveSink(rtc::VideoSinkInterface* sink) override; - cricket::VideoCapturer* GetVideoCapturer() override { return nullptr; } - private: rtc::ThreadChecker worker_thread_checker_; rtc::VideoSourceInterface* source_; diff --git a/webrtc/api/webrtcsession.cc b/webrtc/api/webrtcsession.cc index f546285574..f51d4cd479 100644 --- a/webrtc/api/webrtcsession.cc +++ b/webrtc/api/webrtcsession.cc @@ -1261,8 +1261,9 @@ bool WebRtcSession::SetAudioRtpParameters(uint32_t ssrc, return voice_channel_->SetRtpParameters(ssrc, parameters); } -bool WebRtcSession::SetCaptureDevice(uint32_t ssrc, - cricket::VideoCapturer* camera) { +bool WebRtcSession::SetSource( + uint32_t ssrc, + rtc::VideoSourceInterface* source) { ASSERT(signaling_thread()->IsCurrent()); if (!video_channel_) { @@ -1271,13 +1272,7 @@ bool WebRtcSession::SetCaptureDevice(uint32_t ssrc, LOG(LS_WARNING) << "Video not used in this call."; return false; } - if (!video_channel_->SetCapturer(ssrc, camera)) { - // Allow that SetCapturer fail if |camera| is NULL but assert otherwise. - // This in the normal case when the underlying media channel has already - // been deleted. - ASSERT(camera == NULL); - return false; - } + video_channel_->SetSource(ssrc, source); return true; } diff --git a/webrtc/api/webrtcsession.h b/webrtc/api/webrtcsession.h index 01ec526501..752b20f4b4 100644 --- a/webrtc/api/webrtcsession.h +++ b/webrtc/api/webrtcsession.h @@ -34,7 +34,6 @@ namespace cricket { class ChannelManager; class DataChannel; class StatsReport; -class VideoCapturer; class VideoChannel; class VoiceChannel; @@ -250,7 +249,9 @@ class WebRtcSession : public AudioProviderInterface, const RtpParameters& parameters) override; // Implements VideoMediaProviderInterface. - bool SetCaptureDevice(uint32_t ssrc, cricket::VideoCapturer* camera) override; + bool SetSource( + uint32_t ssrc, + rtc::VideoSourceInterface* source) override; void SetVideoPlayout( uint32_t ssrc, bool enable, diff --git a/webrtc/api/webrtcsession_unittest.cc b/webrtc/api/webrtcsession_unittest.cc index f4b41d355a..28f93dfd71 100644 --- a/webrtc/api/webrtcsession_unittest.cc +++ b/webrtc/api/webrtcsession_unittest.cc @@ -246,7 +246,7 @@ class WebRtcSessionForTest : public webrtc::WebRtcSession { using webrtc::WebRtcSession::SetAudioPlayout; using webrtc::WebRtcSession::SetAudioSend; - using webrtc::WebRtcSession::SetCaptureDevice; + using webrtc::WebRtcSession::SetSource; using webrtc::WebRtcSession::SetVideoPlayout; using webrtc::WebRtcSession::SetVideoSend; diff --git a/webrtc/media/base/fakemediaengine.h b/webrtc/media/base/fakemediaengine.h index d6d653991c..64f4adca50 100644 --- a/webrtc/media/base/fakemediaengine.h +++ b/webrtc/media/base/fakemediaengine.h @@ -527,12 +527,14 @@ class FakeVideoMediaChannel : public RtpHelper { } return true; } - virtual bool SetCapturer(uint32_t ssrc, VideoCapturer* capturer) { - capturers_[ssrc] = capturer; - return true; + void SetSource( + uint32_t ssrc, + rtc::VideoSourceInterface* source) override { + sources_[ssrc] = source; } - bool HasCapturer(uint32_t ssrc) const { - return capturers_.find(ssrc) != capturers_.end(); + + bool HasSource(uint32_t ssrc) const { + return sources_.find(ssrc) != sources_.end(); } virtual bool AddRecvStream(const StreamParams& sp) { if (!RtpHelper::AddRecvStream(sp)) @@ -580,7 +582,7 @@ class FakeVideoMediaChannel : public RtpHelper { std::vector recv_codecs_; std::vector send_codecs_; std::map*> sinks_; - std::map capturers_; + std::map*> sources_; VideoOptions options_; int max_bps_; }; diff --git a/webrtc/media/base/mediachannel.h b/webrtc/media/base/mediachannel.h index 4166a60dd3..68dc8f494f 100644 --- a/webrtc/media/base/mediachannel.h +++ b/webrtc/media/base/mediachannel.h @@ -29,6 +29,7 @@ #include "webrtc/media/base/mediaconstants.h" #include "webrtc/media/base/streamparams.h" #include "webrtc/media/base/videosinkinterface.h" +#include "webrtc/media/base/videosourceinterface.h" // TODO(juberti): re-evaluate this include #include "webrtc/pc/audiomonitor.h" @@ -998,9 +999,10 @@ class VideoMediaChannel : public MediaChannel { // If SSRC is 0, the renderer is used for the 'default' stream. virtual bool SetSink(uint32_t ssrc, rtc::VideoSinkInterface* sink) = 0; - // If |ssrc| is 0, replace the default capturer (engine capturer) with - // |capturer|. If |ssrc| is non zero create a new stream with |ssrc| as SSRC. - virtual bool SetCapturer(uint32_t ssrc, VideoCapturer* capturer) = 0; + // Register a source. The |ssrc| must correspond to a registered send stream. + virtual void SetSource( + uint32_t ssrc, + rtc::VideoSourceInterface* source) = 0; // Gets quality stats for the channel. virtual bool GetStats(VideoMediaInfo* info) = 0; }; diff --git a/webrtc/media/base/videoengine_unittest.h b/webrtc/media/base/videoengine_unittest.h index 01a4f76ca7..491149c7e2 100644 --- a/webrtc/media/base/videoengine_unittest.h +++ b/webrtc/media/base/videoengine_unittest.h @@ -74,27 +74,6 @@ inline int TimeBetweenSend(const cricket::VideoCodec& codec) { rtc::kNumNanosecsPerMillisec); } -// Fake video engine that makes it possible to test enabling and disabling -// capturer (checking that the engine state is updated and that the capturer -// is indeed capturing) without having to create a channel. It also makes it -// possible to test that the media processors are indeed being called when -// registered. -template -class VideoEngineOverride : public T { - public: - VideoEngineOverride() : T() { - } - virtual ~VideoEngineOverride() { - } - bool is_camera_on() const { return T::GetVideoCapturer()->IsRunning(); } - - void TriggerMediaFrame(uint32_t ssrc, - cricket::VideoFrame* frame, - bool* drop_frame) { - T::SignalMediaFrame(ssrc, frame, drop_frame); - } -}; - template class VideoMediaChannelTest : public testing::Test, public sigslot::has_slots<> { @@ -125,7 +104,7 @@ class VideoMediaChannelTest : public testing::Test, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420); EXPECT_EQ(cricket::CS_RUNNING, video_capturer_->Start(format)); - EXPECT_TRUE(channel_->SetCapturer(kSsrc, video_capturer_.get())); + channel_->SetSource(kSsrc, video_capturer_.get()); } virtual cricket::FakeVideoCapturer* CreateFakeVideoCapturer() { @@ -162,7 +141,7 @@ class VideoMediaChannelTest : public testing::Test, cricket::FOURCC_I420); EXPECT_EQ(cricket::CS_RUNNING, video_capturer_2_->Start(format)); - EXPECT_TRUE(channel_->SetCapturer(kSsrc + 2, video_capturer_2_.get())); + channel_->SetSource(kSsrc + 2, video_capturer_2_.get()); } virtual void TearDown() { channel_.reset(); @@ -373,7 +352,7 @@ class VideoMediaChannelTest : public testing::Test, // Test that SetSend works. void SetSend() { EXPECT_FALSE(channel_->sending()); - EXPECT_TRUE(channel_->SetCapturer(kSsrc, video_capturer_.get())); + channel_->SetSource(kSsrc, video_capturer_.get()); EXPECT_TRUE(SetOneCodec(DefaultCodec())); EXPECT_FALSE(channel_->sending()); EXPECT_TRUE(SetSend(true)); @@ -567,7 +546,7 @@ class VideoMediaChannelTest : public testing::Test, EXPECT_EQ(cricket::CS_RUNNING, capturer->Start(format)); EXPECT_TRUE(channel_->AddSendStream( cricket::StreamParams::CreateLegacy(5678))); - EXPECT_TRUE(channel_->SetCapturer(5678, capturer.get())); + channel_->SetSource(5678, capturer.get()); EXPECT_TRUE(channel_->AddRecvStream( cricket::StreamParams::CreateLegacy(5678))); EXPECT_TRUE(channel_->SetSink(5678, &renderer2)); @@ -603,7 +582,7 @@ class VideoMediaChannelTest : public testing::Test, EXPECT_EQ(kTestWidth, info.senders[1].send_frame_width); EXPECT_EQ(kTestHeight, info.senders[1].send_frame_height); // The capturer must be unregistered here as it runs out of it's scope next. - EXPECT_TRUE(channel_->SetCapturer(5678, NULL)); + channel_->SetSource(5678, NULL); } // Test that we can set the bandwidth. @@ -640,7 +619,7 @@ class VideoMediaChannelTest : public testing::Test, EXPECT_TRUE(SetDefaultCodec()); EXPECT_TRUE(channel_->AddSendStream( cricket::StreamParams::CreateLegacy(999))); - EXPECT_TRUE(channel_->SetCapturer(999u, video_capturer_.get())); + channel_->SetSource(999u, video_capturer_.get()); EXPECT_TRUE(SetSend(true)); EXPECT_TRUE(WaitAndSendFrame(0)); EXPECT_TRUE_WAIT(NumRtpPackets() > 0, kTimeout); @@ -706,7 +685,7 @@ class VideoMediaChannelTest : public testing::Test, EXPECT_TRUE(channel_->AddSendStream( cricket::StreamParams::CreateLegacy(789u))); - EXPECT_TRUE(channel_->SetCapturer(789u, video_capturer_.get())); + channel_->SetSource(789u, video_capturer_.get()); EXPECT_EQ(rtp_packets, NumRtpPackets()); // Wait 30ms to guarantee the engine does not drop the frame. EXPECT_TRUE(WaitAndSendFrame(30)); @@ -789,7 +768,7 @@ class VideoMediaChannelTest : public testing::Test, int captured_frames = 1; for (int iterations = 0; iterations < 2; ++iterations) { - EXPECT_TRUE(channel_->SetCapturer(kSsrc, capturer.get())); + channel_->SetSource(kSsrc, capturer.get()); rtc::Thread::Current()->ProcessMessages(time_between_send); EXPECT_TRUE(capturer->CaptureCustomFrame(format.width, format.height, cricket::FOURCC_I420)); @@ -804,7 +783,7 @@ class VideoMediaChannelTest : public testing::Test, EXPECT_EQ(format.height, renderer_.height()); captured_frames = renderer_.num_rendered_frames() + 1; EXPECT_FALSE(renderer_.black_frame()); - EXPECT_TRUE(channel_->SetCapturer(kSsrc, NULL)); + channel_->SetSource(kSsrc, NULL); // Make sure a black frame is generated within the specified timeout. // The black frame should be the resolution of the previous frame to // prevent expensive encoder reconfigurations. @@ -839,13 +818,12 @@ class VideoMediaChannelTest : public testing::Test, // tightly. rtc::Thread::Current()->ProcessMessages(30); // Remove the capturer. - EXPECT_TRUE(channel_->SetCapturer(kSsrc, NULL)); + channel_->SetSource(kSsrc, NULL); // Wait for one black frame for removing the capturer. EXPECT_FRAME_WAIT(2, 640, 400, kTimeout); - // No capturer was added, so this RemoveCapturer should - // fail. - EXPECT_FALSE(channel_->SetCapturer(kSsrc, NULL)); + // No capturer was added, so this SetSource should be a NOP. + channel_->SetSource(kSsrc, NULL); rtc::Thread::Current()->ProcessMessages(300); // Verify no more frames were sent. EXPECT_EQ(2, renderer_.num_rendered_frames()); @@ -887,11 +865,11 @@ class VideoMediaChannelTest : public testing::Test, EXPECT_EQ(cricket::CS_RUNNING, capturer2->Start(capture_format)); // State for all the streams. EXPECT_TRUE(SetOneCodec(DefaultCodec())); - // A limitation in the lmi implementation requires that SetCapturer() is + // A limitation in the lmi implementation requires that SetSource() is // called after SetOneCodec(). // TODO(hellner): this seems like an unnecessary constraint, fix it. - EXPECT_TRUE(channel_->SetCapturer(1, capturer1.get())); - EXPECT_TRUE(channel_->SetCapturer(2, capturer2.get())); + channel_->SetSource(1, capturer1.get()); + channel_->SetSource(2, capturer2.get()); EXPECT_TRUE(SetSend(true)); // Test capturer associated with engine. const int kTestWidth = 160; @@ -906,13 +884,13 @@ class VideoMediaChannelTest : public testing::Test, EXPECT_FRAME_ON_RENDERER_WAIT( renderer2, 1, kTestWidth, kTestHeight, kTimeout); // Successfully remove the capturer. - EXPECT_TRUE(channel_->SetCapturer(kSsrc, NULL)); + channel_->SetSource(kSsrc, NULL); // Fail to re-remove the capturer. - EXPECT_FALSE(channel_->SetCapturer(kSsrc, NULL)); + channel_->SetSource(kSsrc, NULL); // The capturers must be unregistered here as it runs out of it's scope // next. - EXPECT_TRUE(channel_->SetCapturer(1, NULL)); - EXPECT_TRUE(channel_->SetCapturer(2, NULL)); + channel_->SetSource(1, NULL); + channel_->SetSource(2, NULL); } void HighAspectHighHeightCapturer() { @@ -945,13 +923,13 @@ class VideoMediaChannelTest : public testing::Test, EXPECT_EQ(cricket::CS_RUNNING, capturer->Start(capture_format)); // Capture frame to not get same frame timestamps as previous capturer. capturer->CaptureFrame(); - EXPECT_TRUE(channel_->SetCapturer(kSsrc, capturer.get())); + channel_->SetSource(kSsrc, capturer.get()); EXPECT_TRUE(rtc::Thread::Current()->ProcessMessages(30)); EXPECT_TRUE(capturer->CaptureCustomFrame(kWidth, kHeight, cricket::FOURCC_ARGB)); EXPECT_GT_FRAME_ON_RENDERER_WAIT( renderer, 2, kScaledWidth, kScaledHeight, kTimeout); - EXPECT_TRUE(channel_->SetCapturer(kSsrc, NULL)); + channel_->SetSource(kSsrc, NULL); } // Tests that we can adapt video resolution with 16:10 aspect ratio properly. @@ -1062,57 +1040,6 @@ class VideoMediaChannelTest : public testing::Test, EXPECT_FRAME_WAIT(2, codec.width / 2, codec.height / 2, kTimeout); } - // Tests that we can mute and unmute the channel properly. - void MuteStream() { - EXPECT_TRUE(SetDefaultCodec()); - cricket::FakeVideoCapturer video_capturer; - video_capturer.Start( - cricket::VideoFormat( - 640, 480, - cricket::VideoFormat::FpsToInterval(30), - cricket::FOURCC_I420)); - EXPECT_TRUE(channel_->SetCapturer(kSsrc, &video_capturer)); - EXPECT_TRUE(SetSend(true)); - EXPECT_TRUE(channel_->SetSink(kDefaultReceiveSsrc, &renderer_)); - EXPECT_EQ(0, renderer_.num_rendered_frames()); - // Mute the channel and expect black output frame. - int frame_count = 0; - EXPECT_TRUE(channel_->SetVideoSend(kSsrc, false, nullptr)); - EXPECT_TRUE(video_capturer.CaptureFrame()); - ++frame_count; - EXPECT_EQ_WAIT(frame_count, renderer_.num_rendered_frames(), kTimeout); - EXPECT_TRUE(renderer_.black_frame()); - // Unmute the channel and expect non-black output frame. - EXPECT_TRUE(channel_->SetVideoSend(kSsrc, true, nullptr)); - EXPECT_TRUE(rtc::Thread::Current()->ProcessMessages(30)); - EXPECT_TRUE(video_capturer.CaptureFrame()); - ++frame_count; - EXPECT_EQ_WAIT(frame_count, renderer_.num_rendered_frames(), kTimeout); - EXPECT_FALSE(renderer_.black_frame()); - // Test that we can also Mute using the correct send stream SSRC. - EXPECT_TRUE(channel_->SetVideoSend(kSsrc, false, nullptr)); - EXPECT_TRUE(rtc::Thread::Current()->ProcessMessages(30)); - EXPECT_TRUE(video_capturer.CaptureFrame()); - ++frame_count; - EXPECT_EQ_WAIT(frame_count, renderer_.num_rendered_frames(), kTimeout); - EXPECT_TRUE(renderer_.black_frame()); - EXPECT_TRUE(channel_->SetVideoSend(kSsrc, true, nullptr)); - EXPECT_TRUE(rtc::Thread::Current()->ProcessMessages(30)); - EXPECT_TRUE(video_capturer.CaptureFrame()); - ++frame_count; - EXPECT_EQ_WAIT(frame_count, renderer_.num_rendered_frames(), kTimeout); - EXPECT_FALSE(renderer_.black_frame()); - // Test that muting an existing stream succeeds even if it's muted. - EXPECT_TRUE(channel_->SetVideoSend(kSsrc, false, nullptr)); - EXPECT_TRUE(channel_->SetVideoSend(kSsrc, false, nullptr)); - // Test that unmuting an existing stream succeeds even if it's not muted. - EXPECT_TRUE(channel_->SetVideoSend(kSsrc, true, nullptr)); - EXPECT_TRUE(channel_->SetVideoSend(kSsrc, true, nullptr)); - // Test that muting an invalid stream fails. - EXPECT_FALSE(channel_->SetVideoSend(kSsrc+1, false, nullptr)); - EXPECT_TRUE(channel_->SetCapturer(kSsrc, NULL)); - } - // Test that multiple send streams can be created and deleted properly. void MultipleSendStreams() { // Remove stream added in Setup. I.e. remove stream corresponding to default @@ -1144,7 +1071,7 @@ class VideoMediaChannelTest : public testing::Test, } const std::unique_ptr call_; - VideoEngineOverride engine_; + E engine_; std::unique_ptr video_capturer_; std::unique_ptr video_capturer_2_; std::unique_ptr channel_; diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc index 969c6e5b57..fc87607d20 100644 --- a/webrtc/media/engine/webrtcvideoengine2.cc +++ b/webrtc/media/engine/webrtcvideoengine2.cc @@ -21,7 +21,6 @@ #include "webrtc/base/timeutils.h" #include "webrtc/base/trace_event.h" #include "webrtc/call.h" -#include "webrtc/media/base/videocapturer.h" #include "webrtc/media/engine/constants.h" #include "webrtc/media/engine/simulcast.h" #include "webrtc/media/engine/webrtcmediaengine.h" @@ -1001,6 +1000,9 @@ bool WebRtcVideoChannel2::SetSend(bool send) { return true; } +// TODO(nisse): The enable argument was used for mute logic which has +// been moved to VideoBroadcaster. So delete this method, and use +// SetOptions instead. bool WebRtcVideoChannel2::SetVideoSend(uint32_t ssrc, bool enable, const VideoOptions* options) { TRACE_EVENT0("webrtc", "SetVideoSend"); @@ -1008,11 +1010,6 @@ bool WebRtcVideoChannel2::SetVideoSend(uint32_t ssrc, bool enable, << "options: " << (options ? options->ToString() : "nullptr") << ")."; - // TODO(solenberg): The state change should be fully rolled back if any one of - // these calls fail. - if (!MuteStream(ssrc, !enable)) { - return false; - } if (enable && options) { SetOptions(ssrc, *options); } @@ -1315,22 +1312,21 @@ void WebRtcVideoChannel2::FillBandwidthEstimationStats( video_media_info->bw_estimations.push_back(bwe_info); } -bool WebRtcVideoChannel2::SetCapturer(uint32_t ssrc, VideoCapturer* capturer) { - LOG(LS_INFO) << "SetCapturer: " << ssrc << " -> " - << (capturer != NULL ? "(capturer)" : "NULL"); +void WebRtcVideoChannel2::SetSource( + uint32_t ssrc, + rtc::VideoSourceInterface* source) { + LOG(LS_INFO) << "SetSource: " << ssrc << " -> " + << (source ? "(source)" : "NULL"); RTC_DCHECK(ssrc != 0); - { - rtc::CritScope stream_lock(&stream_crit_); - const auto& kv = send_streams_.find(ssrc); - if (kv == send_streams_.end()) { - LOG(LS_ERROR) << "No sending stream on ssrc " << ssrc; - return false; - } - if (!kv->second->SetCapturer(capturer)) { - return false; - } + + rtc::CritScope stream_lock(&stream_crit_); + const auto& kv = send_streams_.find(ssrc); + if (kv == send_streams_.end()) { + // Allow unknown ssrc only if source is null. + RTC_CHECK(source == nullptr); + } else { + kv->second->SetSource(source); } - return true; } void WebRtcVideoChannel2::OnPacketReceived( @@ -1420,21 +1416,6 @@ void WebRtcVideoChannel2::OnNetworkRouteChanged( // call_->OnNetworkRouteChanged(transport_name, network_route); } -bool WebRtcVideoChannel2::MuteStream(uint32_t ssrc, bool mute) { - LOG(LS_VERBOSE) << "MuteStream: " << ssrc << " -> " - << (mute ? "mute" : "unmute"); - RTC_DCHECK(ssrc != 0); - rtc::CritScope stream_lock(&stream_crit_); - const auto& kv = send_streams_.find(ssrc); - if (kv == send_streams_.end()) { - LOG(LS_ERROR) << "No sending stream on ssrc " << ssrc; - return false; - } - - kv->second->MuteStream(mute); - return true; -} - // TODO(pbos): Remove SetOptions in favor of SetSendParameters. void WebRtcVideoChannel2::SetOptions(uint32_t ssrc, const VideoOptions& options) { @@ -1523,7 +1504,7 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream( call_(call), cpu_restricted_counter_(0), number_of_cpu_adapt_changes_(0), - capturer_(nullptr), + source_(nullptr), external_encoder_factory_(external_encoder_factory), stream_(nullptr), parameters_(config, options, max_bitrate_bps, codec_settings), @@ -1531,7 +1512,6 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream( pending_encoder_reconfiguration_(false), allocated_encoder_(nullptr, webrtc::kVideoCodecUnknown, false), sending_(false), - muted_(false), first_frame_timestamp_ms_(0), last_frame_timestamp_ms_(0) { parameters_.config.rtp.max_packet_size = kVideoMtu; @@ -1557,7 +1537,7 @@ WebRtcVideoChannel2::WebRtcVideoSendStream::WebRtcVideoSendStream( } WebRtcVideoChannel2::WebRtcVideoSendStream::~WebRtcVideoSendStream() { - DisconnectCapturer(); + DisconnectSource(); if (stream_ != NULL) { call_->DestroyVideoSendStream(stream_); } @@ -1590,14 +1570,6 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::OnFrame( return; } - if (muted_) { - // Create a black frame to transmit instead. - CreateBlackFrame(&video_frame, - frame.width(), - frame.height(), - video_frame.rotation()); - } - int64_t frame_delta_ms = frame.GetTimeStamp() / rtc::kNumNanosecsPerMillisec; // frame->GetTimeStamp() is essentially a delta, align to webrtc time if (first_frame_timestamp_ms_ == 0) { @@ -1620,13 +1592,14 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::OnFrame( stream_->Input()->IncomingCapturedFrame(video_frame); } -bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetCapturer( - VideoCapturer* capturer) { - TRACE_EVENT0("webrtc", "WebRtcVideoSendStream::SetCapturer"); +void WebRtcVideoChannel2::WebRtcVideoSendStream::SetSource( + rtc::VideoSourceInterface* source) { + TRACE_EVENT0("webrtc", "WebRtcVideoSendStream::SetSource"); RTC_DCHECK(thread_checker_.CalledOnValidThread()); - if (!DisconnectCapturer() && capturer == NULL) { - return false; - } + + if (!source && !source_) + return; + DisconnectSource(); { rtc::CritScope cs(&lock_); @@ -1635,7 +1608,7 @@ bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetCapturer( // new capturer may have a different timestamp delta than the previous one. first_frame_timestamp_ms_ = 0; - if (capturer == NULL) { + if (source == NULL) { if (stream_ != NULL) { LOG(LS_VERBOSE) << "Disabling capturer, sending black frame."; webrtc::VideoFrame black_frame; @@ -1652,39 +1625,31 @@ bool WebRtcVideoChannel2::WebRtcVideoSendStream::SetCapturer( black_frame.set_render_time_ms(last_frame_timestamp_ms_); stream_->Input()->IncomingCapturedFrame(black_frame); } - - capturer_ = NULL; - return true; } } - capturer_ = capturer; - // |capturer_->AddOrUpdateSink| may not be called while holding |lock_| since + source_ = source; + // |source_->AddOrUpdateSink| may not be called while holding |lock_| since // that might cause a lock order inversion. - capturer_->AddOrUpdateSink(this, sink_wants_); - return true; + if (source_) { + source_->AddOrUpdateSink(this, sink_wants_); + } } -void WebRtcVideoChannel2::WebRtcVideoSendStream::MuteStream(bool mute) { - rtc::CritScope cs(&lock_); - muted_ = mute; -} - -bool WebRtcVideoChannel2::WebRtcVideoSendStream::DisconnectCapturer() { +void WebRtcVideoChannel2::WebRtcVideoSendStream::DisconnectSource() { RTC_DCHECK(thread_checker_.CalledOnValidThread()); - if (capturer_ == NULL) { - return false; + if (source_ == NULL) { + return; } - // |capturer_->RemoveSink| may not be called while holding |lock_| since + // |source_->RemoveSink| may not be called while holding |lock_| since // that might cause a lock order inversion. - capturer_->RemoveSink(this); - capturer_ = NULL; + source_->RemoveSink(this); + source_ = nullptr; // Reset |cpu_restricted_counter_| if the capturer is changed. It is not // possible to know if the video resolution is restricted by CPU usage after // the capturer is changed since the next capturer might be screen capture // with another resolution and frame rate. cpu_restricted_counter_ = 0; - return true; } const std::vector& @@ -1845,8 +1810,8 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::SetSendParameters( if (params.rtp_header_extensions) { sink_wants_.rotation_applied = !ContainsHeaderExtension( *params.rtp_header_extensions, kRtpVideoRotationHeaderExtension); - if (capturer_) { - capturer_->AddOrUpdateSink(this, sink_wants_); + if (source_) { + source_->AddOrUpdateSink(this, sink_wants_); } } } @@ -2011,7 +1976,7 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::OnLoadUpdate(Load load) { return; } RTC_DCHECK(thread_checker_.CalledOnValidThread()); - if (!capturer_) { + if (!source_) { return; } { @@ -2067,9 +2032,9 @@ void WebRtcVideoChannel2::WebRtcVideoSendStream::OnLoadUpdate(Load load) { sink_wants_.max_pixel_count = max_pixel_count; sink_wants_.max_pixel_count_step_up = max_pixel_count_step_up; } - // |capturer_->AddOrUpdateSink| may not be called while holding |lock_| since + // |source_->AddOrUpdateSink| may not be called while holding |lock_| since // that might cause a lock order inversion. - capturer_->AddOrUpdateSink(this, sink_wants_); + source_->AddOrUpdateSink(this, sink_wants_); } VideoSenderInfo diff --git a/webrtc/media/engine/webrtcvideoengine2.h b/webrtc/media/engine/webrtcvideoengine2.h index ba2dbd8a02..b9ab0b71ed 100644 --- a/webrtc/media/engine/webrtcvideoengine2.h +++ b/webrtc/media/engine/webrtcvideoengine2.h @@ -161,7 +161,9 @@ class WebRtcVideoChannel2 : public VideoMediaChannel, public webrtc::Transport { bool SetSink(uint32_t ssrc, rtc::VideoSinkInterface* sink) override; bool GetStats(VideoMediaInfo* info) override; - bool SetCapturer(uint32_t ssrc, VideoCapturer* capturer) override; + void SetSource( + uint32_t ssrc, + rtc::VideoSourceInterface* source) override; void OnPacketReceived(rtc::CopyOnWriteBuffer* packet, const rtc::PacketTime& packet_time) override; @@ -217,8 +219,6 @@ class WebRtcVideoChannel2 : public VideoMediaChannel, public webrtc::Transport { bool GetChangedRecvParameters(const VideoRecvParameters& params, ChangedRecvParameters* changed_params) const; - bool MuteStream(uint32_t ssrc, bool mute); - void SetMaxSendBandwidth(int bps); void SetOptions(uint32_t ssrc, const VideoOptions& options); @@ -235,7 +235,7 @@ class WebRtcVideoChannel2 : public VideoMediaChannel, public webrtc::Transport { static std::string CodecSettingsVectorToString( const std::vector& codecs); - // Wrapper for the sender part, this is where the capturer is connected and + // Wrapper for the sender part, this is where the source is connected and // frames are then converted from cricket frames to webrtc frames. class WebRtcVideoSendStream : public rtc::VideoSinkInterface, @@ -261,9 +261,8 @@ class WebRtcVideoChannel2 : public VideoMediaChannel, public webrtc::Transport { webrtc::RtpParameters GetRtpParameters() const; void OnFrame(const cricket::VideoFrame& frame) override; - bool SetCapturer(VideoCapturer* capturer); - void MuteStream(bool mute); - bool DisconnectCapturer(); + void SetSource(rtc::VideoSourceInterface* source); + void DisconnectSource(); void SetSend(bool send); @@ -365,12 +364,12 @@ class WebRtcVideoChannel2 : public VideoMediaChannel, public webrtc::Transport { webrtc::Call* const call_; rtc::VideoSinkWants sink_wants_; // Counter used for deciding if the video resolution is currently - // restricted by CPU usage. It is reset if |capturer_| is changed. + // restricted by CPU usage. It is reset if |source_| is changed. int cpu_restricted_counter_; // Total number of times resolution as been requested to be changed due to // CPU adaptation. int number_of_cpu_adapt_changes_; - VideoCapturer* capturer_; + rtc::VideoSourceInterface* source_; WebRtcVideoEncoderFactory* const external_encoder_factory_ GUARDED_BY(lock_); @@ -393,14 +392,13 @@ class WebRtcVideoChannel2 : public VideoMediaChannel, public webrtc::Transport { webrtc::kVideoRotation_0; bool sending_ GUARDED_BY(lock_); - bool muted_ GUARDED_BY(lock_); // The timestamp of the first frame received // Used to generate the timestamps of subsequent frames int64_t first_frame_timestamp_ms_ GUARDED_BY(lock_); // The timestamp of the last frame received - // Used to generate timestamp for the black frame when capturer is removed + // Used to generate timestamp for the black frame when source is removed int64_t last_frame_timestamp_ms_ GUARDED_BY(lock_); }; diff --git a/webrtc/media/engine/webrtcvideoengine2_unittest.cc b/webrtc/media/engine/webrtcvideoengine2_unittest.cc index e1f540660f..63aae9a482 100644 --- a/webrtc/media/engine/webrtcvideoengine2_unittest.cc +++ b/webrtc/media/engine/webrtcvideoengine2_unittest.cc @@ -241,7 +241,7 @@ TEST_F(WebRtcVideoEngine2Test, CVOSetHeaderExtensionBeforeCapturer) { EXPECT_TRUE(channel->SetSendParameters(parameters)); // Set capturer. - EXPECT_TRUE(channel->SetCapturer(kSsrc, &capturer)); + channel->SetSource(kSsrc, &capturer); // Verify capturer has turned off applying rotation. EXPECT_FALSE(capturer.GetApplyRotation()); @@ -272,7 +272,7 @@ TEST_F(WebRtcVideoEngine2Test, CVOSetHeaderExtensionBeforeAddSendStream) { EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(kSsrc))); // Set capturer. - EXPECT_TRUE(channel->SetCapturer(kSsrc, &capturer)); + channel->SetSource(kSsrc, &capturer); // Verify capturer has turned off applying rotation. EXPECT_FALSE(capturer.GetApplyRotation()); @@ -293,7 +293,7 @@ TEST_F(WebRtcVideoEngine2Test, CVOSetHeaderExtensionAfterCapturer) { EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(kSsrc))); // Set capturer. - EXPECT_TRUE(channel->SetCapturer(kSsrc, &capturer)); + channel->SetSource(kSsrc, &capturer); // Verify capturer has turned on applying rotation. EXPECT_TRUE(capturer.GetApplyRotation()); @@ -352,7 +352,7 @@ TEST_F(WebRtcVideoEngine2Test, UseExternalFactoryForVp8WhenSupported) { EXPECT_TRUE(channel->SetSend(true)); cricket::FakeVideoCapturer capturer; - EXPECT_TRUE(channel->SetCapturer(kSsrc, &capturer)); + channel->SetSource(kSsrc, &capturer); EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capturer.GetSupportedFormats()->front())); EXPECT_TRUE(capturer.CaptureFrame()); @@ -439,7 +439,7 @@ TEST_F(WebRtcVideoEngine2Test, PropagatesInputFrameTimestamp) { channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc))); FakeVideoCapturer capturer; - EXPECT_TRUE(channel->SetCapturer(kSsrc, &capturer)); + channel->SetSource(kSsrc, &capturer); capturer.Start(cricket::VideoFormat(1280, 720, cricket::VideoFormat::FpsToInterval(60), cricket::FOURCC_I420)); @@ -501,7 +501,7 @@ TEST_F(WebRtcVideoEngine2Test, FakeVideoSendStream* stream = fake_call->GetVideoSendStreams()[0]; FakeVideoCapturer capturer1; - EXPECT_TRUE(channel->SetCapturer(kSsrc, &capturer1)); + channel->SetSource(kSsrc, &capturer1); cricket::CapturedFrame frame; frame.width = 1280; @@ -526,7 +526,7 @@ TEST_F(WebRtcVideoEngine2Test, // Reset input source, should still be continuous even though input-frame // timestamp is less than before. FakeVideoCapturer capturer2; - EXPECT_TRUE(channel->SetCapturer(kSsrc, &capturer2)); + channel->SetSource(kSsrc, &capturer2); rtc::Thread::Current()->SleepMs(1); // Deliver with a timestamp (10 seconds) before the previous initial one, @@ -586,7 +586,7 @@ TEST_F(WebRtcVideoEngine2Test, UsesSimulcastAdapterForVp8Factories) { EXPECT_TRUE(channel->SetSend(true)); cricket::FakeVideoCapturer capturer; - EXPECT_TRUE(channel->SetCapturer(ssrcs.front(), &capturer)); + channel->SetSource(ssrcs.front(), &capturer); EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capturer.GetSupportedFormats()->front())); EXPECT_TRUE(capturer.CaptureFrame()); @@ -604,7 +604,7 @@ TEST_F(WebRtcVideoEngine2Test, UsesSimulcastAdapterForVp8Factories) { prev_width = codec_settings.width; } - EXPECT_TRUE(channel->SetCapturer(ssrcs.front(), NULL)); + channel->SetSource(ssrcs.front(), NULL); channel.reset(); ASSERT_EQ(0u, encoder_factory.encoders().size()); @@ -667,7 +667,7 @@ TEST_F(WebRtcVideoEngine2Test, // encoder adapter at a low-enough size that it'll only create a single // encoder layer. cricket::FakeVideoCapturer capturer; - EXPECT_TRUE(channel->SetCapturer(ssrcs.front(), &capturer)); + channel->SetSource(ssrcs.front(), &capturer); EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capturer.GetSupportedFormats()->front())); EXPECT_TRUE(capturer.CaptureFrame()); @@ -721,7 +721,7 @@ TEST_F(WebRtcVideoEngine2Test, SimulcastDisabledForH264) { cricket::VideoFormat format( 1280, 720, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420); cricket::FakeVideoCapturer capturer; - EXPECT_TRUE(channel->SetCapturer(ssrcs[0], &capturer)); + channel->SetSource(ssrcs[0], &capturer); EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(format)); EXPECT_TRUE(capturer.CaptureFrame()); @@ -729,7 +729,7 @@ TEST_F(WebRtcVideoEngine2Test, SimulcastDisabledForH264) { FakeWebRtcVideoEncoder* encoder = encoder_factory.encoders()[0]; EXPECT_EQ(webrtc::kVideoCodecH264, encoder->GetCodecSettings().codecType); EXPECT_EQ(1u, encoder->GetCodecSettings().numberOfSimulcastStreams); - EXPECT_TRUE(channel->SetCapturer(ssrcs[0], nullptr)); + channel->SetSource(ssrcs[0], nullptr); } // Test that external codecs are added to the end of the supported codec list. @@ -849,8 +849,6 @@ WEBRTC_DISABLED_BASE_TEST(AdaptFramerate); WEBRTC_BASE_TEST(SendsLowerResolutionOnSmallerFrames); -WEBRTC_BASE_TEST(MuteStream); - WEBRTC_BASE_TEST(MultipleSendStreams); TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8Vga) { @@ -1538,7 +1536,7 @@ TEST_F(WebRtcVideoChannel2Test, ReconfiguresEncodersWhenNotSending) { EXPECT_EQ(144u, streams[0].height); cricket::FakeVideoCapturer capturer; - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer)); + channel_->SetSource(last_ssrc_, &capturer); EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capturer.GetSupportedFormats()->front())); EXPECT_TRUE(capturer.CaptureFrame()); @@ -1550,7 +1548,7 @@ TEST_F(WebRtcVideoChannel2Test, ReconfiguresEncodersWhenNotSending) { // No frames should have been actually put in there though. EXPECT_EQ(0, stream->GetNumberOfSwappedFrames()); - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL)); + channel_->SetSource(last_ssrc_, NULL); } TEST_F(WebRtcVideoChannel2Test, UsesCorrectSettingsForScreencast) { @@ -1567,7 +1565,7 @@ TEST_F(WebRtcVideoChannel2Test, UsesCorrectSettingsForScreencast) { channel_->SetVideoSend(last_ssrc_, true, &min_bitrate_options); cricket::FakeVideoCapturer capturer; - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer)); + channel_->SetSource(last_ssrc_, &capturer); cricket::VideoFormat capture_format_hd = capturer.GetSupportedFormats()->front(); EXPECT_EQ(1280, capture_format_hd.width); @@ -1591,10 +1589,10 @@ TEST_F(WebRtcVideoChannel2Test, UsesCorrectSettingsForScreencast) { EXPECT_EQ(0, encoder_config.min_transmit_bitrate_bps) << "Non-screenshare shouldn't use min-transmit bitrate."; - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, nullptr)); + channel_->SetSource(last_ssrc_, nullptr); // Removing a capturer triggers a black frame to be sent. EXPECT_EQ(2, send_stream->GetNumberOfSwappedFrames()); - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer)); + channel_->SetSource(last_ssrc_, &capturer); VideoOptions screencast_options; screencast_options.is_screencast = rtc::Optional(true); EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, &screencast_options)); @@ -1614,7 +1612,7 @@ TEST_F(WebRtcVideoChannel2Test, UsesCorrectSettingsForScreencast) { EXPECT_EQ(capture_format_hd.height, encoder_config.streams.front().height); EXPECT_TRUE(encoder_config.streams[0].temporal_layer_thresholds_bps.empty()); - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL)); + channel_->SetSource(last_ssrc_, NULL); } TEST_F(WebRtcVideoChannel2Test, NoRecreateStreamForScreencast) { @@ -1624,7 +1622,7 @@ TEST_F(WebRtcVideoChannel2Test, NoRecreateStreamForScreencast) { EXPECT_TRUE(channel_->SetSend(true)); cricket::FakeVideoCapturer capturer; - EXPECT_TRUE(channel_->SetCapturer(kSsrc, &capturer)); + channel_->SetSource(kSsrc, &capturer); EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capturer.GetSupportedFormats()->front())); EXPECT_TRUE(capturer.CaptureFrame()); @@ -1665,7 +1663,7 @@ TEST_F(WebRtcVideoChannel2Test, NoRecreateStreamForScreencast) { EXPECT_EQ(webrtc::VideoEncoderConfig::ContentType::kRealtimeVideo, encoder_config.content_type); - EXPECT_TRUE(channel_->SetCapturer(kSsrc, NULL)); + channel_->SetSource(kSsrc, NULL); } TEST_F(WebRtcVideoChannel2Test, @@ -1680,7 +1678,7 @@ TEST_F(WebRtcVideoChannel2Test, options.is_screencast = rtc::Optional(true); channel_->SetVideoSend(last_ssrc_, true, &options); cricket::FakeVideoCapturer capturer; - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer)); + channel_->SetSource(last_ssrc_, &capturer); cricket::VideoFormat capture_format_hd = capturer.GetSupportedFormats()->front(); EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd)); @@ -1702,7 +1700,7 @@ TEST_F(WebRtcVideoChannel2Test, EXPECT_EQ(kConferenceScreencastTemporalBitrateBps, encoder_config.streams[0].temporal_layer_thresholds_bps[0]); - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL)); + channel_->SetSource(last_ssrc_, NULL); } TEST_F(WebRtcVideoChannel2Test, SuspendBelowMinBitrateDisabledByDefault) { @@ -1752,7 +1750,7 @@ TEST_F(WebRtcVideoChannel2Test, VerifyVp8SpecificSettings) { cricket::FakeVideoCapturer capturer; EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capturer.GetSupportedFormats()->front())); - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer)); + channel_->SetSource(last_ssrc_, &capturer); channel_->SetSend(true); EXPECT_TRUE(capturer.CaptureFrame()); @@ -1776,9 +1774,9 @@ TEST_F(WebRtcVideoChannel2Test, VerifyVp8SpecificSettings) { EXPECT_TRUE(vp8_settings.automaticResizeOn); EXPECT_TRUE(vp8_settings.frameDroppingOn); - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL)); + channel_->SetSource(last_ssrc_, NULL); stream = SetUpSimulcast(true, false); - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer)); + channel_->SetSource(last_ssrc_, &capturer); channel_->SetSend(true); EXPECT_TRUE(capturer.CaptureFrame()); @@ -1809,7 +1807,7 @@ TEST_F(WebRtcVideoChannel2Test, VerifyVp8SpecificSettings) { EXPECT_FALSE(vp8_settings.automaticResizeOn); EXPECT_FALSE(vp8_settings.frameDroppingOn); - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL)); + channel_->SetSource(last_ssrc_, NULL); } // Test that setting the same options doesn't result in the encoder being @@ -1819,7 +1817,7 @@ TEST_F(WebRtcVideoChannel2Test, SetIdenticalOptionsDoesntReconfigureEncoder) { cricket::FakeVideoCapturer capturer; FakeVideoSendStream* send_stream = AddSendStream(); - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer)); + channel_->SetSource(last_ssrc_, &capturer); EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capturer.GetSupportedFormats()->front())); EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, &options)); @@ -1833,7 +1831,7 @@ TEST_F(WebRtcVideoChannel2Test, SetIdenticalOptionsDoesntReconfigureEncoder) { EXPECT_TRUE(capturer.CaptureFrame()); EXPECT_EQ(2, send_stream->num_encoder_reconfigurations()); - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, nullptr)); + channel_->SetSource(last_ssrc_, nullptr); } class Vp9SettingsTest : public WebRtcVideoChannel2Test { @@ -1871,7 +1869,7 @@ TEST_F(Vp9SettingsTest, VerifyVp9SpecificSettings) { cricket::FakeVideoCapturer capturer; EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capturer.GetSupportedFormats()->front())); - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer)); + channel_->SetSource(last_ssrc_, &capturer); channel_->SetSend(true); EXPECT_TRUE(capturer.CaptureFrame()); @@ -1912,7 +1910,7 @@ TEST_F(Vp9SettingsTest, VerifyVp9SpecificSettings) { EXPECT_FALSE(vp9_settings.denoisingOn); EXPECT_FALSE(vp9_settings.frameDroppingOn); - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL)); + channel_->SetSource(last_ssrc_, NULL); } class Vp9SettingsTestWithFieldTrial : public Vp9SettingsTest { @@ -1931,7 +1929,7 @@ class Vp9SettingsTestWithFieldTrial : public Vp9SettingsTest { cricket::FakeVideoCapturer capturer; EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capturer.GetSupportedFormats()->front())); - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer)); + channel_->SetSource(last_ssrc_, &capturer); channel_->SetSend(true); EXPECT_TRUE(capturer.CaptureFrame()); @@ -1941,7 +1939,7 @@ class Vp9SettingsTestWithFieldTrial : public Vp9SettingsTest { EXPECT_EQ(num_spatial_layers, vp9_settings.numberOfSpatialLayers); EXPECT_EQ(num_temporal_layers, vp9_settings.numberOfTemporalLayers); - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL)); + channel_->SetSource(last_ssrc_, NULL); } }; @@ -2006,7 +2004,7 @@ TEST_F(WebRtcVideoChannel2Test, AdaptsOnOveruseAndChangeResolution) { AddSendStream(); cricket::FakeVideoCapturer capturer; - ASSERT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer)); + channel_->SetSource(last_ssrc_, &capturer); ASSERT_EQ(cricket::CS_RUNNING, capturer.Start(capturer.GetSupportedFormats()->front())); ASSERT_TRUE(channel_->SetSend(true)); @@ -2064,7 +2062,7 @@ TEST_F(WebRtcVideoChannel2Test, AdaptsOnOveruseAndChangeResolution) { EXPECT_EQ(1284, send_stream->GetLastWidth()); EXPECT_EQ(724, send_stream->GetLastHeight()); - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL)); + channel_->SetSource(last_ssrc_, NULL); } TEST_F(WebRtcVideoChannel2Test, PreviousAdaptationDoesNotApplyToScreenshare) { @@ -2080,7 +2078,7 @@ TEST_F(WebRtcVideoChannel2Test, PreviousAdaptationDoesNotApplyToScreenshare) { AddSendStream(); cricket::FakeVideoCapturer capturer; - ASSERT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer)); + channel_->SetSource(last_ssrc_, &capturer); ASSERT_EQ(cricket::CS_RUNNING, capturer.Start(capturer.GetSupportedFormats()->front())); ASSERT_TRUE(channel_->SetSend(true)); @@ -2109,7 +2107,7 @@ TEST_F(WebRtcVideoChannel2Test, PreviousAdaptationDoesNotApplyToScreenshare) { cricket::FakeVideoCapturer screen_share(true); ASSERT_EQ(cricket::CS_RUNNING, screen_share.Start(screen_share.GetSupportedFormats()->front())); - ASSERT_TRUE(channel_->SetCapturer(last_ssrc_, &screen_share)); + channel_->SetSource(last_ssrc_, &screen_share); cricket::VideoOptions screenshare_options; screenshare_options.is_screencast = rtc::Optional(true); channel_->SetVideoSend(last_ssrc_, true /* enable */, &screenshare_options); @@ -2119,14 +2117,14 @@ TEST_F(WebRtcVideoChannel2Test, PreviousAdaptationDoesNotApplyToScreenshare) { EXPECT_EQ(724, send_stream->GetLastHeight()); // Switch back to the normal capturer. Expect the frame to be CPU adapted. - ASSERT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer)); + channel_->SetSource(last_ssrc_, &capturer); channel_->SetVideoSend(last_ssrc_, true /* enable */, &camera_options); EXPECT_TRUE(capturer.CaptureCustomFrame(1280, 720, cricket::FOURCC_I420)); EXPECT_EQ(4, send_stream->GetNumberOfSwappedFrames()); EXPECT_EQ(1280 * 3 / 4, send_stream->GetLastWidth()); EXPECT_EQ(720 * 3 / 4, send_stream->GetLastHeight()); - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL)); + channel_->SetSource(last_ssrc_, NULL); } void WebRtcVideoChannel2Test::TestCpuAdaptation(bool enable_overuse, @@ -2151,7 +2149,7 @@ void WebRtcVideoChannel2Test::TestCpuAdaptation(bool enable_overuse, EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, &options)); cricket::FakeVideoCapturer capturer; - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer)); + channel_->SetSource(last_ssrc_, &capturer); EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capturer.GetSupportedFormats()->front())); @@ -2172,7 +2170,7 @@ void WebRtcVideoChannel2Test::TestCpuAdaptation(bool enable_overuse, EXPECT_EQ(codec.width, send_stream->GetLastWidth()); EXPECT_EQ(codec.height, send_stream->GetLastHeight()); - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL)); + channel_->SetSource(last_ssrc_, NULL); return; } @@ -2201,7 +2199,7 @@ void WebRtcVideoChannel2Test::TestCpuAdaptation(bool enable_overuse, EXPECT_EQ(codec.width, send_stream->GetLastWidth()); EXPECT_EQ(codec.height, send_stream->GetLastHeight()); - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL)); + channel_->SetSource(last_ssrc_, NULL); } TEST_F(WebRtcVideoChannel2Test, EstimatesNtpStartTimeCorrectly) { @@ -2332,7 +2330,7 @@ TEST_F(WebRtcVideoChannel2Test, SetSendCodecsChangesExistingStreams) { FakeVideoSendStream* stream = AddSendStream(); cricket::FakeVideoCapturer capturer; - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer)); + channel_->SetSource(last_ssrc_, &capturer); EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capturer.GetSupportedFormats()->front())); EXPECT_TRUE(capturer.CaptureFrame()); @@ -2347,7 +2345,7 @@ TEST_F(WebRtcVideoChannel2Test, SetSendCodecsChangesExistingStreams) { streams = fake_call_->GetVideoSendStreams()[0]->GetVideoStreams(); EXPECT_EQ(kVp8Codec360p.width, streams[0].width); EXPECT_EQ(kVp8Codec360p.height, streams[0].height); - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL)); + channel_->SetSource(last_ssrc_, NULL); } TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithBitrates) { @@ -2411,7 +2409,7 @@ TEST_F(WebRtcVideoChannel2Test, SetMaxSendBitrateCanIncreaseSenderBitrate) { FakeVideoSendStream* stream = AddSendStream(); cricket::FakeVideoCapturer capturer; - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer)); + channel_->SetSource(last_ssrc_, &capturer); EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capturer.GetSupportedFormats()->front())); @@ -2425,7 +2423,7 @@ TEST_F(WebRtcVideoChannel2Test, SetMaxSendBitrateCanIncreaseSenderBitrate) { EXPECT_TRUE(capturer.CaptureFrame()); streams = stream->GetVideoStreams(); EXPECT_EQ(initial_max_bitrate_bps * 2, streams[0].max_bitrate_bps); - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, nullptr)); + channel_->SetSource(last_ssrc_, nullptr); } TEST_F(WebRtcVideoChannel2Test, @@ -2440,7 +2438,7 @@ TEST_F(WebRtcVideoChannel2Test, // Send a frame to make sure this scales up to >1 stream (simulcast). cricket::FakeVideoCapturer capturer; - EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], &capturer)); + channel_->SetSource(kSsrcs3[0], &capturer); EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capturer.GetSupportedFormats()->front())); EXPECT_TRUE(capturer.CaptureFrame()); @@ -2459,7 +2457,7 @@ TEST_F(WebRtcVideoChannel2Test, int increased_max_bitrate_bps = GetTotalMaxBitrateBps(streams); EXPECT_EQ(initial_max_bitrate_bps * 2, increased_max_bitrate_bps); - EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], nullptr)); + channel_->SetSource(kSsrcs3[0], nullptr); } TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithMaxQuantization) { @@ -2829,7 +2827,7 @@ TEST_F(WebRtcVideoChannel2Test, GetStatsTracksAdaptationStats) { video_capturer_vga.GetSupportedFormats(); cricket::VideoFormat capture_format_vga = (*formats)[1]; EXPECT_EQ(cricket::CS_RUNNING, video_capturer_vga.Start(capture_format_vga)); - EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], &video_capturer_vga)); + channel_->SetSource(kSsrcs3[0], &video_capturer_vga); EXPECT_TRUE(video_capturer_vga.CaptureFrame()); cricket::VideoCodec send_codec(100, "VP8", 640, 480, 30, 0); @@ -2866,7 +2864,7 @@ TEST_F(WebRtcVideoChannel2Test, GetStatsTracksAdaptationStats) { info.senders[0].adapt_reason); // No capturer (no adapter). Adapt changes from old adapter should be kept. - EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], NULL)); + channel_->SetSource(kSsrcs3[0], NULL); info.Clear(); EXPECT_TRUE(channel_->GetStats(&info)); ASSERT_EQ(1U, info.senders.size()); @@ -2878,7 +2876,7 @@ TEST_F(WebRtcVideoChannel2Test, GetStatsTracksAdaptationStats) { cricket::FakeVideoCapturer video_capturer_hd; cricket::VideoFormat capture_format_hd = (*formats)[0]; EXPECT_EQ(cricket::CS_RUNNING, video_capturer_hd.Start(capture_format_hd)); - EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], &video_capturer_hd)); + channel_->SetSource(kSsrcs3[0], &video_capturer_hd); EXPECT_TRUE(video_capturer_hd.CaptureFrame()); // Trigger overuse, HD -> adapt (OnCpuResolutionRequest downgrade) -> HD/2. @@ -2890,7 +2888,7 @@ TEST_F(WebRtcVideoChannel2Test, GetStatsTracksAdaptationStats) { EXPECT_EQ(3, info.senders[0].adapt_changes); EXPECT_EQ(WebRtcVideoChannel2::ADAPTREASON_CPU, info.senders[0].adapt_reason); - EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], NULL)); + channel_->SetSource(kSsrcs3[0], NULL); } TEST_F(WebRtcVideoChannel2Test, GetStatsTracksAdaptationAndBandwidthStats) { @@ -2902,7 +2900,7 @@ TEST_F(WebRtcVideoChannel2Test, GetStatsTracksAdaptationAndBandwidthStats) { video_capturer_vga.GetSupportedFormats(); cricket::VideoFormat capture_format_vga = (*formats)[1]; EXPECT_EQ(cricket::CS_RUNNING, video_capturer_vga.Start(capture_format_vga)); - EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], &video_capturer_vga)); + channel_->SetSource(kSsrcs3[0], &video_capturer_vga); EXPECT_TRUE(video_capturer_vga.CaptureFrame()); cricket::VideoCodec send_codec(100, "VP8", 640, 480, 30, 0); @@ -2954,7 +2952,7 @@ TEST_F(WebRtcVideoChannel2Test, GetStatsTracksAdaptationAndBandwidthStats) { EXPECT_EQ(WebRtcVideoChannel2::ADAPTREASON_NONE, info.senders[0].adapt_reason); - EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], NULL)); + channel_->SetSource(kSsrcs3[0], NULL); } TEST_F(WebRtcVideoChannel2Test, @@ -3316,7 +3314,7 @@ TEST_F(WebRtcVideoChannel2Test, CanSentMaxBitrateForExistingStream) { AddSendStream(); cricket::FakeVideoCapturer capturer; - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer)); + channel_->SetSource(last_ssrc_, &capturer); cricket::VideoFormat capture_format_hd = capturer.GetSupportedFormats()->front(); EXPECT_EQ(1280, capture_format_hd.width); @@ -3341,7 +3339,7 @@ TEST_F(WebRtcVideoChannel2Test, CanSentMaxBitrateForExistingStream) { SetAndExpectMaxBitrate(capturer, 0, 800, 800); SetAndExpectMaxBitrate(capturer, 0, 0, default_encoder_bitrate); - EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL)); + channel_->SetSource(last_ssrc_, NULL); } TEST_F(WebRtcVideoChannel2Test, CannotSetMaxBitrateForNonexistentStream) { @@ -3475,7 +3473,7 @@ class WebRtcVideoChannel2SimulcastTest : public testing::Test { // Send a full-size frame to trigger a stream reconfiguration to use all // expected simulcast layers. cricket::FakeVideoCapturer capturer; - EXPECT_TRUE(channel_->SetCapturer(ssrcs.front(), &capturer)); + channel_->SetSource(ssrcs.front(), &capturer); EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(cricket::VideoFormat( codec.width, codec.height, cricket::VideoFormat::FpsToInterval(30), @@ -3532,7 +3530,7 @@ class WebRtcVideoChannel2SimulcastTest : public testing::Test { ASSERT_EQ(1u, info.senders.size()); EXPECT_EQ(total_max_bitrate_bps, info.senders[0].preferred_bitrate); - EXPECT_TRUE(channel_->SetCapturer(ssrcs.front(), NULL)); + channel_->SetSource(ssrcs.front(), NULL); } FakeVideoSendStream* AddSendStream() { diff --git a/webrtc/pc/channel.cc b/webrtc/pc/channel.cc index 9556beb6fe..497610da78 100644 --- a/webrtc/pc/channel.cc +++ b/webrtc/pc/channel.cc @@ -1690,9 +1690,11 @@ bool VideoChannel::SetSink(uint32_t ssrc, return true; } -bool VideoChannel::SetCapturer(uint32_t ssrc, VideoCapturer* capturer) { - return InvokeOnWorker(Bind(&VideoMediaChannel::SetCapturer, - media_channel(), ssrc, capturer)); +void VideoChannel::SetSource( + uint32_t ssrc, + rtc::VideoSourceInterface* source) { + worker_thread()->Invoke( + Bind(&VideoMediaChannel::SetSource, media_channel(), ssrc, source)); } bool VideoChannel::SetVideoSend(uint32_t ssrc, diff --git a/webrtc/pc/channel.h b/webrtc/pc/channel.h index e05b6e5f3f..4518301d3b 100644 --- a/webrtc/pc/channel.h +++ b/webrtc/pc/channel.h @@ -27,8 +27,8 @@ #include "webrtc/media/base/mediachannel.h" #include "webrtc/media/base/mediaengine.h" #include "webrtc/media/base/streamparams.h" -#include "webrtc/media/base/videocapturer.h" #include "webrtc/media/base/videosinkinterface.h" +#include "webrtc/media/base/videosourceinterface.h" #include "webrtc/p2p/base/transportcontroller.h" #include "webrtc/p2p/client/socketmonitor.h" #include "webrtc/pc/audiomonitor.h" @@ -449,7 +449,10 @@ class VideoChannel : public BaseChannel { } bool SetSink(uint32_t ssrc, rtc::VideoSinkInterface* sink); - bool SetCapturer(uint32_t ssrc, VideoCapturer* capturer); + // Register a source. The |ssrc| must correspond to a registered + // send stream. + void SetSource(uint32_t ssrc, + rtc::VideoSourceInterface* source); // Get statistics about the current media session. bool GetStats(VideoMediaInfo* stats);