Chromium Code Reviews| Index: media/ffmpeg/ffmpeg_common.cc |
| diff --git a/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc |
| index 7807d3f0c42c0033f1083e72d6e9d5a9d1480292..24ea0452dd74f018223376b78dcd0d805c878c2f 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,52 @@ 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 AVCodecContextToVideoDecoderConfig( |
| + const AVCodecContext* codec_context, |
|
vrk (LEFT CHROMIUM)
2011/10/26 18:07:12
nit: const ref
scherkus (not reviewing)
2011/10/26 19:08:00
we tend to keep FFmpeg as pointers since that's ho
|
| + const AVRational& frame_rate, |
| + const AVRational& aspect_ratio, |
| + VideoDecoderConfig* config) { |
| + |
| + gfx::Size coded_size(codec_context->coded_width, |
| + codec_context->coded_height); |
|
vrk (LEFT CHROMIUM)
2011/10/26 18:07:12
nit: move to line above?
scherkus (not reviewing)
2011/10/26 19:08:00
Done.
|
| + |
| + // 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(codec_context->width, |
| + codec_context->height); |
|
vrk (LEFT CHROMIUM)
2011/10/26 18:07:12
nit: move to line above?
scherkus (not reviewing)
2011/10/26 19:08:00
Done.
|
| + |
| + config->Initialize(CodecIDToVideoCodec(codec_context->codec_id), |
| + PixelFormatToVideoFormat(codec_context->pix_fmt), |
| + coded_size, visible_rect, |
| + frame_rate.num, |
| + frame_rate.den, |
| + aspect_ratio.num, |
| + aspect_ratio.den, |
| + codec_context->extradata, |
| + codec_context->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,21 +287,32 @@ 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; |
| - |
| +AVRational GetAspectRatio(AVStream* stream) { |
| 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); |
| + return stream->sample_aspect_ratio; |
| + |
| + if (stream->codec->sample_aspect_ratio.num) |
| + return stream->codec->sample_aspect_ratio; |
| + |
| + return { 1, 1 }; |
| +} |
| + |
| +gfx::Size GetNaturalSize(const VideoDecoderConfig& config) { |
| + AVRational aspect_ratio = { |
| + config.aspect_ratio_denominator(), |
| + config.aspect_ratio_numerator() |
| + }; |
| - int height = stream->codec->height; |
| - int width = floor(stream->codec->width * aspect_ratio + 0.5); |
| + int height = config.visible_rect().height(); |
| + int width = floor(config.visible_rect().width() * av_q2d(aspect_ratio) + 0.5); |
| // An even width makes things easier for YV12 and appears to be the behavior |
| // expected by WebKit layout tests. |