diff mbox series

[FFmpeg-devel,5/6] avcodec/aacdec: don't force a layout when a channel position is unknown

Message ID 20221031211832.8213-3-jamrial@gmail.com
State Accepted
Commit ced6a5affb0ab1a24278b9bade76c36b8636e267
Headers show
Series [FFmpeg-devel,1/6,v3] avcodec/aacdec: fix parsing streams with channel configuration 11 | expand

Checks

Context Check Description
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

James Almer Oct. 31, 2022, 9:18 p.m. UTC
If PCE defines channels not covered by those in the standard configurations
then don't try to come up with some made up layout and just return them in the
coded order.

Fixes al08_44.mp4 from the conformance suite, now reporting and decoding all 48
channels instead of 10.

Signed-off-by: James Almer <jamrial@gmail.com>
---
 libavcodec/aacdec_template.c | 27 ++++++---------------------
 1 file changed, 6 insertions(+), 21 deletions(-)
diff mbox series

Patch

diff --git a/libavcodec/aacdec_template.c b/libavcodec/aacdec_template.c
index 9a85692069..4a88aeae1d 100644
--- a/libavcodec/aacdec_template.c
+++ b/libavcodec/aacdec_template.c
@@ -325,36 +325,19 @@  static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags)
                          AAC_CHANNEL_FRONT, &layout);
         num_front_channels -= 2;
     }
-    while (num_front_channels >= 2) {
-        i += assign_pair(e2c_vec, layout_map, i,
-                         UINT64_MAX,
-                         UINT64_MAX,
-                         AAC_CHANNEL_FRONT, &layout);
-        num_front_channels -= 2;
-    }
+    if (num_front_channels)
+        return 0; // Non standard PCE defined layout
 
     if (num_side_channels >= 2) {
         i += assign_pair(e2c_vec, layout_map, i,
                          AV_CH_SIDE_LEFT,
                          AV_CH_SIDE_RIGHT,
-                         AAC_CHANNEL_FRONT, &layout);
-        num_side_channels -= 2;
-    }
-    while (num_side_channels >= 2) {
-        i += assign_pair(e2c_vec, layout_map, i,
-                         UINT64_MAX,
-                         UINT64_MAX,
                          AAC_CHANNEL_SIDE, &layout);
         num_side_channels -= 2;
     }
+    if (num_side_channels)
+        return 0; // Non standard PCE defined layout
 
-    while (num_back_channels >= 4) {
-        i += assign_pair(e2c_vec, layout_map, i,
-                         UINT64_MAX,
-                         UINT64_MAX,
-                         AAC_CHANNEL_BACK, &layout);
-        num_back_channels -= 2;
-    }
     if (num_back_channels >= 2) {
         i += assign_pair(e2c_vec, layout_map, i,
                          AV_CH_BACK_LEFT,
@@ -373,6 +356,8 @@  static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags)
         i++;
         num_back_channels--;
     }
+    if (num_back_channels)
+        return 0; // Non standard PCE defined layout
 
     if (i < tags && layout_map[i][2] == AAC_CHANNEL_LFE) {
         e2c_vec[i] = (struct elem_to_channel) {