| Index: media/ffmpeg/ffmpeg_common.cc
|
| diff --git a/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc
|
| index e0e40f3f379689eec0df7da7ebf3d3d271be4169..72323c7e3e68dface57fae46de5806dae3974eb5 100644
|
| --- a/media/ffmpeg/ffmpeg_common.cc
|
| +++ b/media/ffmpeg/ffmpeg_common.cc
|
| @@ -21,6 +21,113 @@ int64 ConvertToTimeBase(const AVRational& time_base,
|
| return av_rescale_q(timestamp.InMicroseconds(), kMicrosBase, time_base);
|
| }
|
|
|
| +static AudioCodec CodecIDToAudioCodec(CodecID codec_id) {
|
| + switch (codec_id) {
|
| + case CODEC_ID_AAC:
|
| + return kCodecAAC;
|
| + case CODEC_ID_MP3:
|
| + return kCodecMP3;
|
| + case CODEC_ID_VORBIS:
|
| + return kCodecVorbis;
|
| + case CODEC_ID_PCM_U8:
|
| + case CODEC_ID_PCM_S16LE:
|
| + case CODEC_ID_PCM_S32LE:
|
| + return kCodecPCM;
|
| + default:
|
| + NOTREACHED();
|
| + }
|
| + return kUnknownAudioCodec;
|
| +}
|
| +
|
| +static CodecID AudioCodecToCodecID(AudioCodec audio_codec,
|
| + int bits_per_channel) {
|
| + switch (audio_codec) {
|
| + case kUnknownAudioCodec:
|
| + return CODEC_ID_NONE;
|
| + case kCodecAAC:
|
| + return CODEC_ID_AAC;
|
| + case kCodecMP3:
|
| + return CODEC_ID_MP3;
|
| + case kCodecPCM:
|
| + switch (bits_per_channel) {
|
| + case 8:
|
| + return CODEC_ID_PCM_U8;
|
| + case 16:
|
| + return CODEC_ID_PCM_S16LE;
|
| + case 32:
|
| + return CODEC_ID_PCM_S32LE;
|
| + default:
|
| + NOTREACHED() << "Unsupported bits_per_channel: " << bits_per_channel;
|
| + }
|
| + case kCodecVorbis:
|
| + return CODEC_ID_VORBIS;
|
| + default:
|
| + NOTREACHED();
|
| + }
|
| + return CODEC_ID_NONE;
|
| +}
|
| +
|
| +void AVCodecContextToAudioDecoderConfig(
|
| + const AVCodecContext* codec_context,
|
| + AudioDecoderConfig* config) {
|
| + DCHECK_EQ(codec_context->codec_type, AVMEDIA_TYPE_AUDIO);
|
| +
|
| + AudioCodec codec = CodecIDToAudioCodec(codec_context->codec_id);
|
| + int bits_per_channel = av_get_bits_per_sample_fmt(codec_context->sample_fmt);
|
| + ChannelLayout channel_layout =
|
| + ChannelLayoutToChromeChannelLayout(codec_context->channel_layout,
|
| + codec_context->channels);
|
| + int samples_per_second = codec_context->sample_rate;
|
| +
|
| + config->Initialize(codec,
|
| + bits_per_channel,
|
| + channel_layout,
|
| + samples_per_second,
|
| + codec_context->extradata,
|
| + codec_context->extradata_size);
|
| +}
|
| +
|
| +void AudioDecoderConfigToAVCodecContext(const AudioDecoderConfig& config,
|
| + AVCodecContext* codec_context) {
|
| + codec_context->codec_type = AVMEDIA_TYPE_AUDIO;
|
| + codec_context->codec_id = AudioCodecToCodecID(config.codec(),
|
| + config.bits_per_channel());
|
| +
|
| + switch (config.bits_per_channel()) {
|
| + case 8:
|
| + codec_context->sample_fmt = AV_SAMPLE_FMT_U8;
|
| + break;
|
| + case 16:
|
| + codec_context->sample_fmt = AV_SAMPLE_FMT_S16;
|
| + break;
|
| + case 32:
|
| + codec_context->sample_fmt = AV_SAMPLE_FMT_S32;
|
| + break;
|
| + default:
|
| + NOTIMPLEMENTED() << "TODO(scherkus): DO SOMETHING BETTER HERE?";
|
| + codec_context->sample_fmt = AV_SAMPLE_FMT_NONE;
|
| + }
|
| +
|
| + // TODO(scherkus): should we set |channel_layout|? I'm not sure if FFmpeg uses
|
| + // said information to decode.
|
| + codec_context->channels =
|
| + ChannelLayoutToChannelCount(config.channel_layout());
|
| + codec_context->sample_rate = config.samples_per_second();
|
| +
|
| + 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;
|
| + }
|
| +}
|
| +
|
| VideoCodec CodecIDToVideoCodec(CodecID codec_id) {
|
| switch (codec_id) {
|
| case CODEC_ID_VC1:
|
| @@ -38,12 +145,12 @@ VideoCodec CodecIDToVideoCodec(CodecID codec_id) {
|
| default:
|
| NOTREACHED();
|
| }
|
| - return kUnknown;
|
| + return kUnknownVideoCodec;
|
| }
|
|
|
| CodecID VideoCodecToCodecID(VideoCodec video_codec) {
|
| switch (video_codec) {
|
| - case kUnknown:
|
| + case kUnknownVideoCodec:
|
| return CODEC_ID_NONE;
|
| case kCodecVC1:
|
| return CODEC_ID_VC1;
|
|
|