Layouts with both pairs (7.1, 7.1.2, etc) in IAMF that follow the definition in
ITU-R BS.2051-3 for Systems I and J also follow its ordering. This means side
comes before back, which is the inverse of how it's defined in AVChannel.

To workaround this without having to use custom order channel layouts, swap the
stream ids in the input IAMF structure, so packets for one are mapped to the
other.

Signed-off-by: James Almer <jamr...@gmail.com>
---
 libavformat/iamfdec.c     | 24 +++++++++++++++++++-
 tests/ref/fate/iamf-7_1_4 | 48 +++++++++++++++++++--------------------
 2 files changed, 47 insertions(+), 25 deletions(-)

diff --git a/libavformat/iamfdec.c b/libavformat/iamfdec.c
index ec80000e36..e1a913dd1c 100644
--- a/libavformat/iamfdec.c
+++ b/libavformat/iamfdec.c
@@ -81,7 +81,10 @@ static int iamf_read_header(AVFormatContext *s)
 
     for (int i = 0; i < iamf->nb_audio_elements; i++) {
         IAMFAudioElement *audio_element = iamf->audio_elements[i];
+        const AVIAMFLayer *layer = 
audio_element->element->layers[audio_element->nb_layers - 1];
         AVStreamGroup *stg = avformat_stream_group_create(s, 
AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT, NULL);
+        int coupled_substream_count = 
audio_element->layers[audio_element->nb_layers - 1].coupled_substream_count;
+        int side_substream_id = -1, back_substream_id = -1;
 
         if (!stg)
             return AVERROR(ENOMEM);
@@ -92,7 +95,7 @@ static int iamf_read_header(AVFormatContext *s)
         stg->params.iamf_audio_element = audio_element->element;
         audio_element->element = NULL;
 
-        for (int j = 0; j < audio_element->nb_substreams; j++) {
+        for (int j = 0, k = 0; j < audio_element->nb_substreams; j++) {
             IAMFSubStream *substream = &audio_element->substreams[j];
             AVStream *st = avformat_new_stream(s, NULL);
 
@@ -111,8 +114,27 @@ static int iamf_read_header(AVFormatContext *s)
                 st->disposition |= AV_DISPOSITION_DEFAULT;
             else if (audio_element->nb_layers > 1 || 
audio_element->layers[0].substream_count > 1)
                 st->disposition |= AV_DISPOSITION_DEPENDENT;
+            if (k == av_channel_layout_index_from_channel(&layer->ch_layout, 
AV_CHAN_BACK_LEFT))
+                back_substream_id = j;
+            else if (k == 
av_channel_layout_index_from_channel(&layer->ch_layout, AV_CHAN_SIDE_LEFT))
+                side_substream_id = j;
             st->id = substream->audio_substream_id;
             avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate);
+
+            k += 1 + (coupled_substream_count-- > 0);
+        }
+
+        // Swap back and side stream ids as our native channel layout ordering 
doen't match the
+        // order from ITU-R - BS.2051-3 for Systems I and J (where side 
channels come before back ones).
+        if (back_substream_id >= 0 && 
av_channel_layout_compare(&layer->ch_layout,
+                                                                
&(AVChannelLayout)AV_CHANNEL_LAYOUT_9POINT1POINT6)) {
+            const IAMFSubStream *back_substream = 
&audio_element->substreams[back_substream_id];
+            const IAMFSubStream *side_substream = 
&audio_element->substreams[side_substream_id];
+            AVStream *back_st = stg->streams[back_substream_id];
+            AVStream *side_st = stg->streams[side_substream_id];
+
+            back_st->id = side_substream->audio_substream_id;
+            side_st->id = back_substream->audio_substream_id;
         }
     }
 
diff --git a/tests/ref/fate/iamf-7_1_4 b/tests/ref/fate/iamf-7_1_4
index ccce96ea84..72b10f771a 100644
--- a/tests/ref/fate/iamf-7_1_4
+++ b/tests/ref/fate/iamf-7_1_4
@@ -45,72 +45,72 @@
 0,          0,          0,     4608,     1399, 0x6e89566e
 1,          0,          0,     4608,     1399, 0x6e89566e
 2,          0,          0,     4608,     1396, 0x0dcb5677
-3,          0,          0,     4608,     1396, 0x0dcb5677
+3,          0,          0,     4608,     1399, 0x6e89566e
 4,          0,          0,     4608,     1399, 0x6e89566e
-5,          0,          0,     4608,     1399, 0x6e89566e
+5,          0,          0,     4608,     1396, 0x0dcb5677
 6,          0,          0,     4608,     1399, 0x6e89566e
 0,       4608,       4608,     4608,     1442, 0x6c3c5b13
 1,       4608,       4608,     4608,     1442, 0x6c3c5b13
 2,       4608,       4608,     4608,     1439, 0xc46b5ac5
-3,       4608,       4608,     4608,     1439, 0xc46b5ac5
+3,       4608,       4608,     4608,     1442, 0x6c3c5b13
 4,       4608,       4608,     4608,     1442, 0x6c3c5b13
-5,       4608,       4608,     4608,     1442, 0x6c3c5b13
+5,       4608,       4608,     4608,     1439, 0xc46b5ac5
 6,       4608,       4608,     4608,     1442, 0x6c3c5b13
 0,       9216,       9216,     4608,     1380, 0xc497571b
 1,       9216,       9216,     4608,     1380, 0xc497571b
 2,       9216,       9216,     4608,     1377, 0x5b2a55fe
