codec: faad: handle mid/back pair repeats
authorFrancois Cartegnie <fcvlcdev@free.fr>
Thu, 24 Aug 2017 12:19:56 +0000 (14:19 +0200)
committerFrancois Cartegnie <fcvlcdev@free.fr>
Thu, 24 Aug 2017 12:48:07 +0000 (14:48 +0200)
Previous faad2 contribs fix was incorrect.
Fix has to be done in decoder module.

This reverts commit 85f0e45b2304afa64ace2e3f0ddc19ad8b5accfb.

contrib/src/faad2/faad2-fix-4channels-groups.patch [deleted file]
contrib/src/faad2/rules.mak
modules/codec/faad.c

diff --git a/contrib/src/faad2/faad2-fix-4channels-groups.patch b/contrib/src/faad2/faad2-fix-4channels-groups.patch
deleted file mode 100644 (file)
index 3ac27c7..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-diff -Naur faad2/libfaad/decoder.c faad2_patched/libfaad/decoder.c
---- faad2/libfaad/decoder.c    2017-08-23 12:31:12.495650331 +0200
-+++ faad2_patched/libfaad/decoder.c    2017-08-23 12:30:44.755816954 +0200
-@@ -600,6 +601,21 @@
-         hInfo->num_lfe_channels = hDecoder->pce.num_lfe_channels;
-         total += hInfo->num_lfe_channels;
-+        /* Patch when channels are declared as 1 + 4 */
-+      if(total <= 8)
-+      {
-+              if(hInfo->num_front_channels < 2 && hInfo->num_side_channels > 3)
-+              {
-+                      hInfo->num_front_channels += 2;
-+                      hInfo->num_side_channels -= 2;
-+              }
-+              if(hInfo->num_side_channels < 2 && hInfo->num_back_channels > 3)
-+              {
-+                      hInfo->num_side_channels += 2;
-+                      hInfo->num_back_channels -= 2;
-+              }
-+      }
-+
-         chdir = hInfo->num_front_channels;
-         if (chdir & 1)
-         {
index 48bd86d..4a4467b 100644 (file)
@@ -24,7 +24,6 @@ endif
        $(APPLY) $(SRC)/faad2/faad2-fix-71wPCEmapping.patch
        $(APPLY) $(SRC)/faad2/faad2-fix-cpe-reconstruction.patch
        $(APPLY) $(SRC)/faad2/faad2-add-define.patch
-       $(APPLY) $(SRC)/faad2/faad2-fix-4channels-groups.patch
        cd $(UNPACK_DIR) && $(CC) -iquote . -E - </dev/null || sed -i 's/-iquote /-I/' libfaad/Makefile.am
        $(MOVE)
 
index 1711ab4..f134f4e 100644 (file)
@@ -478,6 +478,37 @@ static int DecodeBlock( decoder_t *p_dec, block_t *p_block )
             }
         }
 #endif
+        /* Handle > 1 local pair 5.1 setups.
+           In case of more than 1 channel pair per area, faad will have repeats
+           in channels sequence. We need to remap to available surround channels.
+           Front > Middle > Rear:
+           In case of 4 middle, it maps to 2F 2M if no previous front.
+           In case of 4 rear, it maps to 2M 2R if no previous rear.
+        */
+        unsigned i_faadused = 0;
+        for( unsigned i=0; i<frame.channels; i++ )
+            if( frame.channel_position[i] > 0 )
+                i_faadused |= 1 << frame.channel_position[i];
+
+        for( size_t i=3; i<frame.channels; i++ )
+        {
+             if( frame.channel_position[i - 3] == frame.channel_position[i - 1] &&
+                 frame.channel_position[i - 2] == frame.channel_position[i] &&
+                 frame.channel_position[i - 1] >= SIDE_CHANNEL_LEFT &&
+                 frame.channel_position[i - 1] <= BACK_CHANNEL_CENTER &&
+                 frame.channel_position[i - 1] >= SIDE_CHANNEL_LEFT &&
+                 frame.channel_position[i - 1] <= BACK_CHANNEL_CENTER )
+             {
+                if( ( (1 << (frame.channel_position[i - 3] - 2)) & i_faadused ) == 0 &&
+                    ( (1 << (frame.channel_position[i - 2] - 2)) & i_faadused ) == 0 )
+                {
+                    frame.channel_position[i - 3] -= 2;
+                    frame.channel_position[i - 2] -= 2;
+                    i_faadused |= 1 << frame.channel_position[i - 3];
+                    i_faadused |= 1 << frame.channel_position[i - 2];
+                }
+             }
+        }
 
         /* Convert frame.channel_position to our own channel values */
         p_dec->fmt_out.audio.i_physical_channels = 0;