From 0ad48935fc5b92be6e10924a9ee3b0dc39c79104 Mon Sep 17 00:00:00 2001 From: "guoweis@webrtc.org" Date: Tue, 10 Mar 2015 02:42:50 +0000 Subject: Add concept of whether video renderer supports rotation. Rotation is best done when rendered in GPU, added the shader code which rotates the frame. For renderers which don't support rotation, the rotation will be done before sending down the frame to render. By default, assume renderer can't do rotation. BUG=4145 R=glaznev@webrtc.org, pthatcher@webrtc.org Review URL: https://webrtc-codereview.appspot.com/43569004 Cr-Commit-Position: refs/heads/master@{#8660} git-svn-id: http://webrtc.googlecode.com/svn/trunk@8660 4adac7df-926f-26a2-2b94-8c16560cd09d --- talk/app/webrtc/videotrackrenderers.cc | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) (limited to 'talk/app/webrtc/videotrackrenderers.cc') diff --git a/talk/app/webrtc/videotrackrenderers.cc b/talk/app/webrtc/videotrackrenderers.cc index 03f080dbf8..08bf05acb7 100644 --- a/talk/app/webrtc/videotrackrenderers.cc +++ b/talk/app/webrtc/videotrackrenderers.cc @@ -26,19 +26,21 @@ */ #include "talk/app/webrtc/videotrackrenderers.h" +#include "talk/media/base/videoframe.h" namespace webrtc { VideoTrackRenderers::VideoTrackRenderers() - : width_(0), - height_(0), - enabled_(true) { + : enabled_(true) { } VideoTrackRenderers::~VideoTrackRenderers() { } void VideoTrackRenderers::AddRenderer(VideoRendererInterface* renderer) { + if (!renderer) { + return; + } rtc::CritScope cs(&critical_section_); std::vector::iterator it = renderers_.begin(); for (; it != renderers_.end(); ++it) { @@ -65,14 +67,6 @@ void VideoTrackRenderers::SetEnabled(bool enable) { } bool VideoTrackRenderers::SetSize(int width, int height, int reserved) { - rtc::CritScope cs(&critical_section_); - width_ = width; - height_ = height; - std::vector::iterator it = renderers_.begin(); - for (; it != renderers_.end(); ++it) { - it->renderer_->SetSize(width, height); - it->size_set_ = true; - } return true; } @@ -81,13 +75,14 @@ bool VideoTrackRenderers::RenderFrame(const cricket::VideoFrame* frame) { if (!enabled_) { return true; } + std::vector::iterator it = renderers_.begin(); for (; it != renderers_.end(); ++it) { - if (!it->size_set_) { - it->renderer_->SetSize(width_, height_); - it->size_set_ = true; + if (it->can_apply_rotation_) { + it->renderer_->RenderFrame(frame); + } else { + it->renderer_->RenderFrame(frame->GetCopyWithRotationApplied()); } - it->renderer_->RenderFrame(frame); } return true; } -- cgit v1.2.3