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

Side by Side Diff: content/renderer/media/media_stream_video_track.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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/media_stream_video_track.h" 5 #include "content/renderer/media/media_stream_video_track.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "content/renderer/media/video_frame_deliverer.h" 8 #include "content/renderer/media/video_frame_deliverer.h"
9 #include "media/base/bind_to_current_loop.h" 9 #include "media/base/bind_to_current_loop.h"
10 10
11 namespace content { 11 namespace content {
12 12
13 // Helper class used for delivering video frames to MediaStreamSinks on the 13 // Helper class used for delivering video frames to MediaStreamSinks on the
14 // IO-thread and MediaStreamVideoSinks on the main render thread. 14 // IO-thread.
15 // Frames are delivered to an instance of this class from a 15 // Frames are delivered to an instance of this class from a
16 // MediaStreamVideoSource on the IO-thread to the method DeliverFrameOnIO. 16 // MediaStreamVideoSource on the IO-thread to the method DeliverFrameOnIO.
17 // Frames are only delivered to the sinks if the track is enabled. 17 // Frames are only delivered to the sinks if the track is enabled.
18 class MediaStreamVideoTrack::FrameDeliverer : public VideoFrameDeliverer { 18 class MediaStreamVideoTrack::FrameDeliverer : public VideoFrameDeliverer {
19 public: 19 public:
20 FrameDeliverer( 20 FrameDeliverer(
21 const scoped_refptr<base::MessageLoopProxy>& io_message_loop_proxy, 21 const scoped_refptr<base::MessageLoopProxy>& io_message_loop_proxy,
22 bool enabled) 22 bool enabled)
23 : VideoFrameDeliverer(io_message_loop_proxy), 23 : VideoFrameDeliverer(io_message_loop_proxy),
24 enabled_(enabled) { 24 enabled_(enabled) {
25 } 25 }
26 26
27 // Add |sink| to receive frames and state changes on the main render thread. 27 // Add |sink| to receive state changes on the main render thread.
28 void AddSink(MediaStreamVideoSink* sink) { 28 // Video frames will be delivered to |callback| on the IO thread.
29 void AddSink(MediaStreamVideoSink* sink,
30 const VideoCaptureDeliverFrameCB& callback) {
29 DCHECK(thread_checker().CalledOnValidThread()); 31 DCHECK(thread_checker().CalledOnValidThread());
30 DCHECK(std::find(sinks_.begin(), sinks_.end(), sink) == sinks_.end()); 32 DCHECK(std::find(sinks_.begin(), sinks_.end(), sink) == sinks_.end());
31 if (sinks_.empty()) {
32 VideoCaptureDeliverFrameCB frame_callback = media::BindToCurrentLoop(
33 base::Bind(
34 &MediaStreamVideoTrack::FrameDeliverer::OnVideoFrameOnMainThread,
35 this));
36 AddCallback(this, frame_callback);
37 }
38
39 sinks_.push_back(sink); 33 sinks_.push_back(sink);
34 AddCallback(sink, callback);
40 } 35 }
41 36
42 void RemoveSink(MediaStreamVideoSink* sink) { 37 void RemoveSink(MediaStreamVideoSink* sink) {
43 DCHECK(thread_checker().CalledOnValidThread()); 38 DCHECK(thread_checker().CalledOnValidThread());
44 std::vector<MediaStreamVideoSink*>::iterator it = 39 std::vector<MediaStreamVideoSink*>::iterator it =
45 std::find(sinks_.begin(), sinks_.end(), sink); 40 std::find(sinks_.begin(), sinks_.end(), sink);
46 DCHECK(it != sinks_.end()); 41 DCHECK(it != sinks_.end());
47 sinks_.erase(it); 42 sinks_.erase(it);
48 if (sinks_.empty()) { 43 RemoveCallback(sink);
49 RemoveCallback(this);
50 }
51 }
52
53 // Called when a video frame is received on the main render thread.
54 // It delivers the received frames to the registered MediaStreamVideo sinks.
55 void OnVideoFrameOnMainThread(
56 const scoped_refptr<media::VideoFrame>& frame,
57 const media::VideoCaptureFormat& format) {
58 DCHECK(thread_checker().CalledOnValidThread());
59 for (std::vector<MediaStreamVideoSink*>::iterator it = sinks_.begin();
60 it != sinks_.end(); ++it) {
61 (*it)->OnVideoFrame(frame);
62 }
63 } 44 }
64 45
65 void SetEnabled(bool enabled) { 46 void SetEnabled(bool enabled) {
66 DCHECK(thread_checker().CalledOnValidThread()); 47 DCHECK(thread_checker().CalledOnValidThread());
67 io_message_loop()->PostTask( 48 io_message_loop()->PostTask(
68 FROM_HERE, 49 FROM_HERE,
69 base::Bind(&MediaStreamVideoTrack::FrameDeliverer::SetEnabledOnIO, 50 base::Bind(&MediaStreamVideoTrack::FrameDeliverer::SetEnabledOnIO,
70 this, enabled)); 51 this, enabled));
71 } 52 }
72 53
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 &MediaStreamVideoTrack::FrameDeliverer::DeliverFrameOnIO, 119 &MediaStreamVideoTrack::FrameDeliverer::DeliverFrameOnIO,
139 frame_deliverer_), 120 frame_deliverer_),
140 constraints, callback); 121 constraints, callback);
141 } 122 }
142 123
143 MediaStreamVideoTrack::~MediaStreamVideoTrack() { 124 MediaStreamVideoTrack::~MediaStreamVideoTrack() {
144 Stop(); 125 Stop();
145 DVLOG(3) << "~MediaStreamVideoTrack()"; 126 DVLOG(3) << "~MediaStreamVideoTrack()";
146 } 127 }
147 128
148 void MediaStreamVideoTrack::AddSink(MediaStreamVideoSink* sink) { 129 void MediaStreamVideoTrack::AddSink(
130 MediaStreamVideoSink* sink, const VideoCaptureDeliverFrameCB& callback) {
149 DCHECK(thread_checker_.CalledOnValidThread()); 131 DCHECK(thread_checker_.CalledOnValidThread());
150 frame_deliverer_->AddSink(sink); 132 frame_deliverer_->AddSink(sink, callback);
151 } 133 }
152 134
153 void MediaStreamVideoTrack::RemoveSink(MediaStreamVideoSink* sink) { 135 void MediaStreamVideoTrack::RemoveSink(MediaStreamVideoSink* sink) {
154 DCHECK(thread_checker_.CalledOnValidThread()); 136 DCHECK(thread_checker_.CalledOnValidThread());
155 frame_deliverer_->RemoveSink(sink); 137 frame_deliverer_->RemoveSink(sink);
156 } 138 }
157 139
158 void MediaStreamVideoTrack::AddSink(
159 MediaStreamSink* sink, const VideoCaptureDeliverFrameCB& callback) {
160 DCHECK(thread_checker_.CalledOnValidThread());
161 frame_deliverer_->AddCallback(sink, callback);
162 }
163
164 void MediaStreamVideoTrack::RemoveSink(MediaStreamSink* sink) {
165 DCHECK(thread_checker_.CalledOnValidThread());
166 frame_deliverer_->RemoveCallback(sink);
167 }
168
169 void MediaStreamVideoTrack::SetEnabled(bool enabled) { 140 void MediaStreamVideoTrack::SetEnabled(bool enabled) {
170 DCHECK(thread_checker_.CalledOnValidThread()); 141 DCHECK(thread_checker_.CalledOnValidThread());
171 MediaStreamTrack::SetEnabled(enabled); 142 MediaStreamTrack::SetEnabled(enabled);
172 143
173 frame_deliverer_->SetEnabled(enabled); 144 frame_deliverer_->SetEnabled(enabled);
174 const std::vector<MediaStreamVideoSink*>& sinks = frame_deliverer_->sinks(); 145 const std::vector<MediaStreamVideoSink*>& sinks = frame_deliverer_->sinks();
175 for (std::vector<MediaStreamVideoSink*>::const_iterator it = sinks.begin(); 146 for (std::vector<MediaStreamVideoSink*>::const_iterator it = sinks.begin();
176 it != sinks.end(); ++it) { 147 it != sinks.end(); ++it) {
177 (*it)->OnEnabledChanged(enabled); 148 (*it)->OnEnabledChanged(enabled);
178 } 149 }
(...skipping 12 matching lines...) Expand all
191 blink::WebMediaStreamSource::ReadyState state) { 162 blink::WebMediaStreamSource::ReadyState state) {
192 DCHECK(thread_checker_.CalledOnValidThread()); 163 DCHECK(thread_checker_.CalledOnValidThread());
193 const std::vector<MediaStreamVideoSink*>& sinks = frame_deliverer_->sinks(); 164 const std::vector<MediaStreamVideoSink*>& sinks = frame_deliverer_->sinks();
194 for (std::vector<MediaStreamVideoSink*>::const_iterator it = sinks.begin(); 165 for (std::vector<MediaStreamVideoSink*>::const_iterator it = sinks.begin();
195 it != sinks.end(); ++it) { 166 it != sinks.end(); ++it) {
196 (*it)->OnReadyStateChanged(state); 167 (*it)->OnReadyStateChanged(state);
197 } 168 }
198 } 169 }
199 170
200 } // namespace content 171 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/media_stream_video_track.h ('k') | content/renderer/media/media_stream_video_track_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698