vlc | branch: master | Pierre Lamot <pie...@videolabs.io> | Tue May 22 18:57:19 2018 +0200| [2b6ac91e95c0c59b2d575f720fe22ca65bc0827e] | committer: Jean-Baptiste Kempf
opus: support third order ambisonic with family 2 mapping Signed-off-by: Jean-Baptiste Kempf <j...@videolan.org> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=2b6ac91e95c0c59b2d575f720fe22ca65bc0827e --- modules/codec/opus.c | 58 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 16 deletions(-) diff --git a/modules/codec/opus.c b/modules/codec/opus.c index 9597e215cc..fdde76ff05 100644 --- a/modules/codec/opus.c +++ b/modules/codec/opus.c @@ -315,6 +315,7 @@ static int ProcessHeaders( decoder_t *p_dec ) static int ProcessInitialHeader( decoder_t *p_dec, ogg_packet *p_oggpacket ) { int err; + unsigned char* p_stream_map; unsigned char new_stream_map[8]; decoder_sys_t *p_sys = p_dec->p_sys; @@ -328,36 +329,61 @@ static int ProcessInitialHeader( decoder_t *p_dec, ogg_packet *p_oggpacket ) msg_Dbg( p_dec, "Opus audio with %d channels", p_header->channels); if((p_header->channels>2 && p_header->channel_mapping==0) || - p_header->channels>8 || - p_header->channel_mapping>1) + (p_header->channels>8 && p_header->channel_mapping==1) || + (p_header->channels>18 && p_header->channel_mapping==2) || + p_header->channel_mapping>2) { msg_Err( p_dec, "Unsupported channel mapping" ); return VLC_EGENERIC; } + if (p_header->channel_mapping == 2) + { + int i_order = floor(sqrt(p_header->channels)); + int i_nondiegetic = p_header->channels - i_order * i_order; + if (i_nondiegetic != 0 && i_nondiegetic != 2) + { + msg_Err( p_dec, "Unsupported ambisonic channel mapping" ); + return VLC_EGENERIC; + } + } /* Setup the format */ - p_dec->fmt_out.audio.i_physical_channels = - pi_channels_maps[p_header->channels]; p_dec->fmt_out.audio.i_channels = p_header->channels; p_dec->fmt_out.audio.i_rate = 48000; - if( p_header->channels>2 ) + if (p_header->channel_mapping <= 1) { - static const uint32_t *pi_ch[6] = { pi_3channels_in, pi_4channels_in, - pi_5channels_in, pi_6channels_in, - pi_7channels_in, pi_8channels_in }; - uint8_t pi_chan_table[AOUT_CHAN_MAX]; - - aout_CheckChannelReorder( pi_ch[p_header->channels-3], NULL, - p_dec->fmt_out.audio.i_physical_channels, - pi_chan_table ); - for(int i=0;i<p_header->channels;i++) - new_stream_map[pi_chan_table[i]]=p_header->stream_map[i]; + p_dec->fmt_out.audio.i_physical_channels = + pi_channels_maps[p_header->channels]; + + if( p_header->channels>2 ) + { + static const uint32_t *pi_ch[6] = { pi_3channels_in, pi_4channels_in, + pi_5channels_in, pi_6channels_in, + pi_7channels_in, pi_8channels_in }; + uint8_t pi_chan_table[AOUT_CHAN_MAX]; + + aout_CheckChannelReorder( pi_ch[p_header->channels-3], NULL, + p_dec->fmt_out.audio.i_physical_channels, + pi_chan_table ); + for(int i=0;i<p_header->channels;i++) + new_stream_map[pi_chan_table[i]]=p_header->stream_map[i]; + + p_stream_map = new_stream_map; + } + else + p_stream_map = p_header->stream_map; } + else //p_header->channel_mapping == 2 + { + p_dec->fmt_out.audio.channel_type = AUDIO_CHANNEL_TYPE_AMBISONICS; + p_stream_map = p_header->stream_map; + } + /* Opus decoder init */ p_sys->p_st = opus_multistream_decoder_create( 48000, p_header->channels, p_header->nb_streams, p_header->nb_coupled, - p_header->channels>2?new_stream_map:p_header->stream_map, + p_stream_map, &err ); if( !p_sys->p_st || err!=OPUS_OK ) { _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits