Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Unified Diff: content/renderer/media/rtc_video_renderer.cc

Issue 83023005: Add VideoTrackSink interface to content/public (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix merge error Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/renderer/media/rtc_video_renderer.h ('k') | content/renderer/media/webrtc/OWNERS » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..5ea461f693553351309042bfbec7dd3a7a11c812 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(video_track_.source().readyState());
}
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);
- }
+ AddToVideoTrack(this, 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;
- }
+ RemoveFromVideoTrack(this, 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::OnReadyStateChanged(
+ blink::WebMediaStreamSource::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",
- "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();
+ TRACE_EVENT_INSTANT1("rtc_video_renderer",
+ "OnVideoFrame",
+ TRACE_EVENT_SCOPE_THREAD,
+ "timestamp",
+ frame->GetTimestamp().InMilliseconds());
+ repaint_cb_.Run(frame);
}
-void RTCVideoRenderer::MaybeRenderSignalingFrame() {
+void RTCVideoRenderer::MaybeRenderSignalingFrame(
+ blink::WebMediaStreamSource::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 == blink::WebMediaStreamSource::ReadyStateEnded) {
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");
- repaint_cb_.Run(video_frame);
}
} // namespace content
« no previous file with comments | « content/renderer/media/rtc_video_renderer.h ('k') | content/renderer/media/webrtc/OWNERS » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698