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 |