| Index: media/ffmpeg/ffmpeg_common.cc
 | 
| diff --git a/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc
 | 
| index 7807d3f0c42c0033f1083e72d6e9d5a9d1480292..b865a29e17d63f5a3629a92dbea56ee1690aa186 100644
 | 
| --- a/media/ffmpeg/ffmpeg_common.cc
 | 
| +++ b/media/ffmpeg/ffmpeg_common.cc
 | 
| @@ -67,6 +67,48 @@ static CodecID AudioCodecToCodecID(AudioCodec audio_codec,
 | 
|    return CODEC_ID_NONE;
 | 
|  }
 | 
|  
 | 
| +static VideoCodec CodecIDToVideoCodec(CodecID codec_id) {
 | 
| +  switch (codec_id) {
 | 
| +    case CODEC_ID_VC1:
 | 
| +      return kCodecVC1;
 | 
| +    case CODEC_ID_H264:
 | 
| +      return kCodecH264;
 | 
| +    case CODEC_ID_THEORA:
 | 
| +      return kCodecTheora;
 | 
| +    case CODEC_ID_MPEG2VIDEO:
 | 
| +      return kCodecMPEG2;
 | 
| +    case CODEC_ID_MPEG4:
 | 
| +      return kCodecMPEG4;
 | 
| +    case CODEC_ID_VP8:
 | 
| +      return kCodecVP8;
 | 
| +    default:
 | 
| +      NOTREACHED();
 | 
| +  }
 | 
| +  return kUnknownVideoCodec;
 | 
| +}
 | 
| +
 | 
| +static CodecID VideoCodecToCodecID(VideoCodec video_codec) {
 | 
| +  switch (video_codec) {
 | 
| +    case kUnknownVideoCodec:
 | 
| +      return CODEC_ID_NONE;
 | 
| +    case kCodecVC1:
 | 
| +      return CODEC_ID_VC1;
 | 
| +    case kCodecH264:
 | 
| +      return CODEC_ID_H264;
 | 
| +    case kCodecTheora:
 | 
| +      return CODEC_ID_THEORA;
 | 
| +    case kCodecMPEG2:
 | 
| +      return CODEC_ID_MPEG2VIDEO;
 | 
| +    case kCodecMPEG4:
 | 
| +      return CODEC_ID_MPEG4;
 | 
| +    case kCodecVP8:
 | 
| +      return CODEC_ID_VP8;
 | 
| +    default:
 | 
| +      NOTREACHED();
 | 
| +  }
 | 
| +  return CODEC_ID_NONE;
 | 
| +}
 | 
| +
 | 
