forked from FFmpeg/FFmpeg
avformat/iamfdec: swap back and side streams if both are present
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 <jamrial@gmail.com>
This commit is contained in:
parent
c089c158d6
commit
547408ce1d
3 changed files with 48 additions and 26 deletions
|
@ -81,7 +81,10 @@ static int iamf_read_header(AVFormatContext *s)
|
||||||
|
|
||||||
for (int i = 0; i < iamf->nb_audio_elements; i++) {
|
for (int i = 0; i < iamf->nb_audio_elements; i++) {
|
||||||
IAMFAudioElement *audio_element = iamf->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);
|
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)
|
if (!stg)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
|
@ -92,7 +95,7 @@ static int iamf_read_header(AVFormatContext *s)
|
||||||
stg->params.iamf_audio_element = audio_element->element;
|
stg->params.iamf_audio_element = audio_element->element;
|
||||||
audio_element->element = NULL;
|
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];
|
IAMFSubStream *substream = &audio_element->substreams[j];
|
||||||
AVStream *st = avformat_new_stream(s, NULL);
|
AVStream *st = avformat_new_stream(s, NULL);
|
||||||
|
|
||||||
|
@ -111,8 +114,27 @@ static int iamf_read_header(AVFormatContext *s)
|
||||||
st->disposition |= AV_DISPOSITION_DEFAULT;
|
st->disposition |= AV_DISPOSITION_DEFAULT;
|
||||||
else if (audio_element->nb_layers > 1 || audio_element->layers[0].substream_count > 1)
|
else if (audio_element->nb_layers > 1 || audio_element->layers[0].substream_count > 1)
|
||||||
st->disposition |= AV_DISPOSITION_DEPENDENT;
|
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;
|
st->id = substream->audio_substream_id;
|
||||||
avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate);
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
#include "version_major.h"
|
#include "version_major.h"
|
||||||
|
|
||||||
#define LIBAVFORMAT_VERSION_MINOR 9
|
#define LIBAVFORMAT_VERSION_MINOR 9
|
||||||
#define LIBAVFORMAT_VERSION_MICRO 103
|
#define LIBAVFORMAT_VERSION_MICRO 104
|
||||||
|
|
||||||
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
|
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
|
||||||
LIBAVFORMAT_VERSION_MINOR, \
|
LIBAVFORMAT_VERSION_MINOR, \
|
||||||
|
|
|
@ -45,72 +45,72 @@
|
||||||
0, 0, 0, 4608, 1399, 0x6e89566e
|
0, 0, 0, 4608, 1399, 0x6e89566e
|
||||||
1, 0, 0, 4608, 1399, 0x6e89566e
|
1, 0, 0, 4608, 1399, 0x6e89566e
|
||||||
2, 0, 0, 4608, 1396, 0x0dcb5677
|
2, 0, 0, 4608, 1396, 0x0dcb5677
|
||||||
3, 0, 0, 4608, 1396, 0x0dcb5677
|
3, 0, 0, 4608, 1399, 0x6e89566e
|
||||||
4, 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
|
6, 0, 0, 4608, 1399, 0x6e89566e
|
||||||
0, 4608, 4608, 4608, 1442, 0x6c3c5b13
|
0, 4608, 4608, 4608, 1442, 0x6c3c5b13
|
||||||
1, 4608, 4608, 4608, 1442, 0x6c3c5b13
|
1, 4608, 4608, 4608, 1442, 0x6c3c5b13
|
||||||
2, 4608, 4608, 4608, 1439, 0xc46b5ac5
|
2, 4608, 4608, 4608, 1439, 0xc46b5ac5
|
||||||
3, 4608, 4608, 4608, 1439, 0xc46b5ac5
|
3, 4608, 4608, 4608, 1442, 0x6c3c5b13
|
||||||
4, 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
|
6, 4608, 4608, 4608, 1442, 0x6c3c5b13
|
||||||
0, 9216, 9216, 4608, 1380, 0xc497571b
|
0, 9216, 9216, 4608, 1380, 0xc497571b
|
||||||
1, 9216, 9216, 4608, 1380, 0xc497571b
|
1, 9216, 9216, 4608, 1380, 0xc497571b
|
||||||
2, 9216, 9216, 4608, 1377, 0x5b2a55fe
|
2, 9216, 9216, 4608, 1377, 0x5b2a55fe
|
||||||
3, 9216, 9216, 4608, 1377, 0x5b2a55fe
|
3, 9216, 9216, 4608, 1380, 0xc497571b
|
||||||
4, 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
|
6, 9216, 9216, 4608, 1380, 0xc497571b
|
||||||
0, 13824, 13824, 4608, 1383, 0x48e9510f
|
0, 13824, 13824, 4608, 1383, 0x48e9510f
|
||||||
1, 13824, 13824, 4608, 1383, 0x48e9510f
|
1, 13824, 13824, 4608, 1383, 0x48e9510f
|
||||||
2, 13824, 13824, 4608, 1380, 0x045550d3
|
2, 13824, 13824, 4608, 1380, 0x045550d3
|
||||||
3, 13824, 13824, 4608, 1380, 0x045550d3
|
3, 13824, 13824, 4608, 1383, 0x48e9510f
|
||||||
4, 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
|
6, 13824, 13824, 4608, 1383, 0x48e9510f
|
||||||
0, 18432, 18432, 4608, 1572, 0x9a514719
|
0, 18432, 18432, 4608, 1572, 0x9a514719
|
||||||
1, 18432, 18432, 4608, 1572, 0x9a514719
|
1, 18432, 18432, 4608, 1572, 0x9a514719
|
||||||
2, 18432, 18432, 4608, 1568, 0xa2bc45f4
|
2, 18432, 18432, 4608, 1568, 0xa2bc45f4
|
||||||
3, 18432, 18432, 4608, 1568, 0xa2bc45f4
|
3, 18432, 18432, 4608, 1572, 0x9a514719
|
||||||
4, 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
|
6, 18432, 18432, 4608, 1572, 0x9a514719
|
||||||
0, 23040, 23040, 4608, 1391, 0x74ac5014
|
0, 23040, 23040, 4608, 1391, 0x74ac5014
|
||||||
1, 23040, 23040, 4608, 1391, 0x74ac5014
|
1, 23040, 23040, 4608, 1391, 0x74ac5014
|
||||||
2, 23040, 23040, 4608, 1388, 0x96c85007
|
2, 23040, 23040, 4608, 1388, 0x96c85007
|
||||||
3, 23040, 23040, 4608, 1388, 0x96c85007
|
3, 23040, 23040, 4608, 1391, 0x74ac5014
|
||||||
4, 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
|
6, 23040, 23040, 4608, 1391, 0x74ac5014
|
||||||
0, 27648, 27648, 4608, 1422, 0x2f9d47c5
|
0, 27648, 27648, 4608, 1422, 0x2f9d47c5
|
||||||
1, 27648, 27648, 4608, 1422, 0x2f9d47c5
|
1, 27648, 27648, 4608, 1422, 0x2f9d47c5
|
||||||
2, 27648, 27648, 4608, 1419, 0x4d4d466a
|
2, 27648, 27648, 4608, 1419, 0x4d4d466a
|
||||||
3, 27648, 27648, 4608, 1419, 0x4d4d466a
|
3, 27648, 27648, 4608, 1422, 0x2f9d47c5
|
||||||
4, 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
|
6, 27648, 27648, 4608, 1422, 0x2f9d47c5
|
||||||
0, 32256, 32256, 4608, 1768, 0x2a044b99
|
0, 32256, 32256, 4608, 1768, 0x2a044b99
|
||||||
1, 32256, 32256, 4608, 1768, 0x2a044b99
|
1, 32256, 32256, 4608, 1768, 0x2a044b99
|
||||||
2, 32256, 32256, 4608, 1765, 0xacb84b24
|
2, 32256, 32256, 4608, 1765, 0xacb84b24
|
||||||
3, 32256, 32256, 4608, 1765, 0xacb84b24
|
3, 32256, 32256, 4608, 1768, 0x2a044b99
|
||||||
4, 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
|
6, 32256, 32256, 4608, 1768, 0x2a044b99
|
||||||
0, 36864, 36864, 4608, 1534, 0xb0b35a3f
|
0, 36864, 36864, 4608, 1534, 0xb0b35a3f
|
||||||
1, 36864, 36864, 4608, 1534, 0xb0b35a3f
|
1, 36864, 36864, 4608, 1534, 0xb0b35a3f
|
||||||
2, 36864, 36864, 4608, 1531, 0x996458aa
|
2, 36864, 36864, 4608, 1531, 0x996458aa
|
||||||
3, 36864, 36864, 4608, 1531, 0x996458aa
|
3, 36864, 36864, 4608, 1534, 0xb0b35a3f
|
||||||
4, 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
|
6, 36864, 36864, 4608, 1534, 0xb0b35a3f
|
||||||
0, 41472, 41472, 4608, 926, 0xc26a5eae
|
0, 41472, 41472, 4608, 926, 0xc26a5eae
|
||||||
1, 41472, 41472, 4608, 926, 0xc26a5eae
|
1, 41472, 41472, 4608, 926, 0xc26a5eae
|
||||||
2, 41472, 41472, 4608, 923, 0xa7225edf
|
2, 41472, 41472, 4608, 923, 0xa7225edf
|
||||||
3, 41472, 41472, 4608, 923, 0xa7225edf
|
3, 41472, 41472, 4608, 926, 0xc26a5eae
|
||||||
4, 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
|
6, 41472, 41472, 4608, 926, 0xc26a5eae
|
||||||
[STREAM_GROUP]
|
[STREAM_GROUP]
|
||||||
index=0
|
index=0
|
||||||
|
@ -226,7 +226,7 @@ DISPOSITION:multilayer=0
|
||||||
[/STREAM]
|
[/STREAM]
|
||||||
[STREAM]
|
[STREAM]
|
||||||
index=3
|
index=3
|
||||||
id=0x3
|
id=0x5
|
||||||
DISPOSITION:default=0
|
DISPOSITION:default=0
|
||||||
DISPOSITION:dub=0
|
DISPOSITION:dub=0
|
||||||
DISPOSITION:original=0
|
DISPOSITION:original=0
|
||||||
|
@ -272,7 +272,7 @@ DISPOSITION:multilayer=0
|
||||||
[/STREAM]
|
[/STREAM]
|
||||||
[STREAM]
|
[STREAM]
|
||||||
index=5
|
index=5
|
||||||
id=0x5
|
id=0x3
|
||||||
DISPOSITION:default=0
|
DISPOSITION:default=0
|
||||||
DISPOSITION:dub=0
|
DISPOSITION:dub=0
|
||||||
DISPOSITION:original=0
|
DISPOSITION:original=0
|
||||||
|
@ -462,7 +462,7 @@ DISPOSITION:multilayer=0
|
||||||
[/STREAM]
|
[/STREAM]
|
||||||
[STREAM]
|
[STREAM]
|
||||||
index=3
|
index=3
|
||||||
id=0x3
|
id=0x5
|
||||||
DISPOSITION:default=0
|
DISPOSITION:default=0
|
||||||
DISPOSITION:dub=0
|
DISPOSITION:dub=0
|
||||||
DISPOSITION:original=0
|
DISPOSITION:original=0
|
||||||
|
@ -508,7 +508,7 @@ DISPOSITION:multilayer=0
|
||||||
[/STREAM]
|
[/STREAM]
|
||||||
[STREAM]
|
[STREAM]
|
||||||
index=5
|
index=5
|
||||||
id=0x5
|
id=0x3
|
||||||
DISPOSITION:default=0
|
DISPOSITION:default=0
|
||||||
DISPOSITION:dub=0
|
DISPOSITION:dub=0
|
||||||
DISPOSITION:original=0
|
DISPOSITION:original=0
|
||||||
|
|
Loading…
Add table
Reference in a new issue