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