| Index: talk/app/webrtc/videotrackrenderers.cc
|
| diff --git a/talk/app/webrtc/videotrackrenderers.cc b/talk/app/webrtc/videotrackrenderers.cc
|
| index 3f9301b7185d88789877c39f985ae150e4e8158f..5b890371a55dd6bacf56cf0ea305eb02bd1a2f1c 100644
|
| --- a/talk/app/webrtc/videotrackrenderers.cc
|
| +++ b/talk/app/webrtc/videotrackrenderers.cc
|
| @@ -26,7 +26,7 @@
|
| */
|
|
|
| #include "talk/app/webrtc/videotrackrenderers.h"
|
| -#include "talk/media/base/videoframe.h"
|
| +#include "talk/media/webrtc/webrtcvideoframe.h"
|
|
|
| namespace webrtc {
|
|
|
| @@ -55,14 +55,44 @@ void VideoTrackRenderers::SetEnabled(bool enable) {
|
| }
|
|
|
| bool VideoTrackRenderers::RenderFrame(const cricket::VideoFrame* frame) {
|
| - rtc::CritScope cs(&critical_section_);
|
| - if (!enabled_) {
|
| + {
|
| + rtc::CritScope cs(&critical_section_);
|
| + if (enabled_) {
|
| + RenderFrameToRenderers(frame);
|
| + return true;
|
| + }
|
| + }
|
| +
|
| + // Generate the black frame outside of the critical section. Note
|
| + // that this may result in unexpected frame order, in the unlikely
|
| + // case that RenderFrame is called from multiple threads without
|
| + // proper serialization, and the track is switched from disabled to
|
| + // enabled in the middle of the first call.
|
| + cricket::WebRtcVideoFrame black(new rtc::RefCountedObject<I420Buffer>(
|
| + static_cast<int>(frame->GetWidth()),
|
| + static_cast<int>(frame->GetHeight())),
|
| + frame->GetTimeStamp(),
|
| + frame->GetVideoRotation());
|
| + black.SetToBlack();
|
| +
|
| + {
|
| + rtc::CritScope cs(&critical_section_);
|
| + // Check enabled_ flag again, since the track might have been
|
| + // enabled while we generated the black frame. I think the
|
| + // enabled-ness ought to be applied at the track output, and hence
|
| + // an enabled track shouldn't send any blacked out frames.
|
| + RenderFrameToRenderers(enabled_ ? frame : &black);
|
| +
|
| return true;
|
| }
|
| +}
|
| +
|
| +// Called with critical_section_ already locked
|
| +void VideoTrackRenderers::RenderFrameToRenderers(
|
| + const cricket::VideoFrame* frame) {
|
| for (VideoRendererInterface* renderer : renderers_) {
|
| renderer->RenderFrame(frame);
|
| }
|
| - return true;
|
| }
|
|
|
| } // namespace webrtc
|
|
|