| Index: webrtc/media/base/videobroadcaster.cc
|
| diff --git a/webrtc/media/base/videobroadcaster.cc b/webrtc/media/base/videobroadcaster.cc
|
| index 015f5206b676e239666e4fa5f374ebecb2a0270c..fd7134f12cc5ce3e8ef15774085ae11f4161b663 100644
|
| --- a/webrtc/media/base/videobroadcaster.cc
|
| +++ b/webrtc/media/base/videobroadcaster.cc
|
| @@ -26,13 +26,7 @@ void VideoBroadcaster::AddOrUpdateSink(
|
| RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| RTC_DCHECK(sink != nullptr);
|
| rtc::CritScope cs(&sinks_and_wants_lock_);
|
| -
|
| - SinkPair* sink_pair = FindSinkPair(sink);
|
| - if (!sink_pair) {
|
| - sinks_.push_back(SinkPair(sink, wants));
|
| - } else {
|
| - sink_pair->wants = wants;
|
| - }
|
| + VideoSourceBase::AddOrUpdateSink(sink, wants);
|
| UpdateWants();
|
| }
|
|
|
| @@ -41,19 +35,14 @@ void VideoBroadcaster::RemoveSink(
|
| RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| RTC_DCHECK(sink != nullptr);
|
| rtc::CritScope cs(&sinks_and_wants_lock_);
|
| - RTC_DCHECK(FindSinkPair(sink));
|
| - sinks_.erase(std::remove_if(sinks_.begin(), sinks_.end(),
|
| - [sink](const SinkPair& sink_pair) {
|
| - return sink_pair.sink == sink;
|
| - }),
|
| - sinks_.end());
|
| + VideoSourceBase::RemoveSink(sink);
|
| UpdateWants();
|
| }
|
|
|
| bool VideoBroadcaster::frame_wanted() const {
|
| RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| rtc::CritScope cs(&sinks_and_wants_lock_);
|
| - return !sinks_.empty();
|
| + return !sink_pairs().empty();
|
| }
|
|
|
| VideoSinkWants VideoBroadcaster::wants() const {
|
| @@ -64,20 +53,13 @@ VideoSinkWants VideoBroadcaster::wants() const {
|
|
|
| void VideoBroadcaster::OnFrame(const cricket::VideoFrame& frame) {
|
| rtc::CritScope cs(&sinks_and_wants_lock_);
|
| - for (auto& sink_pair : sinks_) {
|
| - sink_pair.sink->OnFrame(frame);
|
| - }
|
| -}
|
| -
|
| -VideoBroadcaster::SinkPair* VideoBroadcaster::FindSinkPair(
|
| - const VideoSinkInterface<cricket::VideoFrame>* sink) {
|
| - auto sink_pair_it = std::find_if(
|
| - sinks_.begin(), sinks_.end(),
|
| - [sink](const SinkPair& sink_pair) { return sink_pair.sink == sink; });
|
| - if (sink_pair_it != sinks_.end()) {
|
| - return &*sink_pair_it;
|
| + for (auto& sink_pair : sink_pairs()) {
|
| + if (sink_pair.wants.black_frames) {
|
| + sink_pair.sink->OnFrame(GetBlackFrame(frame));
|
| + } else {
|
| + sink_pair.sink->OnFrame(frame);
|
| + }
|
| }
|
| - return nullptr;
|
| }
|
|
|
| void VideoBroadcaster::UpdateWants() {
|
| @@ -85,7 +67,7 @@ void VideoBroadcaster::UpdateWants() {
|
|
|
| VideoSinkWants wants;
|
| wants.rotation_applied = false;
|
| - for (auto& sink : sinks_) {
|
| + for (auto& sink : sink_pairs()) {
|
| // wants.rotation_applied == ANY(sink.wants.rotation_applied)
|
| if (sink.wants.rotation_applied) {
|
| wants.rotation_applied = true;
|
| @@ -112,4 +94,21 @@ void VideoBroadcaster::UpdateWants() {
|
| current_wants_ = wants;
|
| }
|
|
|
| +const cricket::VideoFrame& VideoBroadcaster::GetBlackFrame(
|
| + const cricket::VideoFrame& frame) {
|
| + if (black_frame_ && black_frame_->GetWidth() == frame.GetWidth() &&
|
| + black_frame_->GetHeight() == frame.GetHeight() &&
|
| + black_frame_->GetVideoRotation() == frame.GetVideoRotation()) {
|
| + black_frame_->SetTimeStamp(frame.GetTimeStamp());
|
| + return *black_frame_;
|
| + }
|
| + black_frame_.reset(new cricket::WebRtcVideoFrame(
|
| + new rtc::RefCountedObject<webrtc::I420Buffer>(
|
| + static_cast<int>(frame.GetWidth()),
|
| + static_cast<int>(frame.GetHeight())),
|
| + frame.GetTimeStamp(), frame.GetVideoRotation()));
|
| + black_frame_->SetToBlack();
|
| + return *black_frame_;
|
| +}
|
| +
|
| } // namespace rtc
|
|
|