Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/media/rtc_video_renderer.h" | 5 #include "content/renderer/media/rtc_video_renderer.h" |
| 6 | 6 |
| 7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
| 8 #include "base/message_loop/message_loop_proxy.h" | 8 #include "base/message_loop/message_loop_proxy.h" |
| 9 #include "media/base/video_frame.h" | 9 #include "media/base/video_frame.h" |
| 10 #include "media/base/video_util.h" | 10 #include "media/base/video_util.h" |
| 11 | 11 |
| 12 namespace content { | 12 namespace content { |
| 13 | 13 |
| 14 // Empty method used for keeping a reference to the original media::VideoFrame | |
| 15 // in RTCVideoRenderer::OnVideoFrame if a color conversion between I420 and | |
| 16 // YV12 is needed. | |
| 17 static void ReleaseOriginalFrame( | |
| 18 const scoped_refptr<media::VideoFrame>& frame) { | |
| 19 } | |
| 20 | |
| 14 RTCVideoRenderer::RTCVideoRenderer( | 21 RTCVideoRenderer::RTCVideoRenderer( |
| 15 const blink::WebMediaStreamTrack& video_track, | 22 const blink::WebMediaStreamTrack& video_track, |
| 16 const base::Closure& error_cb, | 23 const base::Closure& error_cb, |
| 17 const RepaintCB& repaint_cb) | 24 const RepaintCB& repaint_cb) |
| 18 : error_cb_(error_cb), | 25 : error_cb_(error_cb), |
| 19 repaint_cb_(repaint_cb), | 26 repaint_cb_(repaint_cb), |
| 20 message_loop_proxy_(base::MessageLoopProxy::current()), | 27 message_loop_proxy_(base::MessageLoopProxy::current()), |
| 21 state_(STOPPED), | 28 state_(STOPPED), |
| 22 first_frame_rendered_(false), | 29 first_frame_rendered_(false), |
| 23 video_track_(video_track) { | 30 video_track_(video_track) { |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 81 DCHECK(message_loop_proxy_->BelongsToCurrentThread()); | 88 DCHECK(message_loop_proxy_->BelongsToCurrentThread()); |
| 82 if (state_ != STARTED) { | 89 if (state_ != STARTED) { |
| 83 return; | 90 return; |
| 84 } | 91 } |
| 85 | 92 |
| 86 TRACE_EVENT_INSTANT1("rtc_video_renderer", | 93 TRACE_EVENT_INSTANT1("rtc_video_renderer", |
| 87 "OnVideoFrame", | 94 "OnVideoFrame", |
| 88 TRACE_EVENT_SCOPE_THREAD, | 95 TRACE_EVENT_SCOPE_THREAD, |
| 89 "timestamp", | 96 "timestamp", |
| 90 frame->GetTimestamp().InMilliseconds()); | 97 frame->GetTimestamp().InMilliseconds()); |
| 91 repaint_cb_.Run(frame); | |
| 92 first_frame_rendered_ = true; | 98 first_frame_rendered_ = true; |
| 99 | |
| 100 if (frame->format() != media::VideoFrame::I420) { | |
| 101 repaint_cb_.Run(frame); | |
|
Ronghua Wu (Left Chromium)
2014/03/04 01:04:11
what formats are expected here?
It seems YV12 wil
perkj_chrome
2014/03/04 10:44:51
That is correct. We need to special handle I420. S
| |
| 102 return; | |
| 103 } | |
| 104 | |
| 105 scoped_refptr<media::VideoFrame> yuv_frame = | |
|
Alpha Left Google
2014/03/03 06:45:04
A comment would help to explain what this is doing
perkj_chrome
2014/03/04 10:44:51
Done.
| |
| 106 media::VideoFrame::WrapExternalYuvData( | |
| 107 media::VideoFrame::YV12, | |
| 108 frame->coded_size(), | |
| 109 frame->visible_rect(), | |
| 110 frame->natural_size(), | |
| 111 frame->stride(media::VideoFrame::kYPlane), | |
| 112 frame->stride(media::VideoFrame::kUPlane), | |
| 113 frame->stride(media::VideoFrame::kVPlane), | |
| 114 frame->data(media::VideoFrame::kYPlane), | |
| 115 frame->data(media::VideoFrame::kUPlane), | |
| 116 frame->data(media::VideoFrame::kVPlane), | |
| 117 frame->GetTimestamp(), | |
| 118 base::Bind(&ReleaseOriginalFrame, frame)); | |
| 119 repaint_cb_.Run(yuv_frame); | |
| 93 } | 120 } |
| 94 | 121 |
| 95 void RTCVideoRenderer::MaybeRenderSignalingFrame() { | 122 void RTCVideoRenderer::MaybeRenderSignalingFrame() { |
| 96 // Render a small black frame if no frame has been rendered. | 123 // Render a small black frame if no frame has been rendered. |
| 97 // This is necessary to make sure audio can play if the video tag src is | 124 // This is necessary to make sure audio can play if the video tag src is |
| 98 // a MediaStream video track that has been rejected, ended or disabled. | 125 // a MediaStream video track that has been rejected, ended or disabled. |
| 99 if (first_frame_rendered_) | 126 if (first_frame_rendered_) |
| 100 return; | 127 return; |
| 101 | 128 |
| 102 const int kMinFrameSize = 2; | 129 const int kMinFrameSize = 2; |
| 103 const gfx::Size size(kMinFrameSize, kMinFrameSize); | 130 const gfx::Size size(kMinFrameSize, kMinFrameSize); |
| 104 scoped_refptr<media::VideoFrame> video_frame = | 131 scoped_refptr<media::VideoFrame> video_frame = |
| 105 media::VideoFrame::CreateBlackFrame(size); | 132 media::VideoFrame::CreateBlackFrame(size); |
| 106 OnVideoFrame(video_frame); | 133 OnVideoFrame(video_frame); |
| 107 } | 134 } |
| 108 | 135 |
| 109 } // namespace content | 136 } // namespace content |
| OLD | NEW |