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

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: rebased 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
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.
tommi (sloooow) - chröme 2014/08/05 09:50:46 is fps relevant in this situation? I.e. if the tr
perkj_chrome 2014/08/06 12:32:22 Yes. That is intentional. To my understanding - th
23 class MediaStreamVideoTrack::FrameDeliverer 24 class MediaStreamVideoTrack::FrameDeliverer
24 : public base::RefCountedThreadSafe<FrameDeliverer> { 25 : public base::RefCountedThreadSafe<FrameDeliverer> {
25 public: 26 public:
26 FrameDeliverer( 27 FrameDeliverer(
27 const scoped_refptr<base::MessageLoopProxy>& io_message_loop, 28 const scoped_refptr<base::MessageLoopProxy>& io_message_loop,
28 bool enabled); 29 bool enabled);
29 30
30 void SetEnabled(bool enabled); 31 void SetEnabled(bool enabled);
31 32
32 // Add |callback| to receive video frames on the IO-thread. 33 // Add |callback| to receive video frames on the IO-thread.
(...skipping 13 matching lines...) Expand all
46 const base::TimeTicks& estimated_capture_time); 47 const base::TimeTicks& estimated_capture_time);
47 48
48 private: 49 private:
49 friend class base::RefCountedThreadSafe<FrameDeliverer>; 50 friend class base::RefCountedThreadSafe<FrameDeliverer>;
50 virtual ~FrameDeliverer(); 51 virtual ~FrameDeliverer();
51 void AddCallbackOnIO(void* id, const VideoCaptureDeliverFrameCB& callback); 52 void AddCallbackOnIO(void* id, const VideoCaptureDeliverFrameCB& callback);
52 void RemoveCallbackOnIO( 53 void RemoveCallbackOnIO(
53 void* id, const scoped_refptr<base::MessageLoopProxy>& message_loop); 54 void* id, const scoped_refptr<base::MessageLoopProxy>& message_loop);
54 55
55 void SetEnabledOnIO(bool enabled); 56 void SetEnabledOnIO(bool enabled);
57 const scoped_refptr<media::VideoFrame>& GetBlackFrame(
tommi (sloooow) - chröme 2014/08/05 09:50:46 can you document this function? The use of scoped
perkj_chrome 2014/08/06 12:32:22 Done.
58 const scoped_refptr<media::VideoFrame>& original_frame);
56 59
57 // Used to DCHECK that AddCallback and RemoveCallback are called on the main 60 // Used to DCHECK that AddCallback and RemoveCallback are called on the main
58 // render thread. 61 // render thread.
59 base::ThreadChecker thread_checker_; 62 base::ThreadChecker thread_checker_;
60 scoped_refptr<base::MessageLoopProxy> io_message_loop_; 63 scoped_refptr<base::MessageLoopProxy> io_message_loop_;
61 64
62 bool enabled_; 65 bool enabled_;
66 scoped_refptr<media::VideoFrame> black_frame_;
63 67
64 typedef std::pair<void*, VideoCaptureDeliverFrameCB> VideoIdCallbackPair; 68 typedef std::pair<void*, VideoCaptureDeliverFrameCB> VideoIdCallbackPair;
65 std::vector<VideoIdCallbackPair> callbacks_; 69 std::vector<VideoIdCallbackPair> callbacks_;
66 70
67 DISALLOW_COPY_AND_ASSIGN(FrameDeliverer); 71 DISALLOW_COPY_AND_ASSIGN(FrameDeliverer);
68 }; 72 };
69 73
70 MediaStreamVideoTrack::FrameDeliverer::FrameDeliverer( 74 MediaStreamVideoTrack::FrameDeliverer::FrameDeliverer(
71 const scoped_refptr<base::MessageLoopProxy>& io_message_loop, bool enabled) 75 const scoped_refptr<base::MessageLoopProxy>& io_message_loop, bool enabled)
72 : io_message_loop_(io_message_loop), 76 : io_message_loop_(io_message_loop),
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 void MediaStreamVideoTrack::FrameDeliverer::SetEnabledOnIO(bool enabled) { 135 void MediaStreamVideoTrack::FrameDeliverer::SetEnabledOnIO(bool enabled) {
132 DCHECK(io_message_loop_->BelongsToCurrentThread()); 136 DCHECK(io_message_loop_->BelongsToCurrentThread());
133 enabled_ = enabled; 137 enabled_ = enabled;
134 } 138 }
135 139
136 void MediaStreamVideoTrack::FrameDeliverer::DeliverFrameOnIO( 140 void MediaStreamVideoTrack::FrameDeliverer::DeliverFrameOnIO(
137 const scoped_refptr<media::VideoFrame>& frame, 141 const scoped_refptr<media::VideoFrame>& frame,
138 const media::VideoCaptureFormat& format, 142 const media::VideoCaptureFormat& format,
139 const base::TimeTicks& estimated_capture_time) { 143 const base::TimeTicks& estimated_capture_time) {
140 DCHECK(io_message_loop_->BelongsToCurrentThread()); 144 DCHECK(io_message_loop_->BelongsToCurrentThread());
141 if (!enabled_) 145 const scoped_refptr<media::VideoFrame>& video_frame =
142 return; 146 enabled_ ? frame : GetBlackFrame(frame);
147
143 for (std::vector<VideoIdCallbackPair>::iterator it = callbacks_.begin(); 148 for (std::vector<VideoIdCallbackPair>::iterator it = callbacks_.begin();
144 it != callbacks_.end(); ++it) { 149 it != callbacks_.end(); ++it) {
145 it->second.Run(frame, format, estimated_capture_time); 150 it->second.Run(video_frame, format, estimated_capture_time);
146 } 151 }
147 } 152 }
148 153
154 const scoped_refptr<media::VideoFrame>&
155 MediaStreamVideoTrack::FrameDeliverer::GetBlackFrame(
156 const scoped_refptr<media::VideoFrame>& frame) {
tommi (sloooow) - chröme 2014/08/05 09:50:46 different parameter name here than from the header
perkj_chrome 2014/08/06 12:32:22 done:
157 DCHECK(io_message_loop_->BelongsToCurrentThread());
158 if (!black_frame_ || black_frame_->natural_size() != frame->natural_size())
159 black_frame_ = media::VideoFrame::CreateBlackFrame(frame->natural_size());
160
161 black_frame_->set_timestamp(frame->timestamp());
162 return black_frame_;
163 }
164
149 // static 165 // static
150 blink::WebMediaStreamTrack MediaStreamVideoTrack::CreateVideoTrack( 166 blink::WebMediaStreamTrack MediaStreamVideoTrack::CreateVideoTrack(
151 MediaStreamVideoSource* source, 167 MediaStreamVideoSource* source,
152 const blink::WebMediaConstraints& constraints, 168 const blink::WebMediaConstraints& constraints,
153 const MediaStreamVideoSource::ConstraintsCallback& callback, 169 const MediaStreamVideoSource::ConstraintsCallback& callback,
154 bool enabled) { 170 bool enabled) {
155 blink::WebMediaStreamTrack track; 171 blink::WebMediaStreamTrack track;
156 track.initialize(source->owner()); 172 track.initialize(source->owner());
157 track.setExtraData(new MediaStreamVideoTrack(source, 173 track.setExtraData(new MediaStreamVideoTrack(source,
158 constraints, 174 constraints,
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 DCHECK(thread_checker_.CalledOnValidThread()); 259 DCHECK(thread_checker_.CalledOnValidThread());
244 muted_state_ = muted_state; 260 muted_state_ = muted_state;
245 } 261 }
246 262
247 bool MediaStreamVideoTrack::GetMutedState(void) const { 263 bool MediaStreamVideoTrack::GetMutedState(void) const {
248 DCHECK(thread_checker_.CalledOnValidThread()); 264 DCHECK(thread_checker_.CalledOnValidThread());
249 return muted_state_; 265 return muted_state_;
250 } 266 }
251 267
252 } // namespace content 268 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698