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

Unified 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | content/renderer/media/media_stream_video_track_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..47677d9128c8cbd65cf6a9179645a176fa2a1a75 100644
--- a/content/renderer/media/media_stream_video_track.cc
+++ b/content/renderer/media/media_stream_video_track.cc
@@ -19,7 +19,9 @@ 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 at the same
+// frame rate.
class MediaStreamVideoTrack::FrameDeliverer
: public base::RefCountedThreadSafe<FrameDeliverer> {
public:
@@ -53,6 +55,10 @@ class MediaStreamVideoTrack::FrameDeliverer
void* id, const scoped_refptr<base::MessageLoopProxy>& message_loop);
void SetEnabledOnIO(bool enabled);
+ // Returns |black_frame_| where the size and time stamp is set to the same as
+ // as in |reference_frame|.
+ const scoped_refptr<media::VideoFrame>& GetBlackFrame(
+ const scoped_refptr<media::VideoFrame>& reference_frame);
// Used to DCHECK that AddCallback and RemoveCallback are called on the main
// render thread.
@@ -60,6 +66,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_;
@@ -131,6 +138,8 @@ void MediaStreamVideoTrack::FrameDeliverer::SetEnabled(bool enabled) {
void MediaStreamVideoTrack::FrameDeliverer::SetEnabledOnIO(bool enabled) {
DCHECK(io_message_loop_->BelongsToCurrentThread());
enabled_ = enabled;
+ if (enabled_)
+ black_frame_ = NULL;
}
void MediaStreamVideoTrack::FrameDeliverer::DeliverFrameOnIO(
@@ -138,14 +147,28 @@ 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>& reference_frame) {
+ DCHECK(io_message_loop_->BelongsToCurrentThread());
+ if (!black_frame_ ||
+ black_frame_->natural_size() != reference_frame->natural_size())
+ black_frame_ =
+ media::VideoFrame::CreateBlackFrame(reference_frame->natural_size());
+
+ black_frame_->set_timestamp(reference_frame->timestamp());
+ return black_frame_;
+}
+
// static
blink::WebMediaStreamTrack MediaStreamVideoTrack::CreateVideoTrack(
MediaStreamVideoSource* source,
« 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