Index: media/ffmpeg/ffmpeg_common.cc |
diff --git a/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc |
index c9d866968050ec3d660ce7ef07e7abce75182434..772b41dbf6cc77b1c46ada545add2c18d94d4378 100644 |
--- a/media/ffmpeg/ffmpeg_common.cc |
+++ b/media/ffmpeg/ffmpeg_common.cc |
@@ -74,6 +74,7 @@ static AudioCodec CodecIDToAudioCodec(AVCodecID codec_id) { |
case AV_CODEC_ID_PCM_U8: |
case AV_CODEC_ID_PCM_S16LE: |
case AV_CODEC_ID_PCM_S24LE: |
+ case AV_CODEC_ID_PCM_S32LE: |
case AV_CODEC_ID_PCM_F32LE: |
return kCodecPCM; |
case AV_CODEC_ID_PCM_S16BE: |
@@ -117,8 +118,10 @@ static AVCodecID AudioCodecToCodecID(AudioCodec audio_codec, |
return AV_CODEC_ID_PCM_U8; |
case kSampleFormatS16: |
return AV_CODEC_ID_PCM_S16LE; |
- case kSampleFormatS32: |
+ case kSampleFormatS24: |
return AV_CODEC_ID_PCM_S24LE; |
+ case kSampleFormatS32: |
+ return AV_CODEC_ID_PCM_S32LE; |
case kSampleFormatF32: |
return AV_CODEC_ID_PCM_F32LE; |
default: |
@@ -244,14 +247,18 @@ static int VideoCodecProfileToProfileID(VideoCodecProfile profile) { |
return FF_PROFILE_UNKNOWN; |
} |
-SampleFormat AVSampleFormatToSampleFormat(AVSampleFormat sample_format) { |
+SampleFormat AVSampleFormatToSampleFormat(AVSampleFormat sample_format, |
+ AVCodecID codec_id) { |
switch (sample_format) { |
case AV_SAMPLE_FMT_U8: |
return kSampleFormatU8; |
case AV_SAMPLE_FMT_S16: |
return kSampleFormatS16; |
case AV_SAMPLE_FMT_S32: |
- return kSampleFormatS32; |
+ if (codec_id == AV_CODEC_ID_PCM_S24LE) |
+ return kSampleFormatS24; |
+ else |
+ return kSampleFormatS32; |
case AV_SAMPLE_FMT_FLT: |
return kSampleFormatF32; |
case AV_SAMPLE_FMT_S16P: |
@@ -272,6 +279,8 @@ static AVSampleFormat SampleFormatToAVSampleFormat(SampleFormat sample_format) { |
return AV_SAMPLE_FMT_U8; |
case kSampleFormatS16: |
return AV_SAMPLE_FMT_S16; |
+ // pcm_s24le is treated as a codec with sample format s32 in ffmpeg |
+ case kSampleFormatS24: |
case kSampleFormatS32: |
return AV_SAMPLE_FMT_S32; |
case kSampleFormatF32: |
@@ -293,8 +302,8 @@ bool AVCodecContextToAudioDecoderConfig(const AVCodecContext* codec_context, |
AudioCodec codec = CodecIDToAudioCodec(codec_context->codec_id); |
- SampleFormat sample_format = |
- AVSampleFormatToSampleFormat(codec_context->sample_fmt); |
+ SampleFormat sample_format = AVSampleFormatToSampleFormat( |
+ codec_context->sample_fmt, codec_context->codec_id); |
ChannelLayout channel_layout = ChannelLayoutToChromeChannelLayout( |
codec_context->channel_layout, codec_context->channels); |