|  void AVCodecContextToAudioDecoderConfig(
 | 
|      const AVCodecContext* codec_context,
 | 
|      AudioDecoderConfig* config) {
 | 
| @@ -128,46 +170,53 @@ void AudioDecoderConfigToAVCodecContext(const AudioDecoderConfig& config,
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -VideoCodec CodecIDToVideoCodec(CodecID codec_id) {
 | 
| -  switch (codec_id) {
 | 
| -    case CODEC_ID_VC1:
 | 
| -      return kCodecVC1;
 | 
| -    case CODEC_ID_H264:
 | 
| -      return kCodecH264;
 | 
| -    case CODEC_ID_THEORA:
 | 
| -      return kCodecTheora;
 | 
| -    case CODEC_ID_MPEG2VIDEO:
 | 
| -      return kCodecMPEG2;
 | 
| -    case CODEC_ID_MPEG4:
 | 
| -      return kCodecMPEG4;
 | 
| -    case CODEC_ID_VP8:
 | 
| -      return kCodecVP8;
 | 
| -    default:
 | 
| -      NOTREACHED();
 | 
| -  }
 | 
| -  return kUnknownVideoCodec;
 | 
| +void AVStreamToVideoDecoderConfig(
 | 
| +    const AVStream* stream,
 | 
| +    VideoDecoderConfig* config) {
 | 
| +  gfx::Size coded_size(stream->codec->coded_width, stream->codec->coded_height);
 | 
| +
 | 
| +  // TODO(vrk): This assumes decoded frame data starts at (0, 0), which is true
 | 
| +  // for now, but may not always be true forever. Fix this in the future.
 | 
| +  gfx::Rect visible_rect(stream->codec->width, stream->codec->height);
 | 
| +
 | 
| +  AVRational aspect_ratio = { 1, 1 };
 | 
| +  if (stream->sample_aspect_ratio.num)
 | 
| +    aspect_ratio = stream->sample_aspect_ratio;
 | 
| +  else if (stream->codec->sample_aspect_ratio.num)
 | 
| +    aspect_ratio = stream->codec->sample_aspect_ratio;
 | 
| +
 | 
| +  config->Initialize(CodecIDToVideoCodec(stream->codec->codec_id),
 | 
| +                     PixelFormatToVideoFormat(stream->codec->pix_fmt),
 | 
| +                     coded_size, visible_rect,
 | 
| +                     stream->r_frame_rate.num,
 | 
| +                     stream->r_frame_rate.den,
 | 
| +                     aspect_ratio.num,
 | 
| +                     aspect_ratio.den,
 | 
| +                     stream->codec->extradata,
 | 
| +                     stream->codec->extradata_size);
 | 
|  }
 | 
|  
 | 
| -CodecID VideoCodecToCodecID(VideoCodec video_codec) {
 | 
| -  switch (video_codec) {
 | 
| -    case kUnknownVideoCodec:
 | 
| -      return CODEC_ID_NONE;
 | 
| -    case kCodecVC1:
 | 
| -      return CODEC_ID_VC1;
 | 
| -    case kCodecH264:
 | 
| -      return CODEC_ID_H264;
 | 
| -    case kCodecTheora:
 | 
| -      return CODEC_ID_THEORA;
 | 
| -    case kCodecMPEG2:
 | 
| -      return CODEC_ID_MPEG2VIDEO;
 | 
| -    case kCodecMPEG4:
 | 
| -      return CODEC_ID_MPEG4;
 | 
| -    case kCodecVP8:
 | 
| -      return CODEC_ID_VP8;
 | 
| -    default:
 | 
| -      NOTREACHED();
 | 
| +void VideoDecoderConfigToAVCodecContext(
 | 
| +    const VideoDecoderConfig& config,
 | 
| +    AVCodecContext* codec_context) {
 | 
| +  codec_context->codec_type = AVMEDIA_TYPE_VIDEO;
 | 
| +  codec_context->codec_id = VideoCodecToCodecID(config.codec());
 | 
| +  codec_context->coded_width = config.coded_size().width();
 | 
| +  codec_context->coded_height = config.coded_size().height();
 | 
| +  codec_context->pix_fmt = VideoFormatToPixelFormat(config.format());
 | 
| +
 | 
| +  if (config.extra_data()) {
 | 
| +    codec_context->extradata_size = config.extra_data_size();
 | 
| +    codec_context->extradata = reinterpret_cast<uint8_t*>(
 | 
| +        av_malloc(config.extra_data_size() + FF_INPUT_BUFFER_PADDING_SIZE));
 | 
| +    memcpy(codec_context->extradata, config.extra_data(),
 | 
| +           config.extra_data_size());
 | 
| +    memset(codec_context->extradata + config.extra_data_size(), '\0',
 | 
| +           FF_INPUT_BUFFER_PADDING_SIZE);
 | 
| +  } else {
 | 
| +    codec_context->extradata = NULL;
 | 
| +    codec_context->extradata_size = 0;
 | 
|    }
 | 
| -  return CODEC_ID_NONE;
 | 
|  }
 | 
|  
 | 
|  ChannelLayout ChannelLayoutToChromeChannelLayout(int64_t layout,
 | 
| @@ -239,27 +288,14 @@ PixelFormat VideoFormatToPixelFormat(VideoFrame::Format video_format) {
 | 
|    return PIX_FMT_NONE;
 | 
|  }
 | 
|  
 | 
| -base::TimeDelta GetFrameDuration(AVStream* stream) {
 | 
| -  AVRational time_base = { stream->r_frame_rate.den, stream->r_frame_rate.num };
 | 
| +base::TimeDelta GetFrameDuration(const VideoDecoderConfig& config) {
 | 
| +  AVRational time_base = {
 | 
| +    config.frame_rate_denominator(),
 | 
| +    config.frame_rate_numerator()
 | 
| +  };
 | 
|    return ConvertFromTimeBase(time_base, 1);
 | 
|  }
 | 
|  
 | 
| -gfx::Size GetNaturalSize(AVStream* stream) {
 | 
| -  double aspect_ratio = 1.0;
 | 
| -
 | 
| -  if (stream->sample_aspect_ratio.num)
 | 
| -    aspect_ratio = av_q2d(stream->sample_aspect_ratio);
 | 
| -  else if (stream->codec->sample_aspect_ratio.num)
 | 
| -    aspect_ratio = av_q2d(stream->codec->sample_aspect_ratio);
 | 
| -
 | 
| -  int height = stream->codec->height;
 | 
| -  int width = floor(stream->codec->width * aspect_ratio + 0.5);
 | 
| -
 | 
| -  // An even width makes things easier for YV12 and appears to be the behavior
 | 
| -  // expected by WebKit layout tests.
 | 
| -  return gfx::Size(width & ~1, height);
 | 
| -}
 | 
| -
 | 
|  void DestroyAVFormatContext(AVFormatContext* format_context) {
 | 
|    DCHECK(format_context);
 | 
|  
 | 
| 
 |