Chromium Code Reviews| Index: media/ffmpeg/ffmpeg_common.cc |
| diff --git a/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc |
| index 950b9c0fd103672103d65048a7ad47ab48b89ee7..f0d7c33f9b658ce0392e5236cd6227d531cceb8d 100644 |
| --- a/media/ffmpeg/ffmpeg_common.cc |
| +++ b/media/ffmpeg/ffmpeg_common.cc |
| @@ -324,8 +324,16 @@ bool AVCodecContextToAudioDecoderConfig( |
| SampleFormat sample_format = AVSampleFormatToSampleFormat( |
| codec_context->sample_fmt, codec_context->codec_id); |
| - ChannelLayout channel_layout = ChannelLayoutToChromeChannelLayout( |
| - codec_context->channel_layout, codec_context->channels); |
| + bool is_opus_discrete = false; |
| + if (codec == kCodecOpus && codec_context->extradata_size >= 19) { |
| + int mapping_family = codec_context->extradata[18]; |
| + is_opus_discrete = mapping_family == 2; |
| + } |
| + ChannelLayout channel_layout = |
| + is_opus_discrete && codec_context->channels > 8 |
|
DaleCurtis
2017/05/25 18:51:01
Add a note about why we have > 8 here; perhaps wit
flim-chromium
2017/05/25 22:00:40
Done.
|
| + ? CHANNEL_LAYOUT_DISCRETE |
| + : ChannelLayoutToChromeChannelLayout(codec_context->channel_layout, |
| + codec_context->channels); |
| int sample_rate = codec_context->sample_rate; |
| switch (codec) { |
| @@ -371,6 +379,8 @@ bool AVCodecContextToAudioDecoderConfig( |
| config->Initialize(codec, sample_format, channel_layout, sample_rate, |
| extra_data, encryption_scheme, seek_preroll, |
| codec_context->delay); |
| + if (channel_layout == CHANNEL_LAYOUT_DISCRETE) |
| + config->SetChannelsForDiscrete(codec_context->channels); |
| #if BUILDFLAG(ENABLE_AC3_EAC3_AUDIO_DEMUXING) |
| // These are bitstream formats unknown to ffmpeg, so they don't have |
| @@ -419,8 +429,7 @@ void AudioDecoderConfigToAVCodecContext(const AudioDecoderConfig& config, |
| // 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->channels = config.channels(); |
| codec_context->sample_rate = config.samples_per_second(); |
| if (config.extra_data().empty()) { |