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 // 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 |