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 // Reviewers ? Do you know a better way than to add this noop method? | |
Jói
2014/02/28 14:52:50
You can use base::DoNothing (which is void DoNothi
perkj_chrome
2014/03/02 09:20:44
After discussion- this is needed to addref and rel
| |
15 static void ReleaseOriginalFrame(const scoped_refptr<media::VideoFrame>& frame) { | |
16 | |
17 } | |
18 | |
14 RTCVideoRenderer::RTCVideoRenderer( | 19 RTCVideoRenderer::RTCVideoRenderer( |
15 const blink::WebMediaStreamTrack& video_track, | 20 const blink::WebMediaStreamTrack& video_track, |
16 const base::Closure& error_cb, | 21 const base::Closure& error_cb, |
17 const RepaintCB& repaint_cb) | 22 const RepaintCB& repaint_cb) |
18 : error_cb_(error_cb), | 23 : error_cb_(error_cb), |
19 repaint_cb_(repaint_cb), | 24 repaint_cb_(repaint_cb), |
20 message_loop_proxy_(base::MessageLoopProxy::current()), | 25 message_loop_proxy_(base::MessageLoopProxy::current()), |
21 state_(STOPPED), | 26 state_(STOPPED), |
22 first_frame_rendered_(false), | 27 first_frame_rendered_(false), |
23 video_track_(video_track) { | 28 video_track_(video_track) { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
81 DCHECK(message_loop_proxy_->BelongsToCurrentThread()); | 86 DCHECK(message_loop_proxy_->BelongsToCurrentThread()); |
82 if (state_ != STARTED) { | 87 if (state_ != STARTED) { |
83 return; | 88 return; |
84 } | 89 } |
85 | 90 |
86 TRACE_EVENT_INSTANT1("rtc_video_renderer", | 91 TRACE_EVENT_INSTANT1("rtc_video_renderer", |
87 "OnVideoFrame", | 92 "OnVideoFrame", |
88 TRACE_EVENT_SCOPE_THREAD, | 93 TRACE_EVENT_SCOPE_THREAD, |
89 "timestamp", | 94 "timestamp", |
90 frame->GetTimestamp().InMilliseconds()); | 95 frame->GetTimestamp().InMilliseconds()); |
91 repaint_cb_.Run(frame); | |
92 first_frame_rendered_ = true; | 96 first_frame_rendered_ = true; |
97 | |
98 if (frame->format() == media::VideoFrame::I420) { | |
99 scoped_refptr<media::VideoFrame> yuv_frame = | |
100 media::VideoFrame::WrapExternalYuvData( | |
101 media::VideoFrame::YV12, | |
102 frame->coded_size(), | |
103 frame->visible_rect(), | |
104 frame->natural_size(), | |
105 frame->stride(media::VideoFrame::kYPlane), | |
106 frame->stride(media::VideoFrame::kUPlane), | |
107 frame->stride(media::VideoFrame::kVPlane), | |
108 frame->data(media::VideoFrame::kYPlane), | |
109 frame->data(media::VideoFrame::kUPlane), | |
110 frame->data(media::VideoFrame::kVPlane), | |
111 frame->GetTimestamp(), | |
112 // Can this be done without the function? Ie all I want is to add a refence and remove the reference once this callback is triggered. | |
113 base::Bind(&ReleaseOriginalFrame, frame)); | |
Alpha Left Google
2014/02/28 02:49:22
I'm not sure if this is correct.
Does this callba
Jói
2014/02/28 14:52:50
You've bound both parameters so this wouldn't work
Jói
2014/02/28 15:46:10
My mistake, I was assuming the WrapExternalYuvData
perkj_chrome
2014/03/02 09:20:44
Done.
| |
114 repaint_cb_.Run(yuv_frame); | |
115 } else { | |
116 repaint_cb_.Run(frame); | |
Alpha Left Google
2014/02/28 02:49:22
nit: What about:
if (frame->format() != media::Vi
perkj_chrome
2014/03/02 09:20:44
Done.
| |
117 } | |
93 } | 118 } |
94 | 119 |
95 void RTCVideoRenderer::MaybeRenderSignalingFrame() { | 120 void RTCVideoRenderer::MaybeRenderSignalingFrame() { |
96 // Render a small black frame if no frame has been rendered. | 121 // 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 | 122 // 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. | 123 // a MediaStream video track that has been rejected, ended or disabled. |
99 if (first_frame_rendered_) | 124 if (first_frame_rendered_) |
100 return; | 125 return; |
101 | 126 |
102 const int kMinFrameSize = 2; | 127 const int kMinFrameSize = 2; |
103 const gfx::Size size(kMinFrameSize, kMinFrameSize); | 128 const gfx::Size size(kMinFrameSize, kMinFrameSize); |
104 scoped_refptr<media::VideoFrame> video_frame = | 129 scoped_refptr<media::VideoFrame> video_frame = |
105 media::VideoFrame::CreateBlackFrame(size); | 130 media::VideoFrame::CreateBlackFrame(size); |
106 OnVideoFrame(video_frame); | 131 OnVideoFrame(video_frame); |
107 } | 132 } |
108 | 133 |
109 } // namespace content | 134 } // namespace content |
OLD | NEW |