diff options
author | Michael Graczyk <mgraczyk@google.com> | 2016-09-01 11:17:30 -0700 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2016-09-01 23:53:24 +0200 |
commit | be07c25896bb608ee84a902e6a470b87c741115b (patch) | |
tree | 89718dff23c553d09cd8bcb56b6331c55bb9e748 | |
parent | a2c912c3b6b833f2aacf414264c566f86f0a4e7c (diff) | |
download | ffmpeg-be07c25896bb608ee84a902e6a470b87c741115b.tar.gz |
libavcodec/opus: Add channel mapping 2 to extradata parser
This allows libavcodec/opus to demux ambisonics in an ogg/opus container.
Channel mapping family 2 is being added in this standards track IETF draft:
tools.ietf.org/html/draft-ietf-codec-ambisonics-00
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-rw-r--r-- | libavcodec/opus.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/libavcodec/opus.c b/libavcodec/opus.c index 29854fcca5..08d94b6cba 100644 --- a/libavcodec/opus.c +++ b/libavcodec/opus.c @@ -347,7 +347,7 @@ av_cold int ff_opus_parse_extradata(AVCodecContext *avctx, streams = 1; stereo_streams = channels - 1; channel_map = default_channel_map; - } else if (map_type == 1 || map_type == 255) { + } else if (map_type == 1 || map_type == 2 || map_type == 255) { if (extradata_size < 21 + channels) { av_log(avctx, AV_LOG_ERROR, "Invalid extradata size: %d\n", extradata_size); @@ -371,6 +371,15 @@ av_cold int ff_opus_parse_extradata(AVCodecContext *avctx, } layout = ff_vorbis_channel_layouts[channels - 1]; channel_reorder = channel_reorder_vorbis; + } else if (map_type == 2) { + int ambisonic_order = ff_sqrt(channels) - 1; + if (channels != (ambisonic_order + 1) * (ambisonic_order + 1)) { + av_log(avctx, AV_LOG_ERROR, + "Channel mapping 2 is only specified for channel counts" + " which can be written as (n + 1)^2 for nonnegative integer n\n"); + return AVERROR_INVALIDDATA; + } + layout = 0; } else layout = 0; |