From 3579cff9dde9029cd0d7246ab7f9126b6ca07bee Mon Sep 17 00:00:00 2001 From: "sergeyu@chromium.org" Date: Fri, 2 May 2014 16:15:42 +0000 Subject: Fix MediaSourceVideoRenderer to generate "live stream" In order for MediaStream to be rendered with 0 delay the stream must be marked as "live". Chrome detects liveness of a stream by presense of DateUTC and also unknown stream duration and size (see crrev.com/266452). Now the renderer properly sets DateUTC element in the stream it generates. Also changed the renderer to add DefaultDuration, which specifies default frame duration. Without it the stream parser has to delay the stream by one frame in order to calculate duration of each frame. BUG=321825 Review URL: https://codereview.chromium.org/266733002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@267807 0039d316-1c4b-4281-b951-d872f2087c98 --- .../client/plugin/media_source_video_renderer.cc | 20 +++++++++++++++++++- remoting/client/plugin/media_source_video_renderer.h | 2 +- 2 files changed, 20 insertions(+), 2 deletions(-) (limited to 'remoting/client') diff --git a/remoting/client/plugin/media_source_video_renderer.cc b/remoting/client/plugin/media_source_video_renderer.cc index f14a61e..5326754 100644 --- a/remoting/client/plugin/media_source_video_renderer.cc +++ b/remoting/client/plugin/media_source_video_renderer.cc @@ -8,6 +8,7 @@ #include "base/callback_helpers.h" #include "base/logging.h" +#include "base/time/time.h" #include "remoting/proto/video.pb.h" #include "remoting/protocol/session_config.h" #include "third_party/libwebm/source/mkvmuxer.hpp" @@ -20,7 +21,7 @@ class MediaSourceVideoRenderer::VideoWriter : public mkvmuxer::IMkvWriter { public: typedef std::vector DataBuffer; - VideoWriter(const webrtc::DesktopSize& frame_size); + explicit VideoWriter(const webrtc::DesktopSize& frame_size); virtual ~VideoWriter(); const webrtc::DesktopSize& size() { return frame_size_; } @@ -52,7 +53,24 @@ MediaSourceVideoRenderer::VideoWriter::VideoWriter( segment_.reset(new mkvmuxer::Segment()); segment_->Init(this); segment_->set_mode(mkvmuxer::Segment::kLive); + + // DateUTC is specified in nanoseconds from 0:00 on January 1st, 2001. + base::Time::Exploded millennium_exploded; + memset(&millennium_exploded, 0, sizeof(millennium_exploded)); + millennium_exploded.year = 2001; + millennium_exploded.month = 1; + millennium_exploded.day_of_month = 1; + segment_->GetSegmentInfo()->set_date_utc( + (base::Time::Now() - base::Time::FromUTCExploded(millennium_exploded)) + .InMicroseconds() * + base::Time::kNanosecondsPerMicrosecond); + segment_->AddVideoTrack(frame_size_.width(), frame_size_.height(), 1); + mkvmuxer::VideoTrack* video_track = + reinterpret_cast(segment_->GetTrackByNumber(1)); + video_track->set_frame_rate(base::Time::kNanosecondsPerSecond / + kFrameIntervalNs); + video_track->set_default_duration(base::Time::kNanosecondsPerSecond); mkvmuxer::SegmentInfo* const info = segment_->GetSegmentInfo(); info->set_writing_app("ChromotingViewer"); info->set_muxing_app("ChromotingViewer"); diff --git a/remoting/client/plugin/media_source_video_renderer.h b/remoting/client/plugin/media_source_video_renderer.h index 2df7758..25d7d07 100644 --- a/remoting/client/plugin/media_source_video_renderer.h +++ b/remoting/client/plugin/media_source_video_renderer.h @@ -41,7 +41,7 @@ class MediaSourceVideoRenderer : public VideoRenderer { virtual void OnMediaSourceData(uint8_t* buffer, size_t buffer_size) = 0; }; - MediaSourceVideoRenderer(Delegate* delegate); + explicit MediaSourceVideoRenderer(Delegate* data_forwarder); virtual ~MediaSourceVideoRenderer(); // VideoRenderer interface. -- cgit v1.1