Chromium Code Reviews| Index: content/renderer/media/rtc_video_renderer.cc |
| diff --git a/content/renderer/media/rtc_video_renderer.cc b/content/renderer/media/rtc_video_renderer.cc |
| index f64ed02fed2df768476d3090b1e9a32de346405d..663352c07bcf4c832edcd98f28c94ed7c126a843 100644 |
| --- a/content/renderer/media/rtc_video_renderer.cc |
| +++ b/content/renderer/media/rtc_video_renderer.cc |
| @@ -4,24 +4,15 @@ |
| #include "content/renderer/media/rtc_video_renderer.h" |
| -#include "base/bind.h" |
| #include "base/debug/trace_event.h" |
| -#include "base/location.h" |
| -#include "base/logging.h" |
| #include "base/message_loop/message_loop_proxy.h" |
| -#include "content/renderer/media/native_handle_impl.h" |
| #include "media/base/video_frame.h" |
| #include "media/base/video_util.h" |
| -#include "third_party/libjingle/source/talk/media/base/videoframe.h" |
| - |
| -using media::CopyYPlane; |
| -using media::CopyUPlane; |
| -using media::CopyVPlane; |
| namespace content { |
| RTCVideoRenderer::RTCVideoRenderer( |
| - webrtc::VideoTrackInterface* video_track, |
| + const blink::WebMediaStreamTrack& video_track, |
| const base::Closure& error_cb, |
| const RepaintCB& repaint_cb) |
| : error_cb_(error_cb), |
| @@ -29,6 +20,7 @@ RTCVideoRenderer::RTCVideoRenderer( |
| message_loop_proxy_(base::MessageLoopProxy::current()), |
| state_(kStopped), |
| video_track_(video_track) { |
| + MaybeRenderSignalingFrame(GetSourceState(video_track_)); |
| } |
| RTCVideoRenderer::~RTCVideoRenderer() { |
| @@ -38,111 +30,62 @@ void RTCVideoRenderer::Start() { |
| DCHECK(message_loop_proxy_->BelongsToCurrentThread()); |
| DCHECK_EQ(state_, kStopped); |
| - if (video_track_.get()) { |
| - video_track_->AddRenderer(this); |
| - video_track_->RegisterObserver(this); |
| - } |
| + Register(video_track_); |
| state_ = kStarted; |
| - MaybeRenderSignalingFrame(); |
| } |
| void RTCVideoRenderer::Stop() { |
| DCHECK(message_loop_proxy_->BelongsToCurrentThread()); |
| - if (video_track_.get()) { |
| - state_ = kStopped; |
| - video_track_->RemoveRenderer(this); |
| - video_track_->UnregisterObserver(this); |
| - video_track_ = NULL; |
| - } |
| + UnRegister(video_track_); |
| } |
| void RTCVideoRenderer::Play() { |
| DCHECK(message_loop_proxy_->BelongsToCurrentThread()); |
| - if (video_track_.get() && state_ == kPaused) { |
| + if (state_ == kPaused) { |
| state_ = kStarted; |
| } |
| } |
| void RTCVideoRenderer::Pause() { |
| DCHECK(message_loop_proxy_->BelongsToCurrentThread()); |
| - if (video_track_.get() && state_ == kStarted) { |
| + if (state_ == kStarted) { |
| state_ = kPaused; |
| } |
| } |
| -void RTCVideoRenderer::SetSize(int width, int height) { |
| +void RTCVideoRenderer::OnSourceChangedState(ReadyState state) { |
| + DCHECK(message_loop_proxy_->BelongsToCurrentThread()); |
| + MaybeRenderSignalingFrame(state); |
| } |
| -void RTCVideoRenderer::RenderFrame(const cricket::VideoFrame* frame) { |
| - base::TimeDelta timestamp = base::TimeDelta::FromMilliseconds( |
| - frame->GetTimeStamp() / talk_base::kNumNanosecsPerMillisec); |
| - |
| - TRACE_EVENT_INSTANT2("rtc_video_renderer", |
|
Alpha Left Google
2013/11/26 04:59:32
Please keep this event in some form.
Alpha Left Google
2013/11/26 10:00:47
Ignore this and just remove the events please.
|
| - "RenderFrame", |
| - TRACE_EVENT_SCOPE_THREAD, |
| - "elapsed time", |
| - frame->GetElapsedTime(), |
| - "timestamp_ms", |
| - timestamp.InMilliseconds()); |
| - |
| - scoped_refptr<media::VideoFrame> video_frame; |
| - if (frame->GetNativeHandle() != NULL) { |
| - NativeHandleImpl* handle = |
| - static_cast<NativeHandleImpl*>(frame->GetNativeHandle()); |
| - video_frame = static_cast<media::VideoFrame*>(handle->GetHandle()); |
| - video_frame->SetTimestamp(timestamp); |
| - } else { |
| - gfx::Size size(frame->GetWidth(), frame->GetHeight()); |
| - video_frame = media::VideoFrame::CreateFrame( |
| - media::VideoFrame::YV12, size, gfx::Rect(size), size, timestamp); |
| - |
| - // Aspect ratio unsupported; DCHECK when there are non-square pixels. |
| - DCHECK_EQ(frame->GetPixelWidth(), 1u); |
| - DCHECK_EQ(frame->GetPixelHeight(), 1u); |
| - |
| - int y_rows = frame->GetHeight(); |
| - int uv_rows = frame->GetHeight() / 2; // YV12 format. |
| - CopyYPlane( |
| - frame->GetYPlane(), frame->GetYPitch(), y_rows, video_frame.get()); |
| - CopyUPlane( |
| - frame->GetUPlane(), frame->GetUPitch(), uv_rows, video_frame.get()); |
| - CopyVPlane( |
| - frame->GetVPlane(), frame->GetVPitch(), uv_rows, video_frame.get()); |
| +void RTCVideoRenderer::OnVideoFrame( |
| + const scoped_refptr<media::VideoFrame>& frame) { |
| + DCHECK(message_loop_proxy_->BelongsToCurrentThread()); |
| + if (state_ != kStarted) { |
| + return; |
| } |
| - message_loop_proxy_->PostTask( |
| - FROM_HERE, base::Bind(&RTCVideoRenderer::DoRenderFrameOnMainThread, |
| - this, video_frame)); |
| -} |
| - |
| -void RTCVideoRenderer::OnChanged() { |
| - DCHECK(message_loop_proxy_->BelongsToCurrentThread()); |
| - MaybeRenderSignalingFrame(); |
| + // TODO(perkj): How does tracing work? |
| +/* |
| + TRACE_EVENT_INSTANT1("rtc_video_renderer", |
| + "OnVideoFrame", |
| + TRACE_EVENT_SCOPE_THREAD, |
| + "timestamp", |
| + frame->GetTimestamp());*/ |
| + repaint_cb_.Run(frame); |
|
Alpha Left Google
2013/11/26 04:59:32
Great! Love this!
|
| } |
| -void RTCVideoRenderer::MaybeRenderSignalingFrame() { |
| +void RTCVideoRenderer::MaybeRenderSignalingFrame(ReadyState state) { |
| // Render a small black frame if the track transition to ended. |
| // This is necessary to make sure audio can play if the video tag src is |
| // a MediaStream video track that has been rejected or ended. |
| - if (video_track_->state() == webrtc::MediaStreamTrackInterface::kEnded) { |
| + if (state == VideoTrackSink::kEnded) { |
| const int kMinFrameSize = 2; |
| const gfx::Size size(kMinFrameSize, kMinFrameSize); |
| scoped_refptr<media::VideoFrame> video_frame = |
| media::VideoFrame::CreateBlackFrame(size); |
| - DoRenderFrameOnMainThread(video_frame); |
| - } |
| -} |
| - |
| -void RTCVideoRenderer::DoRenderFrameOnMainThread( |
| - scoped_refptr<media::VideoFrame> video_frame) { |
| - DCHECK(message_loop_proxy_->BelongsToCurrentThread()); |
| - |
| - if (state_ != kStarted) { |
| - return; |
| + OnVideoFrame(video_frame); |
| } |
| - |
| - TRACE_EVENT0("video", "DoRenderFrameOnMainThread"); |
|
Alpha Left Google
2013/11/26 04:59:32
Please keep this event. We depend on it to for som
perkj_chrome
2013/11/26 09:16:38
This does seem to make sense with this change. Can
Alpha Left Google
2013/11/26 10:00:47
Okay. Just remove the trace then, we'll handle tha
|
| - repaint_cb_.Run(video_frame); |
| } |
| } // namespace content |