vlc | branch: master | Thomas Guillem <[email protected]> | Fri Jul  7 12:59:24 
2017 +0200| [f19d1c8de515bf3e285b5219080b55915c27ae11] | committer: Thomas 
Guillem

codec: avcodec: supports output with channels > AOUT_CHAN_MAX

If the channel number is higher than AOUT_CHAN_MAX, don't set the physical
mask, and just set the number of channels. A filter will take of dropping extra
channels or doing an ambisonics conversion.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=f19d1c8de515bf3e285b5219080b55915c27ae11
---

 modules/codec/avcodec/audio.c | 29 ++++++++++++++++++-----------
 1 file changed, 18 insertions(+), 11 deletions(-)

diff --git a/modules/codec/avcodec/audio.c b/modules/codec/avcodec/audio.c
index 4c3e929986..2d751273f7 100644
--- a/modules/codec/avcodec/audio.c
+++ b/modules/codec/avcodec/audio.c
@@ -395,7 +395,8 @@ static int DecodeBlock( decoder_t *p_dec, block_t 
**pp_block )
         if( ret == 0 )
         {
             /* checks and init from first decoded frame */
-            if( ctx->channels <= 0 || ctx->channels > 8 || ctx->sample_rate <= 
0 )
+            if( ctx->channels <= 0 || ctx->channels > INPUT_CHAN_MAX
+             || ctx->sample_rate <= 0 )
             {
                 msg_Warn( p_dec, "invalid audio properties channels count %d, 
sample rate %d",
                           ctx->channels, ctx->sample_rate );
@@ -605,20 +606,26 @@ static void SetupOutputFormat( decoder_t *p_dec, bool 
b_trust )
 
         if( i_channels_src != p_sys->p_context->channels && b_trust )
             msg_Err( p_dec, "Channel layout not understood" );
+
+        uint32_t i_layout_dst;
+        int      i_channels_dst;
+        p_sys->b_extract = aout_CheckChannelExtraction( p_sys->pi_extraction,
+                                                        &i_layout_dst, 
&i_channels_dst,
+                                                        NULL, pi_order_src, 
i_channels_src );
+        if( i_channels_dst != i_channels_src && b_trust )
+            msg_Warn( p_dec, "%d channels are dropped", i_channels_src - 
i_channels_dst );
+
+        p_dec->fmt_out.audio.i_physical_channels =
+        p_dec->fmt_out.audio.i_original_channels = i_layout_dst;
     }
     else
+    {
         msg_Warn( p_dec, "no channel layout found");
+        p_dec->fmt_out.audio.i_physical_channels =
+        p_dec->fmt_out.audio.i_original_channels = 0;
+        p_dec->fmt_out.audio.i_channels = p_sys->p_context->channels;
+    }
 
-    uint32_t i_layout_dst;
-    int      i_channels_dst;
-    p_sys->b_extract = aout_CheckChannelExtraction( p_sys->pi_extraction,
-                                                    &i_layout_dst, 
&i_channels_dst,
-                                                    NULL, pi_order_src, 
i_channels_src );
-    if( i_channels_dst != i_channels_src && b_trust )
-        msg_Warn( p_dec, "%d channels are dropped", i_channels_src - 
i_channels_dst );
-
-    p_dec->fmt_out.audio.i_physical_channels =
-    p_dec->fmt_out.audio.i_original_channels = i_layout_dst;
     aout_FormatPrepare( &p_dec->fmt_out.audio );
 }
 

_______________________________________________
vlc-commits mailing list
[email protected]
https://mailman.videolan.org/listinfo/vlc-commits

Reply via email to