| Index: content/renderer/media/video_track_recorder.cc | 
| diff --git a/content/renderer/media/video_track_recorder.cc b/content/renderer/media/video_track_recorder.cc | 
| index 52368b386050c4829e92b9fea755ddec32d54f9a..a2755bddeb224fcbc0e1dc7cfb3a7a1c340ef79a 100644 | 
| --- a/content/renderer/media/video_track_recorder.cc | 
| +++ b/content/renderer/media/video_track_recorder.cc | 
| @@ -75,7 +75,7 @@ class VideoTrackRecorder::VpxEncoder final | 
| static void ShutdownEncoder(scoped_ptr<base::Thread> encoding_thread, | 
| ScopedVpxCodecCtxPtr encoder); | 
|  | 
| -  explicit VpxEncoder(const OnEncodedVideoCB& on_encoded_video_callback); | 
| +  VpxEncoder(bool use_vp9, const OnEncodedVideoCB& on_encoded_video_callback); | 
|  | 
| void StartFrameEncode(const scoped_refptr<VideoFrame>& frame, | 
| base::TimeTicks capture_timestamp); | 
| @@ -87,7 +87,7 @@ class VideoTrackRecorder::VpxEncoder final | 
| void EncodeOnEncodingThread(const scoped_refptr<VideoFrame>& frame, | 
| base::TimeTicks capture_timestamp); | 
|  | 
| -  void ConfigureVp8Encoding(const gfx::Size& size); | 
| +  void ConfigureEncoding(const gfx::Size& size); | 
|  | 
| // Returns true if |codec_config_| has been filled in at least once. | 
| bool IsInitialized() const; | 
| @@ -96,6 +96,9 @@ class VideoTrackRecorder::VpxEncoder final | 
| base::TimeDelta CalculateFrameDuration( | 
| const scoped_refptr<VideoFrame>& frame); | 
|  | 
| +  // Force usage of VP9 for encoding, instead of VP8 which is the default. | 
| +  const bool use_vp9_; | 
| + | 
| // Used to shutdown properly on the same thread we were created. | 
| const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_; | 
|  | 
| @@ -131,8 +134,10 @@ void VideoTrackRecorder::VpxEncoder::ShutdownEncoder( | 
| } | 
|  | 
| VideoTrackRecorder::VpxEncoder::VpxEncoder( | 
| +    bool use_vp9, | 
| const OnEncodedVideoCB& on_encoded_video_callback) | 
| -    : main_task_runner_(base::MessageLoop::current()->task_runner()), | 
| +    : use_vp9_(use_vp9), | 
| +      main_task_runner_(base::MessageLoop::current()->task_runner()), | 
| on_encoded_video_callback_(on_encoded_video_callback), | 
| encoding_thread_(new base::Thread("EncodingThread")) { | 
| DCHECK(!on_encoded_video_callback_.is_null()); | 
| @@ -173,7 +178,7 @@ void VideoTrackRecorder::VpxEncoder::EncodeOnEncodingThread( | 
| const gfx::Size frame_size = frame->visible_rect().size(); | 
| if (!IsInitialized() || | 
| gfx::Size(codec_config_.g_w, codec_config_.g_h) != frame_size) { | 
| -    ConfigureVp8Encoding(frame_size); | 
| +    ConfigureEncoding(frame_size); | 
| } | 
|  | 
| vpx_image_t vpx_image; | 
| @@ -225,19 +230,19 @@ void VideoTrackRecorder::VpxEncoder::EncodeOnEncodingThread( | 
| keyframe)); | 
| } | 
|  | 
| -void VideoTrackRecorder::VpxEncoder::ConfigureVp8Encoding( | 
| -    const gfx::Size& size) { | 
| +void VideoTrackRecorder::VpxEncoder::ConfigureEncoding(const gfx::Size& size) { | 
| if (IsInitialized()) { | 
| // TODO(mcasas) VP8 quirk/optimisation: If the new |size| is strictly less- | 
| // than-or-equal than the old size, in terms of area, the existing encoder | 
| // instance could be reused after changing |codec_config_.{g_w,g_h}|. | 
| DVLOG(1) << "Destroying/Re-Creating encoder for new frame size: " | 
| << gfx::Size(codec_config_.g_w, codec_config_.g_h).ToString() | 
| -             << " --> " << size.ToString(); | 
| +             << " --> " << size.ToString() << (use_vp9_ ? " vp9" : " vp8"); | 
| encoder_.reset(); | 
| } | 
|  | 
| -  const vpx_codec_iface_t* interface = vpx_codec_vp8_cx(); | 
| +  const vpx_codec_iface_t* interface = | 
| +      use_vp9_ ? vpx_codec_vp9_cx() : vpx_codec_vp8_cx(); | 
| const vpx_codec_err_t result = vpx_codec_enc_config_default(interface, | 
| &codec_config_, | 
| 0 /* reserved */); | 
| @@ -248,7 +253,20 @@ void VideoTrackRecorder::VpxEncoder::ConfigureVp8Encoding( | 
| DCHECK_EQ(240u, codec_config_.g_h); | 
| DCHECK_EQ(256u, codec_config_.rc_target_bitrate); | 
| codec_config_.rc_target_bitrate = size.GetArea() * | 
| -     codec_config_.rc_target_bitrate / codec_config_.g_w / codec_config_.g_h; | 
| +                                    codec_config_.rc_target_bitrate / | 
| +                                    codec_config_.g_w / codec_config_.g_h; | 
| +  // Both VP8/VP9 configuration should be Variable BitRate by default. | 
| +  DCHECK_EQ(VPX_VBR, codec_config_.rc_end_usage); | 
| +  if (use_vp9_) { | 
| +    // Number of frames to consume before producing output. | 
| +    codec_config_.g_lag_in_frames = 0; | 
| + | 
| +    // DCHECK that the profile selected by default is I420 (magic number 0). | 
| +    DCHECK_EQ(0u, codec_config_.g_profile); | 
| +  } else { | 
| +    // VP8 always produces frames instantaneously. | 
| +    DCHECK_EQ(0u, codec_config_.g_lag_in_frames); | 
| +  } | 
|  | 
| DCHECK(size.width()); | 
| DCHECK(size.height()); | 
| @@ -318,10 +336,11 @@ base::TimeDelta VideoTrackRecorder::VpxEncoder::CalculateFrameDuration( | 
| } | 
|  | 
| VideoTrackRecorder::VideoTrackRecorder( | 
| +    bool use_vp9, | 
| const blink::WebMediaStreamTrack& track, | 
| const OnEncodedVideoCB& on_encoded_video_callback) | 
| : track_(track), | 
| -      encoder_(new VpxEncoder(on_encoded_video_callback)) { | 
| +      encoder_(new VpxEncoder(use_vp9, on_encoded_video_callback)) { | 
| DCHECK(main_render_thread_checker_.CalledOnValidThread()); | 
| DCHECK(!track_.isNull()); | 
| DCHECK(track_.extraData()); | 
|  |