summaryrefslogtreecommitdiffstats
path: root/media/ffmpeg
diff options
context:
space:
mode:
authorjyw <jyw@chromium.org>2015-11-24 19:20:55 -0800
committerCommit bot <commit-bot@chromium.org>2015-11-25 03:22:57 +0000
commitad33ab7a20ddede811d0562c45a267a1b06c1ed6 (patch)
tree4177ffbb62e6a60174ff5761e7d444ad1aab184a /media/ffmpeg
parent5f8b6bcfd0170eb47ddb48206fd6181c9d01c7b9 (diff)
downloadchromium_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.cc19
-rw-r--r--media/ffmpeg/ffmpeg_common.h2
-rw-r--r--media/ffmpeg/ffmpeg_common_unittest.cc27
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);
}
}