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, |