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

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

Issue 432903002: Change a disabled MediaStreamVideoTrack to output black video frames for each incoming frame. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed Tommis comments. Created 6 years, 4 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
« no previous file with comments | « no previous file | content/renderer/media/media_stream_video_track_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 10
11 namespace content { 11 namespace content {
12 12
13 namespace { 13 namespace {
14 void ResetCallback(scoped_ptr<VideoCaptureDeliverFrameCB> callback) { 14 void ResetCallback(scoped_ptr<VideoCaptureDeliverFrameCB> callback) {
15 // |callback| will be deleted when this exits. 15 // |callback| will be deleted when this exits.
16 } 16 }
17 } // namespace 17 } // namespace
18 18
19 // MediaStreamVideoTrack::FrameDeliverer is a helper class used for registering 19 // MediaStreamVideoTrack::FrameDeliverer is a helper class used for registering
20 // VideoCaptureDeliverFrameCB on the main render thread to receive video frames 20 // VideoCaptureDeliverFrameCB on the main render thread to receive video frames
21 // on the IO-thread. 21 // on the IO-thread.
22 // Frames are only delivered to the sinks if the track is enabled. 22 // Frames are only delivered to the sinks if the track is enabled. If the track
23 // is disabled, a black frame is instead forwarded to the sinks at the same
24 // frame rate.
23 class MediaStreamVideoTrack::FrameDeliverer 25 class MediaStreamVideoTrack::FrameDeliverer
24 : public base::RefCountedThreadSafe<FrameDeliverer> { 26 : public base::RefCountedThreadSafe<FrameDeliverer> {
25 public: 27 public:
26 FrameDeliverer( 28 FrameDeliverer(
27 const scoped_refptr<base::MessageLoopProxy>& io_message_loop, 29 const scoped_refptr<base::MessageLoopProxy>& io_message_loop,
28 bool enabled); 30 bool enabled);
29 31
30 void SetEnabled(bool enabled); 32 void SetEnabled(bool enabled);
31 33
32 // Add |callback| to receive video frames on the IO-thread. 34 // Add |callback| to receive video frames on the IO-thread.
(...skipping 13 matching lines...) Expand all
46 const base::TimeTicks& estimated_capture_time); 48 const base::TimeTicks& estimated_capture_time);
47 49
48 private: 50 private:
49 friend class base::RefCountedThreadSafe<FrameDeliverer>; 51 friend class base::RefCountedThreadSafe<FrameDeliverer>;
50 virtual ~FrameDeliverer(); 52 virtual ~FrameDeliverer();
51 void AddCallbackOnIO(void* id, const VideoCaptureDeliverFrameCB& callback); 53 void AddCallbackOnIO(void* id, const VideoCaptureDeliverFrameCB& callback);
52 void RemoveCallbackOnIO( 54 void RemoveCallbackOnIO(
53 void* id, const scoped_refptr<base::MessageLoopProxy>& message_loop); 55 void* id, const scoped_refptr<base::MessageLoopProxy>& message_loop);
54 56
55 void SetEnabledOnIO(bool enabled); 57 void SetEnabledOnIO(bool enabled);
58 // Returns |black_frame_| where the size and time stamp is set to the same as
59 // as in |reference_frame|.
60 const scoped_refptr<media::VideoFrame>& GetBlackFrame(
61 const scoped_refptr<media::VideoFrame>& reference_frame);
56 62
57 // Used to DCHECK that AddCallback and RemoveCallback are called on the main 63 // Used to DCHECK that AddCallback and RemoveCallback are called on the main
58 // render thread. 64 // render thread.
59 base::ThreadChecker thread_checker_; 65 base::ThreadChecker thread_checker_;
60 scoped_refptr<base::MessageLoopProxy> io_message_loop_; 66 scoped_refptr<base::MessageLoopProxy> io_message_loop_;
61 67
62 bool enabled_; 68 bool enabled_;
69 scoped_refptr<media::VideoFrame> black_frame_;
63 70
64 typedef std::pair<void*, VideoCaptureDeliverFrameCB> VideoIdCallbackPair; 71 typedef std::pair<void*, VideoCaptureDeliverFrameCB> VideoIdCallbackPair;
65 std::vector<VideoIdCallbackPair> callbacks_; 72 std::vector<VideoIdCallbackPair> callbacks_;
66 73
67 DISALLOW_COPY_AND_ASSIGN(FrameDeliverer); 74 DISALLOW_COPY_AND_ASSIGN(FrameDeliverer);
68 }; 75 };
69 76
70 MediaStreamVideoTrack::FrameDeliverer::FrameDeliverer( 77 MediaStreamVideoTrack::FrameDeliverer::FrameDeliverer(
71 const scoped_refptr<base::MessageLoopProxy>& io_message_loop, bool enabled) 78 const scoped_refptr<base::MessageLoopProxy>& io_message_loop, bool enabled)
72 : io_message_loop_(io_message_loop), 79 : io_message_loop_(io_message_loop),
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 DCHECK(thread_checker_.CalledOnValidThread()); 131 DCHECK(thread_checker_.CalledOnValidThread());
125 io_message_loop_->PostTask( 132 io_message_loop_->PostTask(
126 FROM_HERE, 133 FROM_HERE,
127 base::Bind(&FrameDeliverer::SetEnabledOnIO, 134 base::Bind(&FrameDeliverer::SetEnabledOnIO,
128 this, enabled)); 135 this, enabled));
129 } 136 }
130 137
131 void MediaStreamVideoTrack::FrameDeliverer::SetEnabledOnIO(bool enabled) { 138 void MediaStreamVideoTrack::FrameDeliverer::SetEnabledOnIO(bool enabled) {
132 DCHECK(io_message_loop_->BelongsToCurrentThread()); 139 DCHECK(io_message_loop_->BelongsToCurrentThread());
133 enabled_ = enabled; 140 enabled_ = enabled;
141 if (enabled_)
142 black_frame_ = NULL;
134 } 143 }
135 144
136 void MediaStreamVideoTrack::FrameDeliverer::DeliverFrameOnIO( 145 void MediaStreamVideoTrack::FrameDeliverer::DeliverFrameOnIO(
137 const scoped_refptr<media::VideoFrame>& frame, 146 const scoped_refptr<media::VideoFrame>& frame,
138 const media::VideoCaptureFormat& format, 147 const media::VideoCaptureFormat& format,
139 const base::TimeTicks& estimated_capture_time) { 148 const base::TimeTicks& estimated_capture_time) {
140 DCHECK(io_message_loop_->BelongsToCurrentThread()); 149 DCHECK(io_message_loop_->BelongsToCurrentThread());
141 if (!enabled_) 150 const scoped_refptr<media::VideoFrame>& video_frame =
142 return; 151 enabled_ ? frame : GetBlackFrame(frame);
152
143 for (std::vector<VideoIdCallbackPair>::iterator it = callbacks_.begin(); 153 for (std::vector<VideoIdCallbackPair>::iterator it = callbacks_.begin();
144 it != callbacks_.end(); ++it) { 154 it != callbacks_.end(); ++it) {
145 it->second.Run(frame, format, estimated_capture_time); 155 it->second.Run(video_frame, format, estimated_capture_time);
146 } 156 }
147 } 157 }
148 158
159 const scoped_refptr<media::VideoFrame>&
160 MediaStreamVideoTrack::FrameDeliverer::GetBlackFrame(
161 const scoped_refptr<media::VideoFrame>& reference_frame) {
162 DCHECK(io_message_loop_->BelongsToCurrentThread());
163 if (!black_frame_ ||
164 black_frame_->natural_size() != reference_frame->natural_size())
165 black_frame_ =
166 media::VideoFrame::CreateBlackFrame(reference_frame->natural_size());
167
168 black_frame_->set_timestamp(reference_frame->timestamp());
169 return black_frame_;
170 }
171
149 // static 172 // static
150 blink::WebMediaStreamTrack MediaStreamVideoTrack::CreateVideoTrack( 173 blink::WebMediaStreamTrack MediaStreamVideoTrack::CreateVideoTrack(
151 MediaStreamVideoSource* source, 174 MediaStreamVideoSource* source,
152 const blink::WebMediaConstraints& constraints, 175 const blink::WebMediaConstraints& constraints,
153 const MediaStreamVideoSource::ConstraintsCallback& callback, 176 const MediaStreamVideoSource::ConstraintsCallback& callback,
154 bool enabled) { 177 bool enabled) {
155 blink::WebMediaStreamTrack track; 178 blink::WebMediaStreamTrack track;
156 track.initialize(source->owner()); 179 track.initialize(source->owner());
157 track.setExtraData(new MediaStreamVideoTrack(source, 180 track.setExtraData(new MediaStreamVideoTrack(source,
158 constraints, 181 constraints,
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 DCHECK(thread_checker_.CalledOnValidThread()); 266 DCHECK(thread_checker_.CalledOnValidThread());
244 muted_state_ = muted_state; 267 muted_state_ = muted_state;
245 } 268 }
246 269
247 bool MediaStreamVideoTrack::GetMutedState(void) const { 270 bool MediaStreamVideoTrack::GetMutedState(void) const {
248 DCHECK(thread_checker_.CalledOnValidThread()); 271 DCHECK(thread_checker_.CalledOnValidThread());
249 return muted_state_; 272 return muted_state_;
250 } 273 }
251 274
252 } // namespace content 275 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | content/renderer/media/media_stream_video_track_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698