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 |