blob: 4800d3b5c89768e8aef3473a0dc9e25f13f357b0 [file] [log] [blame]
/*
* Copyright 2012 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "webrtc/api/videotrackrenderers.h"
#include "webrtc/media/engine/webrtcvideoframe.h"
namespace webrtc {
VideoTrackRenderers::VideoTrackRenderers() : enabled_(true) {
}
VideoTrackRenderers::~VideoTrackRenderers() {
}
void VideoTrackRenderers::AddRenderer(VideoRendererInterface* renderer) {
if (!renderer) {
return;
}
rtc::CritScope cs(&critical_section_);
renderers_.insert(renderer);
}
void VideoTrackRenderers::RemoveRenderer(VideoRendererInterface* renderer) {
rtc::CritScope cs(&critical_section_);
renderers_.erase(renderer);
}
void VideoTrackRenderers::SetEnabled(bool enable) {
rtc::CritScope cs(&critical_section_);
enabled_ = enable;
}
bool VideoTrackRenderers::RenderFrame(const cricket::VideoFrame* frame) {
{
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);
}
}
} // namespace webrtc