diff options
author | jyw <jyw@chromium.org> | 2015-11-24 19:20:55 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-11-25 03:22:57 +0000 |
commit | ad33ab7a20ddede811d0562c45a267a1b06c1ed6 (patch) | |
tree | 4177ffbb62e6a60174ff5761e7d444ad1aab184a /media/ffmpeg | |
parent | 5f8b6bcfd0170eb47ddb48206fd6181c9d01c7b9 (diff) | |
download | chromium_src-ad33ab7a20ddede811d0562c45a267a1b06c1ed6.zip chromium_src-ad33ab7a20ddede811d0562c45a267a1b06c1ed6.tar.gz chromium_src-ad33ab7a20ddede811d0562c45a267a1b06c1ed6.tar.bz2 |
Enable pcm_s32le audio decoding.
To accomodate this change, a new kSampleFormatS24 has been introduced.
It is only used with S24LE PCM input. FFmpeg treats pcm_s24le as an
encoded format that can be decoded into s32le samples; kSampleFormatS24
only exists on the Chrome side to distinguish FFmpeg's pcm_s24le from
pcm_s32le, both of which use Chrome's catch-all kCodecPCM codec and
the same real sample format.
BUG=557170,internal b/22378279
TEST=media_unittests --gtest_filter=AudioBufferTest.*
media_unittests --gtest_filter=PipelineIntegrationTest.S32PlaybackHashed
Review URL: https://codereview.chromium.org/1422113002
Cr-Commit-Position: refs/heads/master@{#361545}
Diffstat (limited to 'media/ffmpeg')
-rw-r--r-- | media/ffmpeg/ffmpeg_common.cc | 19 | ||||
-rw-r--r-- | media/ffmpeg/ffmpeg_common.h | 2 | ||||
-rw-r--r-- | media/ffmpeg/ffmpeg_common_unittest.cc | 27 |
3 files changed, 32 insertions, 16 deletions
diff --git a/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc index c9d8669..772b41d 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); diff --git a/media/ffmpeg/ffmpeg_common.h b/media/ffmpeg/ffmpeg_common.h index 7938a32..955ee64 100644 --- a/media/ffmpeg/ffmpeg_common.h +++ b/media/ffmpeg/ffmpeg_common.h @@ -123,7 +123,7 @@ MEDIA_EXPORT AVCodecID VideoCodecToCodecID(VideoCodec video_codec); // Converts FFmpeg's audio sample format to Chrome's SampleFormat. MEDIA_EXPORT SampleFormat -AVSampleFormatToSampleFormat(AVSampleFormat sample_format); +AVSampleFormatToSampleFormat(AVSampleFormat sample_format, AVCodecID codec_id); // Converts FFmpeg's pixel formats to its corresponding supported video format. MEDIA_EXPORT VideoPixelFormat diff --git a/media/ffmpeg/ffmpeg_common_unittest.cc b/media/ffmpeg/ffmpeg_common_unittest.cc index aa8a06d..9a73587 100644 --- a/media/ffmpeg/ffmpeg_common_unittest.cc +++ b/media/ffmpeg/ffmpeg_common_unittest.cc @@ -161,17 +161,24 @@ TEST_F(FFmpegCommonTest, VerifyFormatSizes) { for (AVSampleFormat format = AV_SAMPLE_FMT_NONE; format < AV_SAMPLE_FMT_NB; format = static_cast<AVSampleFormat>(format + 1)) { - SampleFormat sample_format = AVSampleFormatToSampleFormat(format); - if (sample_format == kUnknownSampleFormat) { - // This format not supported, so skip it. - continue; + std::vector<AVCodecID> codec_ids(1, AV_CODEC_ID_NONE); + if (format == AV_SAMPLE_FMT_S32) + codec_ids.push_back(AV_CODEC_ID_PCM_S24LE); + for (const auto& codec_id : codec_ids) { + SampleFormat sample_format = + AVSampleFormatToSampleFormat(format, codec_id); + if (sample_format == kUnknownSampleFormat) { + // This format not supported, so skip it. + continue; + } + + // Have FFMpeg compute the size of a buffer of 1 channel / 1 frame + // with 1 byte alignment to make sure the sizes match. + int single_buffer_size = + av_samples_get_buffer_size(NULL, 1, 1, format, 1); + int bytes_per_channel = SampleFormatToBytesPerChannel(sample_format); + EXPECT_EQ(bytes_per_channel, single_buffer_size); } - - // Have FFMpeg compute the size of a buffer of 1 channel / 1 frame - // with 1 byte alignment to make sure the sizes match. - int single_buffer_size = av_samples_get_buffer_size(NULL, 1, 1, format, 1); - int bytes_per_channel = SampleFormatToBytesPerChannel(sample_format); - EXPECT_EQ(bytes_per_channel, single_buffer_size); } } |