Chromium Code Reviews| Index: remoting/client/plugin/media_source_video_renderer.cc |
| diff --git a/remoting/client/plugin/media_source_video_renderer.cc b/remoting/client/plugin/media_source_video_renderer.cc |
| index 817df11c7ac546fa31249e298d10b8b994254c1c..a2eb5dd679ba1edbfe185777581f3c43e0dbdf6f 100644 |
| --- a/remoting/client/plugin/media_source_video_renderer.cc |
| +++ b/remoting/client/plugin/media_source_video_renderer.cc |
| @@ -35,7 +35,8 @@ class MediaSourceVideoRenderer::VideoWriter : public mkvmuxer::IMkvWriter { |
| virtual void ElementStartNotify(mkvmuxer::uint64 element_id, |
| mkvmuxer::int64 position) OVERRIDE; |
| - scoped_ptr<DataBuffer> OnVideoFrame(const std::string& video_data); |
| + scoped_ptr<DataBuffer> OnVideoFrame(const std::string& video_data, |
| + bool keyframe); |
| private: |
| webrtc::DesktopSize frame_size_; |
| @@ -53,6 +54,8 @@ MediaSourceVideoRenderer::VideoWriter::VideoWriter( |
| segment_.reset(new mkvmuxer::Segment()); |
| segment_->Init(this); |
| segment_->set_mode(mkvmuxer::Segment::kLive); |
| + segment_->set_max_cluster_duration(0); |
| + segment_->set_max_cluster_size(0); |
|
Jamie
2014/06/11 21:41:42
I don't understand what these lines do. Are they c
Sergey Ulanov
2014/06/11 23:41:12
That was my attempt to workaround crbug.com/382807
|
| // DateUTC is specified in nanoseconds from 0:00 on January 1st, 2001. |
| base::Time::Exploded millennium_exploded; |
| @@ -86,7 +89,7 @@ MediaSourceVideoRenderer::VideoWriter::VideoWriter( |
| video_track->set_crop_bottom(crop_bottom); |
| video_track->set_frame_rate(base::Time::kNanosecondsPerSecond / |
| kFrameIntervalNs); |
| - video_track->set_default_duration(base::Time::kNanosecondsPerSecond); |
| + video_track->set_default_duration(kFrameIntervalNs); |
| mkvmuxer::SegmentInfo* const info = segment_->GetSegmentInfo(); |
| info->set_writing_app("ChromotingViewer"); |
| info->set_muxing_app("ChromotingViewer"); |
| @@ -124,13 +127,13 @@ void MediaSourceVideoRenderer::VideoWriter::ElementStartNotify( |
| scoped_ptr<MediaSourceVideoRenderer::VideoWriter::DataBuffer> |
| MediaSourceVideoRenderer::VideoWriter::OnVideoFrame( |
| - const std::string& video_data) { |
| + const std::string& video_data, |
| + bool keyframe) { |
| DCHECK(!output_data_); |
| output_data_.reset(new DataBuffer()); |
| - bool first_frame = (timecode_ == 0); |
| segment_->AddFrame(reinterpret_cast<const uint8_t*>(video_data.data()), |
| - video_data.size(), 1, timecode_, first_frame); |
| + video_data.size(), 1, timecode_, keyframe); |
| timecode_ += kFrameIntervalNs; |
| return output_data_.Pass(); |
| } |
| @@ -215,9 +218,12 @@ void MediaSourceVideoRenderer::ProcessVideoPacket( |
| delegate_->OnMediaSourceShape(desktop_shape_); |
| } |
| + // First bit indicates I-frames. |
|
Jamie
2014/06/11 21:41:42
s/I/key/?
Sergey Ulanov
2014/06/11 23:41:12
Done.
|
| + bool keyframe = (packet->data()[0] & 1) == 0; |
| + |
| scoped_ptr<VideoWriter::DataBuffer> buffer = |
| - writer_->OnVideoFrame(packet->data()); |
| - delegate_->OnMediaSourceData(&(*(buffer->begin())), buffer->size()); |
| + writer_->OnVideoFrame(packet->data(), keyframe); |
| + delegate_->OnMediaSourceData(&(*(buffer->begin())), buffer->size(), keyframe); |
| } |
| } // namespace remoting |