| Index: media/capture/webm_muxer.cc
|
| diff --git a/media/capture/webm_muxer.cc b/media/capture/webm_muxer.cc
|
| index 8f6704101308e3f6e9e1fb6476e4090cfbab5100..0127380eaa13ddac3ffdb847c46f2a702bfd8f46 100644
|
| --- a/media/capture/webm_muxer.cc
|
| +++ b/media/capture/webm_muxer.cc
|
| @@ -6,12 +6,24 @@
|
|
|
| #include <limits>
|
|
|
| +#include "base/bind.h"
|
| +#include "media/base/video_frame.h"
|
| +
|
| namespace media {
|
|
|
| +static double GetFrameRate(const scoped_refptr<VideoFrame>& video_frame) {
|
| + double frame_rate = 0.0f;
|
| + base::IgnoreResult(video_frame->metadata()->GetDouble(
|
| + VideoFrameMetadata::FRAME_RATE, &frame_rate));
|
| + return frame_rate;
|
| +}
|
| +
|
| WebmMuxer::WebmMuxer(const WriteDataCB& write_data_callback)
|
| - : write_data_callback_(write_data_callback),
|
| + : track_index_(0),
|
| + write_data_callback_(write_data_callback),
|
| position_(0) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| + DCHECK(!write_data_callback_.is_null());
|
| segment_.Init(this);
|
| segment_.set_mode(mkvmuxer::Segment::kLive);
|
| segment_.OutputCues(false);
|
| @@ -26,16 +38,35 @@ WebmMuxer::~WebmMuxer() {
|
| segment_.Finalize();
|
| }
|
|
|
| -uint64_t WebmMuxer::AddVideoTrack(const gfx::Size& frame_size,
|
| - double frame_rate) {
|
| +void WebmMuxer::OnEncodedVideo(const scoped_refptr<VideoFrame>& video_frame,
|
| + const base::StringPiece& encoded_data,
|
| + base::TimeTicks timestamp,
|
| + bool is_key_frame) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| + if (!track_index_) {
|
| + // |track_index_|, cannot be zero (!), initialize WebmMuxer in that case.
|
| + // http://www.matroska.org/technical/specs/index.html#Tracks
|
| + AddVideoTrack(video_frame->visible_rect().size(),
|
| + GetFrameRate(video_frame));
|
| + first_frame_timestamp_ = timestamp;
|
| + }
|
| + segment_.AddFrame(reinterpret_cast<const uint8_t*>(encoded_data.data()),
|
| + encoded_data.size(),
|
| + track_index_,
|
| + (timestamp - first_frame_timestamp_).InMilliseconds(),
|
| + is_key_frame);
|
| +}
|
|
|
| - const uint64_t track_index =
|
| +void WebmMuxer::AddVideoTrack(const gfx::Size& frame_size, double frame_rate) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + DCHECK_EQ(track_index_, 0u);
|
| + track_index_ =
|
| segment_.AddVideoTrack(frame_size.width(), frame_size.height(), 0);
|
| + DCHECK_GT(track_index_, 0u);
|
|
|
| mkvmuxer::VideoTrack* const video_track =
|
| reinterpret_cast<mkvmuxer::VideoTrack*>(
|
| - segment_.GetTrackByNumber(track_index));
|
| + segment_.GetTrackByNumber(track_index_));
|
| DCHECK(video_track);
|
| video_track->set_codec_id(mkvmuxer::Tracks::kVp8CodecId);
|
| DCHECK_EQ(video_track->crop_right(), 0ull);
|
| @@ -49,26 +80,11 @@ uint64_t WebmMuxer::AddVideoTrack(const gfx::Size& frame_size,
|
| // Segment's timestamps should be in milliseconds, DCHECK it. See
|
| // http://www.webmproject.org/docs/container/#muxer-guidelines
|
| DCHECK_EQ(segment_.GetSegmentInfo()->timecode_scale(), 1000000ull);
|
| -
|
| - return track_index;
|
| -}
|
| -
|
| -void WebmMuxer::OnEncodedVideo(uint64_t track_number,
|
| - const base::StringPiece& encoded_data,
|
| - base::TimeDelta timestamp,
|
| - bool keyframe) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - // |track_number|, a caller-side identifier, cannot be zero (!), see
|
| - // http://www.matroska.org/technical/specs/index.html#Tracks
|
| - DCHECK_GT(track_number, 0u);
|
| - DCHECK(segment_.GetTrackByNumber(track_number));
|
| -
|
| - segment_.AddFrame(reinterpret_cast<const uint8_t*>(encoded_data.data()),
|
| - encoded_data.size(), track_number, timestamp.InMilliseconds(), keyframe);
|
| }
|
|
|
| mkvmuxer::int32 WebmMuxer::Write(const void* buf, mkvmuxer::uint32 len) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| + DCHECK(buf);
|
| write_data_callback_.Run(base::StringPiece(reinterpret_cast<const char*>(buf),
|
| len));
|
| position_ += len;
|
|
|