[FFmpeg-cvslog] avcodec/aacdec: don't force a layout when a channel position is unknown

James Almer git at videolan.org
Fri Nov 4 00:45:14 EET 2022


ffmpeg | branch: master | James Almer <jamrial at gmail.com> | Fri Oct 28 13:35:59 2022 -0300| [ced6a5affb0ab1a24278b9bade76c36b8636e267] | committer: James Almer

avcodec/aacdec: don't force a layout when a channel position is unknown

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 at gmail.com>

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

 libavcodec/aacdec_template.c | 27 ++++++---------------------
 1 file changed, 6 insertions(+), 21 deletions(-)

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) {



More information about the ffmpeg-cvslog mailing list