Commit 2cdb7a23 authored by François Cartegnie's avatar François Cartegnie 🤞

codec: faad: handle mid/back pair repeats

Previous faad2 contribs fix was incorrect.
Fix has to be done in decoder module.

This reverts commit 85f0e45b.
parent a2ec3f67
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)
{
......@@ -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)
......
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment