Chromium Code Reviews| Index: content/renderer/media/media_stream_video_track.cc |
| diff --git a/content/renderer/media/media_stream_video_track.cc b/content/renderer/media/media_stream_video_track.cc |
| index 213d9b6385bd6ce05a71b026ce34399d10ce8507..3cc4486e6332c5fb6f398c3d36da907383f66aa8 100644 |
| --- a/content/renderer/media/media_stream_video_track.cc |
| +++ b/content/renderer/media/media_stream_video_track.cc |
| @@ -19,7 +19,8 @@ void ResetCallback(scoped_ptr<VideoCaptureDeliverFrameCB> callback) { |
| // MediaStreamVideoTrack::FrameDeliverer is a helper class used for registering |
| // VideoCaptureDeliverFrameCB on the main render thread to receive video frames |
| // on the IO-thread. |
| -// Frames are only delivered to the sinks if the track is enabled. |
| +// Frames are only delivered to the sinks if the track is enabled. If the track |
| +// 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
|
| class MediaStreamVideoTrack::FrameDeliverer |
| : public base::RefCountedThreadSafe<FrameDeliverer> { |
| public: |
| @@ -53,6 +54,8 @@ class MediaStreamVideoTrack::FrameDeliverer |
| void* id, const scoped_refptr<base::MessageLoopProxy>& message_loop); |
| void SetEnabledOnIO(bool enabled); |
| + 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.
|
| + const scoped_refptr<media::VideoFrame>& original_frame); |
| // Used to DCHECK that AddCallback and RemoveCallback are called on the main |
| // render thread. |
| @@ -60,6 +63,7 @@ class MediaStreamVideoTrack::FrameDeliverer |
| scoped_refptr<base::MessageLoopProxy> io_message_loop_; |
| bool enabled_; |
| + scoped_refptr<media::VideoFrame> black_frame_; |
| typedef std::pair<void*, VideoCaptureDeliverFrameCB> VideoIdCallbackPair; |
| std::vector<VideoIdCallbackPair> callbacks_; |
| @@ -138,14 +142,26 @@ void MediaStreamVideoTrack::FrameDeliverer::DeliverFrameOnIO( |
| const media::VideoCaptureFormat& format, |
| const base::TimeTicks& estimated_capture_time) { |
| DCHECK(io_message_loop_->BelongsToCurrentThread()); |
| - if (!enabled_) |
| - return; |
| + const scoped_refptr<media::VideoFrame>& video_frame = |
| + enabled_ ? frame : GetBlackFrame(frame); |
| + |
| for (std::vector<VideoIdCallbackPair>::iterator it = callbacks_.begin(); |
| it != callbacks_.end(); ++it) { |
| - it->second.Run(frame, format, estimated_capture_time); |
| + it->second.Run(video_frame, format, estimated_capture_time); |
| } |
| } |
| +const scoped_refptr<media::VideoFrame>& |
| +MediaStreamVideoTrack::FrameDeliverer::GetBlackFrame( |
| + 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:
|
| + DCHECK(io_message_loop_->BelongsToCurrentThread()); |
| + if (!black_frame_ || black_frame_->natural_size() != frame->natural_size()) |
| + black_frame_ = media::VideoFrame::CreateBlackFrame(frame->natural_size()); |
| + |
| + black_frame_->set_timestamp(frame->timestamp()); |
| + return black_frame_; |
| +} |
| + |
| // static |
| blink::WebMediaStreamTrack MediaStreamVideoTrack::CreateVideoTrack( |
| MediaStreamVideoSource* source, |