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

Side by Side Diff: content/renderer/media/rtc_video_renderer.cc

Issue 264363005: Cast: deliver video frames on the IO thread (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ThreadCheckerImpl Created 6 years, 7 months 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/bind_to_current_loop.h"
9 #include "media/base/video_frame.h" 10 #include "media/base/video_frame.h"
10 #include "media/base/video_util.h" 11 #include "media/base/video_util.h"
11 12
12 const int kMinFrameSize = 2; 13 const int kMinFrameSize = 2;
13 14
14 namespace content { 15 namespace content {
15 16
16 RTCVideoRenderer::RTCVideoRenderer( 17 RTCVideoRenderer::RTCVideoRenderer(
17 const blink::WebMediaStreamTrack& video_track, 18 const blink::WebMediaStreamTrack& video_track,
18 const base::Closure& error_cb, 19 const base::Closure& error_cb,
19 const RepaintCB& repaint_cb) 20 const RepaintCB& repaint_cb)
20 : error_cb_(error_cb), 21 : error_cb_(error_cb),
21 repaint_cb_(repaint_cb), 22 repaint_cb_(repaint_cb),
22 message_loop_proxy_(base::MessageLoopProxy::current()), 23 message_loop_proxy_(base::MessageLoopProxy::current()),
23 state_(STOPPED), 24 state_(STOPPED),
24 frame_size_(kMinFrameSize, kMinFrameSize), 25 frame_size_(kMinFrameSize, kMinFrameSize),
25 video_track_(video_track) { 26 video_track_(video_track),
27 weak_factory_(this) {
26 } 28 }
27 29
28 RTCVideoRenderer::~RTCVideoRenderer() { 30 RTCVideoRenderer::~RTCVideoRenderer() {
29 } 31 }
30 32
31 void RTCVideoRenderer::Start() { 33 void RTCVideoRenderer::Start() {
32 DCHECK(message_loop_proxy_->BelongsToCurrentThread()); 34 DCHECK(message_loop_proxy_->BelongsToCurrentThread());
33 DCHECK_EQ(state_, STOPPED); 35 DCHECK_EQ(state_, STOPPED);
34 36
35 AddToVideoTrack(this, video_track_); 37 AddToVideoTrack(
38 this,
39 media::BindToCurrentLoop(
40 base::Bind(
41 &RTCVideoRenderer::OnVideoFrame,
42 weak_factory_.GetWeakPtr())),
43 video_track_);
36 state_ = STARTED; 44 state_ = STARTED;
37 45
38 if (video_track_.source().readyState() == 46 if (video_track_.source().readyState() ==
39 blink::WebMediaStreamSource::ReadyStateEnded || 47 blink::WebMediaStreamSource::ReadyStateEnded ||
40 !video_track_.isEnabled()) { 48 !video_track_.isEnabled()) {
41 RenderSignalingFrame(); 49 RenderSignalingFrame();
42 } 50 }
43 } 51 }
44 52
45 void RTCVideoRenderer::Stop() { 53 void RTCVideoRenderer::Stop() {
46 DCHECK(message_loop_proxy_->BelongsToCurrentThread()); 54 DCHECK(message_loop_proxy_->BelongsToCurrentThread());
47 DCHECK(state_ == STARTED || state_ == PAUSED); 55 DCHECK(state_ == STARTED || state_ == PAUSED);
48 RemoveFromVideoTrack(this, video_track_); 56 RemoveFromVideoTrack(this, video_track_);
57 weak_factory_.InvalidateWeakPtrs();
49 state_ = STOPPED; 58 state_ = STOPPED;
50 frame_size_.set_width(kMinFrameSize); 59 frame_size_.set_width(kMinFrameSize);
51 frame_size_.set_height(kMinFrameSize); 60 frame_size_.set_height(kMinFrameSize);
52 } 61 }
53 62
54 void RTCVideoRenderer::Play() { 63 void RTCVideoRenderer::Play() {
55 DCHECK(message_loop_proxy_->BelongsToCurrentThread()); 64 DCHECK(message_loop_proxy_->BelongsToCurrentThread());
56 if (state_ == PAUSED) { 65 if (state_ == PAUSED) {
57 state_ = STARTED; 66 state_ = STARTED;
58 } 67 }
(...skipping 13 matching lines...) Expand all
72 RenderSignalingFrame(); 81 RenderSignalingFrame();
73 } 82 }
74 83
75 void RTCVideoRenderer::OnEnabledChanged(bool enabled) { 84 void RTCVideoRenderer::OnEnabledChanged(bool enabled) {
76 DCHECK(message_loop_proxy_->BelongsToCurrentThread()); 85 DCHECK(message_loop_proxy_->BelongsToCurrentThread());
77 if (!enabled) 86 if (!enabled)
78 RenderSignalingFrame(); 87 RenderSignalingFrame();
79 } 88 }
80 89
81 void RTCVideoRenderer::OnVideoFrame( 90 void RTCVideoRenderer::OnVideoFrame(
82 const scoped_refptr<media::VideoFrame>& frame) { 91 const scoped_refptr<media::VideoFrame>& frame,
92 const media::VideoCaptureFormat& format) {
83 DCHECK(message_loop_proxy_->BelongsToCurrentThread()); 93 DCHECK(message_loop_proxy_->BelongsToCurrentThread());
84 if (state_ != STARTED) { 94 if (state_ != STARTED) {
85 return; 95 return;
86 } 96 }
87 97
88 frame_size_ = frame->natural_size(); 98 frame_size_ = frame->natural_size();
89 99
90 TRACE_EVENT_INSTANT1("rtc_video_renderer", 100 TRACE_EVENT_INSTANT1("rtc_video_renderer",
91 "OnVideoFrame", 101 "OnVideoFrame",
92 TRACE_EVENT_SCOPE_THREAD, 102 TRACE_EVENT_SCOPE_THREAD,
93 "timestamp", 103 "timestamp",
94 frame->timestamp().InMilliseconds()); 104 frame->timestamp().InMilliseconds());
95 repaint_cb_.Run(frame); 105 repaint_cb_.Run(frame);
96 } 106 }
97 107
98 void RTCVideoRenderer::RenderSignalingFrame() { 108 void RTCVideoRenderer::RenderSignalingFrame() {
99 // This is necessary to make sure audio can play if the video tag src is 109 // This is necessary to make sure audio can play if the video tag src is
100 // a MediaStream video track that has been rejected, ended or disabled. 110 // a MediaStream video track that has been rejected, ended or disabled.
101 // It also ensure that the renderer don't hold a reference to a real video 111 // It also ensure that the renderer don't hold a reference to a real video
102 // frame if no more frames are provided. This is since there might be a 112 // frame if no more frames are provided. This is since there might be a
103 // finite number of available buffers. E.g, video that 113 // finite number of available buffers. E.g, video that
104 // originates from a video camera. 114 // originates from a video camera.
105 scoped_refptr<media::VideoFrame> video_frame = 115 scoped_refptr<media::VideoFrame> video_frame =
106 media::VideoFrame::CreateBlackFrame(frame_size_); 116 media::VideoFrame::CreateBlackFrame(frame_size_);
107 OnVideoFrame(video_frame); 117 OnVideoFrame(video_frame, media::VideoCaptureFormat());
108 } 118 }
109 119
110 } // namespace content 120 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/rtc_video_renderer.h ('k') | content/renderer/media/video_frame_deliverer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698