Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(441)

Unified Diff: media/ffmpeg/ffmpeg_common.cc

Issue 2752323002: Support Opus Ambisonics playback (Closed)
Patch Set: another fix for unreliable ffmpeg channels vs layout Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/base/fake_audio_renderer_sink.cc ('k') | media/ffmpeg/ffmpeg_common_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/ffmpeg/ffmpeg_common.cc
diff --git a/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc
index 950b9c0fd103672103d65048a7ad47ab48b89ee7..61d0bc341ccdacaa9ad848b75ad299a9a2124c5a 100644
--- a/media/ffmpeg/ffmpeg_common.cc
+++ b/media/ffmpeg/ffmpeg_common.cc
@@ -324,8 +324,22 @@ 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);
+ // Opus packets coded with channel mapping 2 are Ambisonics signals. If there
+ // is no WebAudio renderer attached, default up/downmixing is applied for
+ // <= 8 channels to enable previewing of content. Currently, mixing is not
+ // supported for > 8 channels.
+ // TODO (flim): Use mixing matrices that are more optimal for previewing
+ // Ambisonics content, and support > 8 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
+ ? CHANNEL_LAYOUT_DISCRETE
+ : ChannelLayoutToChromeChannelLayout(codec_context->channel_layout,
+ codec_context->channels);
int sample_rate = codec_context->sample_rate;
switch (codec) {
@@ -371,6 +385,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 +435,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()) {
« no previous file with comments | « media/base/fake_audio_renderer_sink.cc ('k') | media/ffmpeg/ffmpeg_common_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698