-3,       9216,       9216,     4608,     1377, 0x5b2a55fe
+3,       9216,       9216,     4608,     1380, 0xc497571b
 4,       9216,       9216,     4608,     1380, 0xc497571b
-5,       9216,       9216,     4608,     1380, 0xc497571b
+5,       9216,       9216,     4608,     1377, 0x5b2a55fe
 6,       9216,       9216,     4608,     1380, 0xc497571b
 0,      13824,      13824,     4608,     1383, 0x48e9510f
 1,      13824,      13824,     4608,     1383, 0x48e9510f
 2,      13824,      13824,     4608,     1380, 0x045550d3
-3,      13824,      13824,     4608,     1380, 0x045550d3
+3,      13824,      13824,     4608,     1383, 0x48e9510f
 4,      13824,      13824,     4608,     1383, 0x48e9510f
-5,      13824,      13824,     4608,     1383, 0x48e9510f
+5,      13824,      13824,     4608,     1380, 0x045550d3
 6,      13824,      13824,     4608,     1383, 0x48e9510f
 0,      18432,      18432,     4608,     1572, 0x9a514719
 1,      18432,      18432,     4608,     1572, 0x9a514719
 2,      18432,      18432,     4608,     1568, 0xa2bc45f4
-3,      18432,      18432,     4608,     1568, 0xa2bc45f4
+3,      18432,      18432,     4608,     1572, 0x9a514719
 4,      18432,      18432,     4608,     1572, 0x9a514719
-5,      18432,      18432,     4608,     1572, 0x9a514719
+5,      18432,      18432,     4608,     1568, 0xa2bc45f4
 6,      18432,      18432,     4608,     1572, 0x9a514719
 0,      23040,      23040,     4608,     1391, 0x74ac5014
 1,      23040,      23040,     4608,     1391, 0x74ac5014
 2,      23040,      23040,     4608,     1388, 0x96c85007
-3,      23040,      23040,     4608,     1388, 0x96c85007
+3,      23040,      23040,     4608,     1391, 0x74ac5014
 4,      23040,      23040,     4608,     1391, 0x74ac5014
-5,      23040,      23040,     4608,     1391, 0x74ac5014
+5,      23040,      23040,     4608,     1388, 0x96c85007
 6,      23040,      23040,     4608,     1391, 0x74ac5014
 0,      27648,      27648,     4608,     1422, 0x2f9d47c5
 1,      27648,      27648,     4608,     1422, 0x2f9d47c5
 2,      27648,      27648,     4608,     1419, 0x4d4d466a
-3,      27648,      27648,     4608,     1419, 0x4d4d466a
+3,      27648,      27648,     4608,     1422, 0x2f9d47c5
 4,      27648,      27648,     4608,     1422, 0x2f9d47c5
-5,      27648,      27648,     4608,     1422, 0x2f9d47c5
+5,      27648,      27648,     4608,     1419, 0x4d4d466a
 6,      27648,      27648,     4608,     1422, 0x2f9d47c5
 0,      32256,      32256,     4608,     1768, 0x2a044b99
 1,      32256,      32256,     4608,     1768, 0x2a044b99
 2,      32256,      32256,     4608,     1765, 0xacb84b24
-3,      32256,      32256,     4608,     1765, 0xacb84b24
+3,      32256,      32256,     4608,     1768, 0x2a044b99
 4,      32256,      32256,     4608,     1768, 0x2a044b99
-5,      32256,      32256,     4608,     1768, 0x2a044b99
+5,      32256,      32256,     4608,     1765, 0xacb84b24
 6,      32256,      32256,     4608,     1768, 0x2a044b99
 0,      36864,      36864,     4608,     1534, 0xb0b35a3f
 1,      36864,      36864,     4608,     1534, 0xb0b35a3f
 2,      36864,      36864,     4608,     1531, 0x996458aa
-3,      36864,      36864,     4608,     1531, 0x996458aa
+3,      36864,      36864,     4608,     1534, 0xb0b35a3f
 4,      36864,      36864,     4608,     1534, 0xb0b35a3f
-5,      36864,      36864,     4608,     1534, 0xb0b35a3f
+5,      36864,      36864,     4608,     1531, 0x996458aa
 6,      36864,      36864,     4608,     1534, 0xb0b35a3f
 0,      41472,      41472,     4608,      926, 0xc26a5eae
 1,      41472,      41472,     4608,      926, 0xc26a5eae
 2,      41472,      41472,     4608,      923, 0xa7225edf
-3,      41472,      41472,     4608,      923, 0xa7225edf
+3,      41472,      41472,     4608,      926, 0xc26a5eae
 4,      41472,      41472,     4608,      926, 0xc26a5eae
-5,      41472,      41472,     4608,      926, 0xc26a5eae
+5,      41472,      41472,     4608,      923, 0xa7225edf
 6,      41472,      41472,     4608,      926, 0xc26a5eae
 [STREAM_GROUP]
 index=0
@@ -226,7 +226,7 @@ DISPOSITION:multilayer=0
 [/STREAM]
 [STREAM]
 index=3
-id=0x3
+id=0x5
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -272,7 +272,7 @@ DISPOSITION:multilayer=0
 [/STREAM]
 [STREAM]
 index=5
-id=0x5
+id=0x3
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -462,7 +462,7 @@ DISPOSITION:multilayer=0
 [/STREAM]
 [STREAM]
 index=3
-id=0x3
+id=0x5
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -508,7 +508,7 @@ DISPOSITION:multilayer=0
 [/STREAM]
 [STREAM]
 index=5
-id=0x5
+id=0x3
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
-- 
2.47.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to