* [FFmpeg-devel] [PATCH 1/4] avformat/mov_chan: check channel count at compile time by using a nonconst expression @ 2024-04-01 18:56 Marton Balint 2024-04-01 18:56 ` [FFmpeg-devel] [PATCH 2/4] avformat/mov_chan: factorize some layout map search functions Marton Balint ` (3 more replies) 0 siblings, 4 replies; 9+ messages in thread From: Marton Balint @ 2024-04-01 18:56 UTC (permalink / raw) To: ffmpeg-devel; +Cc: Marton Balint If the channel tag does not match the number of channels, the constant expression evaluation should fail. Signed-off-by: Marton Balint <cus@passwd.hu> --- libavformat/mov_chan.c | 48 +++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/libavformat/mov_chan.c b/libavformat/mov_chan.c index e7d181d71f..6ccc26b3f1 100644 --- a/libavformat/mov_chan.c +++ b/libavformat/mov_chan.c @@ -81,24 +81,28 @@ struct MovChannelLayoutMap { }; }; -#define TAG(_0) {.tag = _0} -#define ID(_0) {.id = c_##_0} -#define CHLIST(_0, ...) TAG(_0), __VA_ARGS__ -#define CHLIST01(_0, _1) CHLIST(_0, ID(_1)) -#define CHLIST02(_0, _1, _2) CHLIST(_0, ID(_1), ID(_2)) -#define CHLIST03(_0, _1, _2, _3) CHLIST(_0, ID(_1), ID(_2), ID(_3)) -#define CHLIST04(_0, _1, _2, _3, _4) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4)) -#define CHLIST05(_0, _1, _2, _3, _4, _5) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5)) -#define CHLIST06(_0, _1, _2, _3, _4, _5, _6) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6)) -#define CHLIST07(_0, _1, _2, _3, _4, _5, _6, _7) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7)) -#define CHLIST08(_0, _1, _2, _3, _4, _5, _6, _7, _8) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8)) -#define CHLIST09(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9)) -#define CHLIST16(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ - CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \ - ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16)) -#define CHLIST21(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \ - CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \ - ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16), ID(_17), ID(_18), ID(_19), ID(_20), ID(_21)) +static int nonconst_expr(void) { + return 0; +} + +#define TAG(_tag, _cnt) {.tag = (_tag & 0xffff) == _cnt ? _tag : nonconst_expr()} +#define ID(_0) {.id = c_##_0} +#define CHLIST(_tag, _cnt, ...) TAG(_tag, _cnt), __VA_ARGS__ +#define CHLIST01(_tag, _1) CHLIST(_tag, 1, ID(_1)) +#define CHLIST02(_tag, _1, _2) CHLIST(_tag, 2, ID(_1), ID(_2)) +#define CHLIST03(_tag, _1, _2, _3) CHLIST(_tag, 3, ID(_1), ID(_2), ID(_3)) +#define CHLIST04(_tag, _1, _2, _3, _4) CHLIST(_tag, 4, ID(_1), ID(_2), ID(_3), ID(_4)) +#define CHLIST05(_tag, _1, _2, _3, _4, _5) CHLIST(_tag, 5, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5)) +#define CHLIST06(_tag, _1, _2, _3, _4, _5, _6) CHLIST(_tag, 6, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6)) +#define CHLIST07(_tag, _1, _2, _3, _4, _5, _6, _7) CHLIST(_tag, 7, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7)) +#define CHLIST08(_tag, _1, _2, _3, _4, _5, _6, _7, _8) CHLIST(_tag, 8, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8)) +#define CHLIST09(_tag, _1, _2, _3, _4, _5, _6, _7, _8, _9) CHLIST(_tag, 9, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9)) +#define CHLIST16(_tag, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ + CHLIST(_tag, 16, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \ + ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16)) +#define CHLIST21(_tag, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \ + CHLIST(_tag, 21, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \ + ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16), ID(_17), ID(_18), ID(_19), ID(_20), ID(_21)) static const struct MovChannelLayoutMap mov_ch_layout_map[] = { CHLIST01( MOV_CH_LAYOUT_MONO, C ), @@ -281,14 +285,6 @@ static const struct { static const struct MovChannelLayoutMap* find_layout_map(uint32_t tag) { -#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 1 - { - int i; - for (i = 0; i < FF_ARRAY_ELEMS(mov_ch_layout_map); i += 1 + (mov_ch_layout_map[i].tag & 0xffff)) - av_assert2(mov_ch_layout_map[i].tag & 0xffff0000); - av_assert2(i == FF_ARRAY_ELEMS(mov_ch_layout_map)); - } -#endif for (int i = 0; i < FF_ARRAY_ELEMS(mov_ch_layout_map); i += 1 + (mov_ch_layout_map[i].tag & 0xffff)) if (mov_ch_layout_map[i].tag == tag) return &mov_ch_layout_map[i + 1]; -- 2.35.3 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 9+ messages in thread
* [FFmpeg-devel] [PATCH 2/4] avformat/mov_chan: factorize some layout map search functions 2024-04-01 18:56 [FFmpeg-devel] [PATCH 1/4] avformat/mov_chan: check channel count at compile time by using a nonconst expression Marton Balint @ 2024-04-01 18:56 ` Marton Balint 2024-04-01 18:56 ` [FFmpeg-devel] [PATCH 3/4] avformat/mov_chan: respect channel order when parsing and creating chnl atom Marton Balint ` (2 subsequent siblings) 3 siblings, 0 replies; 9+ messages in thread From: Marton Balint @ 2024-04-01 18:56 UTC (permalink / raw) To: ffmpeg-devel; +Cc: Marton Balint Signed-off-by: Marton Balint <cus@passwd.hu> --- libavformat/mov_chan.c | 62 ++++++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/libavformat/mov_chan.c b/libavformat/mov_chan.c index 6ccc26b3f1..9ee896f229 100644 --- a/libavformat/mov_chan.c +++ b/libavformat/mov_chan.c @@ -187,6 +187,7 @@ static const struct MovChannelLayoutMap mov_ch_layout_map[] = { CHLIST09( MOV_CH_LAYOUT_DTS_8_1_B, Lc, C, Rc, L, R, Ls, Cs, Rs, LFE ), CHLIST16( MOV_CH_LAYOUT_TMH_10_2_STD, L, R, C, Vhc, Lsd, Rsd, Ls, Rs, Vhl, Vhr, Lw, Rw, Csd, Cs, LFE1, LFE2), CHLIST21( MOV_CH_LAYOUT_TMH_10_2_FULL, L, R, C, Vhc, Lsd, Rsd, Ls, Rs, Vhl, Vhr, Lw, Rw, Csd, Cs, LFE1, LFE2, Lc, Rc, HI, VI, Haptic), + { {0} }, }; static const enum MovChannelLayoutTag mov_ch_layouts_aac[] = { @@ -283,11 +284,11 @@ static const struct { { AV_CODEC_ID_NONE, NULL }, }; -static const struct MovChannelLayoutMap* find_layout_map(uint32_t tag) +static const struct MovChannelLayoutMap* find_layout_map(uint32_t tag, const struct MovChannelLayoutMap *map) { - for (int i = 0; i < FF_ARRAY_ELEMS(mov_ch_layout_map); i += 1 + (mov_ch_layout_map[i].tag & 0xffff)) - if (mov_ch_layout_map[i].tag == tag) - return &mov_ch_layout_map[i + 1]; + for (int i = 0; map[i].tag & 0xffff; i += 1 + (map[i].tag & 0xffff)) + if (map[i].tag == tag) + return &map[i + 1]; return NULL; } @@ -299,7 +300,7 @@ static const struct MovChannelLayoutMap* find_layout_map(uint32_t tag) * @param[in] tag channel layout tag * @return <0 on error */ -static int mov_get_channel_layout(AVChannelLayout *ch_layout, uint32_t tag) +static int mov_get_channel_layout(AVChannelLayout *ch_layout, uint32_t tag, const struct MovChannelLayoutMap *map) { int i, channels; const struct MovChannelLayoutMap *layout_map; @@ -307,7 +308,7 @@ static int mov_get_channel_layout(AVChannelLayout *ch_layout, uint32_t tag) channels = tag & 0xFFFF; /* find the channel layout for the specified layout tag */ - layout_map = find_layout_map(tag); + layout_map = find_layout_map(tag, map); if (layout_map) { int ret; av_channel_layout_uninit(ch_layout); @@ -361,12 +362,34 @@ static uint32_t mov_get_channel_label(enum AVChannel channel) return 0; } +static int is_layout_valid_for_tag(const AVChannelLayout *ch_layout, uint32_t tag, const struct MovChannelLayoutMap *map) +{ + const struct MovChannelLayoutMap *layout_map; + int channels = ch_layout->nb_channels; + + /* get the layout map based on the channel count */ + if ((tag & 0xFFFF) != channels) + return 0; + + layout_map = find_layout_map(tag, map); + if (layout_map) { + int i; + for (i = 0; i < channels; i++) { + if (av_channel_layout_channel_from_index(ch_layout, i) != layout_map[i].id) + break; + } + if (i == channels) + return 1; + } + return 0; +} + int ff_mov_get_channel_layout_tag(const AVCodecParameters *par, uint32_t *layout, uint32_t *bitmap, uint32_t **pchannel_desc) { - int i, j; + int i; uint32_t tag = 0; const enum MovChannelLayoutTag *layouts = NULL; @@ -379,26 +402,11 @@ int ff_mov_get_channel_layout_tag(const AVCodecParameters *par, layouts = mov_codec_ch_layouts[i].layouts; if (layouts) { - int channels; - const struct MovChannelLayoutMap *layout_map; - - /* get the layout map based on the channel count */ - channels = par->ch_layout.nb_channels; - /* find the layout tag for the specified channel layout */ - for (i = 0; layouts[i] != 0; i++) { - if ((layouts[i] & 0xFFFF) != channels) - continue; - layout_map = find_layout_map(layouts[i]); - if (layout_map) { - for (j = 0; j < channels; j++) { - if (av_channel_layout_channel_from_index(&par->ch_layout, j) != layout_map[j].id) - break; - } - if (j == channels) - break; - } - } + for (i = 0; layouts[i] != 0; i++) + if (is_layout_valid_for_tag(&par->ch_layout, layouts[i], mov_ch_layout_map)) + break; + tag = layouts[i]; } @@ -505,7 +513,7 @@ int ff_mov_read_chan(AVFormatContext *s, AVIOContext *pb, AVStream *st, if (!ch_layout->nb_channels) ch_layout->nb_channels = nb_channels; if (nb_channels == ch_layout->nb_channels) { - ret = mov_get_channel_layout(ch_layout, layout_tag); + ret = mov_get_channel_layout(ch_layout, layout_tag, mov_ch_layout_map); if (ret < 0) return ret; } else { -- 2.35.3 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 9+ messages in thread
* [FFmpeg-devel] [PATCH 3/4] avformat/mov_chan: respect channel order when parsing and creating chnl atom 2024-04-01 18:56 [FFmpeg-devel] [PATCH 1/4] avformat/mov_chan: check channel count at compile time by using a nonconst expression Marton Balint 2024-04-01 18:56 ` [FFmpeg-devel] [PATCH 2/4] avformat/mov_chan: factorize some layout map search functions Marton Balint @ 2024-04-01 18:56 ` Marton Balint 2024-04-01 19:37 ` James Almer 2024-04-01 18:56 ` [FFmpeg-devel] [PATCH 4/4] avformat/mov_chan: add support for omitted_channel bitmask in " Marton Balint 2024-04-01 20:41 ` [FFmpeg-devel] [PATCH 1/4] avformat/mov_chan: check channel count at compile time by using a nonconst expression Andreas Rheinhardt 3 siblings, 1 reply; 9+ messages in thread From: Marton Balint @ 2024-04-01 18:56 UTC (permalink / raw) To: ffmpeg-devel; +Cc: Marton Balint Previously we always assumed that the channels are in native order, even if they were not. The new channel layout API allows us to signal the proper channel order, so let's do so. Signed-off-by: Marton Balint <cus@passwd.hu> --- libavformat/mov_chan.c | 145 +++++++++++++++++++++---------------- libavformat/mov_chan.h | 5 +- tests/ref/fate/mov-mp4-pcm | 2 +- 3 files changed, 86 insertions(+), 66 deletions(-) diff --git a/libavformat/mov_chan.c b/libavformat/mov_chan.c index 9ee896f229..e3cef3f4e8 100644 --- a/libavformat/mov_chan.c +++ b/libavformat/mov_chan.c @@ -74,6 +74,46 @@ enum { c_Haptic = AV_CHAN_NONE, }; +enum { + iso_L = AV_CHAN_FRONT_LEFT, + iso_R = AV_CHAN_FRONT_RIGHT, + iso_C = AV_CHAN_FRONT_CENTER, + iso_LFE = AV_CHAN_LOW_FREQUENCY, + iso_Lsr = AV_CHAN_BACK_LEFT, + iso_Rsr = AV_CHAN_BACK_RIGHT, + iso_Lc = AV_CHAN_FRONT_LEFT_OF_CENTER, + iso_Rc = AV_CHAN_FRONT_RIGHT_OF_CENTER, + iso_Cs = AV_CHAN_BACK_CENTER, + /* Side and surround are not exactly the same, but in order to have + * consistent 5.1/7.1 layouts we map them to the side channels. */ + iso_Ls = AV_CHAN_SIDE_LEFT, + iso_Lss = AV_CHAN_SIDE_LEFT, + iso_Rs = AV_CHAN_SIDE_RIGHT, + iso_Rss = AV_CHAN_SIDE_RIGHT, + iso_Ts = AV_CHAN_TOP_CENTER, + iso_Lv = AV_CHAN_TOP_FRONT_LEFT, + iso_Cv = AV_CHAN_TOP_FRONT_CENTER, + iso_Rv = AV_CHAN_TOP_FRONT_RIGHT, + iso_Lvr = AV_CHAN_TOP_BACK_LEFT, + iso_Cvr = AV_CHAN_TOP_BACK_CENTER, + iso_Rvr = AV_CHAN_TOP_BACK_RIGHT, + // = AV_CHAN_STEREO_LEFT, + // = AV_CHAN_STEREO_RIGHT, + iso_Lw = AV_CHAN_WIDE_LEFT, + iso_Rw = AV_CHAN_WIDE_RIGHT, + iso_Lsd = AV_CHAN_SURROUND_DIRECT_LEFT, + iso_Rsd = AV_CHAN_SURROUND_DIRECT_RIGHT, + iso_LFE2 = AV_CHAN_LOW_FREQUENCY_2, + iso_Lvss = AV_CHAN_TOP_SIDE_LEFT, + iso_Rvss = AV_CHAN_TOP_SIDE_RIGHT, + iso_Cb = AV_CHAN_BOTTOM_FRONT_CENTER, + iso_Lb = AV_CHAN_BOTTOM_FRONT_LEFT, + iso_Rb = AV_CHAN_BOTTOM_FRONT_RIGHT, + /* The following have no exact counterparts */ + iso_Lvs = AV_CHAN_NONE, + iso_Rvs = AV_CHAN_NONE, +}; + struct MovChannelLayoutMap { union { uint32_t tag; @@ -103,6 +143,10 @@ static int nonconst_expr(void) { #define CHLIST21(_tag, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \ CHLIST(_tag, 21, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \ ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16), ID(_17), ID(_18), ID(_19), ID(_20), ID(_21)) +#define CHLIST24(_tag, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \ + CHLIST(_tag, 24, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \ + ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16), ID(_17), ID(_18), ID(_19), ID(_20), \ + ID(_21), ID(_22), ID(_23), ID(_24)) static const struct MovChannelLayoutMap mov_ch_layout_map[] = { CHLIST01( MOV_CH_LAYOUT_MONO, C ), @@ -190,6 +234,29 @@ static const struct MovChannelLayoutMap mov_ch_layout_map[] = { { {0} }, }; +#undef ID +#undef TAG +#define ID(_0) {.id = iso_##_0} +#define TAG(_tag, _cnt) {.tag = (_tag << 16) | _cnt} + +/* ISO/IEC 23001-8 */ +static const struct MovChannelLayoutMap iso_ch_layout_map[] = { + CHLIST01( 1, C ), + CHLIST02( 2, L, R ), + CHLIST03( 3, C, L, R ), + CHLIST04( 4, C, L, R, Cs ), + CHLIST05( 5, C, L, R, Ls, Rs ), + CHLIST06( 6, C, L, R, Ls, Rs, LFE ), + CHLIST08( 7, C, Lc, Rc, L, R, Ls, Rs, LFE ), + CHLIST03( 9, L, R, Cs ), + CHLIST04( 10, L, R, Ls, Rs ), + CHLIST07( 11, C, L, R, Ls, Rs, Cs, LFE ), + CHLIST08( 12, C, L, R, Ls, Rs, Lsr, Rsr, LFE ), + CHLIST24( 13, C, Lc, Rc, L, R, Lss, Rss, Lsr, Rsr, Cs, LFE, LFE2, Cv, Lv, Rv, Lvss, Rvss, Ts, Lvr, Rvr, Cvr, Cb, Lb, Rb), + CHLIST08( 14, C, L, R, Ls, Rs, LFE, Lv, Rv), + { {0} }, +}; + static const enum MovChannelLayoutTag mov_ch_layouts_aac[] = { MOV_CH_LAYOUT_MONO, MOV_CH_LAYOUT_STEREO, @@ -529,60 +596,6 @@ out: return ret; } -/* ISO/IEC 23001-8, 8.2 */ -static const AVChannelLayout iso_channel_configuration[] = { - // 0: any setup - {0}, - - // 1: centre front - AV_CHANNEL_LAYOUT_MONO, - - // 2: left front, right front - AV_CHANNEL_LAYOUT_STEREO, - - // 3: centre front, left front, right front - AV_CHANNEL_LAYOUT_SURROUND, - - // 4: centre front, left front, right front, rear centre - AV_CHANNEL_LAYOUT_4POINT0, - - // 5: centre front, left front, right front, left surround, right surround - AV_CHANNEL_LAYOUT_5POINT0, - - // 6: 5 + LFE - AV_CHANNEL_LAYOUT_5POINT1, - - // 7: centre front, left front centre, right front centre, - // left front, right front, left surround, right surround, LFE - AV_CHANNEL_LAYOUT_7POINT1_WIDE, - - // 8: channel1, channel2 - AV_CHANNEL_LAYOUT_STEREO_DOWNMIX, - - // 9: left front, right front, rear centre - AV_CHANNEL_LAYOUT_2_1, - - // 10: left front, right front, left surround, right surround - AV_CHANNEL_LAYOUT_2_2, - - // 11: centre front, left front, right front, left surround, right surround, rear centre, LFE - AV_CHANNEL_LAYOUT_6POINT1, - - // 12: centre front, left front, right front - // left surround, right surround - // rear surround left, rear surround right - // LFE - AV_CHANNEL_LAYOUT_7POINT1, - - // 13: - AV_CHANNEL_LAYOUT_22POINT2, - - // 14: - AV_CHANNEL_LAYOUT_7POINT1_TOP_BACK, - - // TODO: 15 - 20 -}; - /* ISO/IEC 23001-8, table 8 */ static const enum AVChannel iso_channel_position[] = { // 0: left front @@ -718,9 +731,9 @@ int ff_mov_get_channel_config_from_layout(const AVChannelLayout *layout, int *co { // Set default value which means any setup in 23001-8 *config = 0; - for (int i = 0; i < FF_ARRAY_ELEMS(iso_channel_configuration); i++) { - if (!av_channel_layout_compare(layout, iso_channel_configuration + i)) { - *config = i; + for (int i = 0; iso_ch_layout_map[i].tag & 0xffff; i += 1 + (iso_ch_layout_map[i].tag & 0xffff)) { + if (is_layout_valid_for_tag(layout, iso_ch_layout_map[i].tag, &iso_ch_layout_map[i])) { + *config = iso_ch_layout_map[i].tag >> 16; break; } } @@ -730,12 +743,16 @@ int ff_mov_get_channel_config_from_layout(const AVChannelLayout *layout, int *co int ff_mov_get_channel_layout_from_config(int config, AVChannelLayout *layout) { - if (config > 0 && config < FF_ARRAY_ELEMS(iso_channel_configuration)) { - av_channel_layout_copy(layout, &iso_channel_configuration[config]); - return 0; - } + if (config > 0) { + uint32_t layout_tag; + + if (layout->nb_channels <= 0 || layout->nb_channels > UINT16_MAX) + return AVERROR_INVALIDDATA; - return -1; + layout_tag = (config << 16) | layout->nb_channels; + return mov_get_channel_layout(layout, layout_tag, iso_ch_layout_map); + } + return 1; } int ff_mov_get_channel_positions_from_layout(const AVChannelLayout *layout, @@ -815,7 +832,9 @@ int ff_mov_read_chnl(AVFormatContext *s, AVIOContext *pb, AVStream *st) omitted_channel_map); return AVERROR_PATCHWELCOME; } - ff_mov_get_channel_layout_from_config(layout, &st->codecpar->ch_layout); + ret = ff_mov_get_channel_layout_from_config(layout, &st->codecpar->ch_layout); + if (ret < 0) + return ret; } } diff --git a/libavformat/mov_chan.h b/libavformat/mov_chan.h index e480809c44..604395d7d3 100644 --- a/libavformat/mov_chan.h +++ b/libavformat/mov_chan.h @@ -172,9 +172,10 @@ int ff_mov_get_channel_config_from_layout(const AVChannelLayout *layout, int *co /** * Get AVChannelLayout from ISO/IEC 23001-8 ChannelConfiguration. * - * @return 0 for success, -1 for doesn't match, layout is untouched on failure + * @return 1 if the config was unknown, layout is untouched in this case + * 0 if the config was found + * <0 on error */ - int ff_mov_get_channel_layout_from_config(int config, AVChannelLayout *layout); /** diff --git a/tests/ref/fate/mov-mp4-pcm b/tests/ref/fate/mov-mp4-pcm index 6bae8f800b..19a978df95 100644 --- a/tests/ref/fate/mov-mp4-pcm +++ b/tests/ref/fate/mov-mp4-pcm @@ -1,4 +1,4 @@ -99ad26b4054794e84bd962a1124cdccf *tests/data/fate/mov-mp4-pcm.mp4 +462668dd69e7ce4fde4934d1d5978531 *tests/data/fate/mov-mp4-pcm.mp4 10587977 tests/data/fate/mov-mp4-pcm.mp4 #tb 0: 1/44100 #media_type 0: audio -- 2.35.3 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [FFmpeg-devel] [PATCH 3/4] avformat/mov_chan: respect channel order when parsing and creating chnl atom 2024-04-01 18:56 ` [FFmpeg-devel] [PATCH 3/4] avformat/mov_chan: respect channel order when parsing and creating chnl atom Marton Balint @ 2024-04-01 19:37 ` James Almer 2024-04-01 20:43 ` Marton Balint 0 siblings, 1 reply; 9+ messages in thread From: James Almer @ 2024-04-01 19:37 UTC (permalink / raw) To: ffmpeg-devel On 4/1/2024 3:56 PM, Marton Balint wrote: > Previously we always assumed that the channels are in native order, even if > they were not. The new channel layout API allows us to signal the proper > channel order, so let's do so. > > Signed-off-by: Marton Balint <cus@passwd.hu> > --- > libavformat/mov_chan.c | 145 +++++++++++++++++++++---------------- > libavformat/mov_chan.h | 5 +- > tests/ref/fate/mov-mp4-pcm | 2 +- > 3 files changed, 86 insertions(+), 66 deletions(-) [...] > diff --git a/tests/ref/fate/mov-mp4-pcm b/tests/ref/fate/mov-mp4-pcm > index 6bae8f800b..19a978df95 100644 > --- a/tests/ref/fate/mov-mp4-pcm > +++ b/tests/ref/fate/mov-mp4-pcm > @@ -1,4 +1,4 @@ > -99ad26b4054794e84bd962a1124cdccf *tests/data/fate/mov-mp4-pcm.mp4 > +462668dd69e7ce4fde4934d1d5978531 *tests/data/fate/mov-mp4-pcm.mp4 What changes in the output? > 10587977 tests/data/fate/mov-mp4-pcm.mp4 > #tb 0: 1/44100 > #media_type 0: audio _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [FFmpeg-devel] [PATCH 3/4] avformat/mov_chan: respect channel order when parsing and creating chnl atom 2024-04-01 19:37 ` James Almer @ 2024-04-01 20:43 ` Marton Balint 0 siblings, 0 replies; 9+ messages in thread From: Marton Balint @ 2024-04-01 20:43 UTC (permalink / raw) To: FFmpeg development discussions and patches On Mon, 1 Apr 2024, James Almer wrote: > On 4/1/2024 3:56 PM, Marton Balint wrote: >> Previously we always assumed that the channels are in native order, even >> if >> they were not. The new channel layout API allows us to signal the proper >> channel order, so let's do so. >> >> Signed-off-by: Marton Balint <cus@passwd.hu> >> --- >> libavformat/mov_chan.c | 145 +++++++++++++++++++++---------------- >> libavformat/mov_chan.h | 5 +- >> tests/ref/fate/mov-mp4-pcm | 2 +- >> 3 files changed, 86 insertions(+), 66 deletions(-) > > [...] > >> diff --git a/tests/ref/fate/mov-mp4-pcm b/tests/ref/fate/mov-mp4-pcm >> index 6bae8f800b..19a978df95 100644 >> --- a/tests/ref/fate/mov-mp4-pcm >> +++ b/tests/ref/fate/mov-mp4-pcm >> @@ -1,4 +1,4 @@ >> -99ad26b4054794e84bd962a1124cdccf *tests/data/fate/mov-mp4-pcm.mp4 >> +462668dd69e7ce4fde4934d1d5978531 *tests/data/fate/mov-mp4-pcm.mp4 > > What changes in the output? The chnl atom changes for the 7.1 layout, the order of channels (being in native order) is different from the the ISO order, so defined layout 12 cannot be used. Regards, Marton _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 9+ messages in thread
* [FFmpeg-devel] [PATCH 4/4] avformat/mov_chan: add support for omitted_channel bitmask in chnl atom 2024-04-01 18:56 [FFmpeg-devel] [PATCH 1/4] avformat/mov_chan: check channel count at compile time by using a nonconst expression Marton Balint 2024-04-01 18:56 ` [FFmpeg-devel] [PATCH 2/4] avformat/mov_chan: factorize some layout map search functions Marton Balint 2024-04-01 18:56 ` [FFmpeg-devel] [PATCH 3/4] avformat/mov_chan: respect channel order when parsing and creating chnl atom Marton Balint @ 2024-04-01 18:56 ` Marton Balint 2024-04-01 20:41 ` [FFmpeg-devel] [PATCH 1/4] avformat/mov_chan: check channel count at compile time by using a nonconst expression Andreas Rheinhardt 3 siblings, 0 replies; 9+ messages in thread From: Marton Balint @ 2024-04-01 18:56 UTC (permalink / raw) To: ffmpeg-devel; +Cc: Marton Balint Signed-off-by: Marton Balint <cus@passwd.hu> --- libavformat/mov_chan.c | 43 ++++++++++++++++++++++-------------------- libavformat/mov_chan.h | 2 +- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/libavformat/mov_chan.c b/libavformat/mov_chan.c index e3cef3f4e8..e591ff031b 100644 --- a/libavformat/mov_chan.c +++ b/libavformat/mov_chan.c @@ -367,25 +367,33 @@ static const struct MovChannelLayoutMap* find_layout_map(uint32_t tag, const str * @param[in] tag channel layout tag * @return <0 on error */ -static int mov_get_channel_layout(AVChannelLayout *ch_layout, uint32_t tag, const struct MovChannelLayoutMap *map) +static int mov_get_channel_layout(AVChannelLayout *ch_layout, uint32_t tag, uint64_t omitted_channel_map, const struct MovChannelLayoutMap *map) { - int i, channels; const struct MovChannelLayoutMap *layout_map; - channels = tag & 0xFFFF; - /* find the channel layout for the specified layout tag */ layout_map = find_layout_map(tag, map); if (layout_map) { int ret; + int map_layout_nb_channels = tag & 0xFFFF; + int nb_channels = ch_layout->nb_channels; + + /* Omitted channel bits must not exceed number of channels in map */ + if (omitted_channel_map >> map_layout_nb_channels) + return AVERROR_INVALIDDATA; + av_channel_layout_uninit(ch_layout); - ret = av_channel_layout_custom_init(ch_layout, channels); + ret = av_channel_layout_custom_init(ch_layout, nb_channels); if (ret < 0) return ret; - for (i = 0; i < channels; i++) { - enum AVChannel id = layout_map[i].id; - ch_layout->u.map[i].id = (id != AV_CHAN_NONE ? id : AV_CHAN_UNKNOWN); + + for (int i = 0, idx = 0; i < map_layout_nb_channels && idx < nb_channels; i++, omitted_channel_map >>= 1) { + if (!(omitted_channel_map & 1)) { + enum AVChannel id = layout_map[i].id; + ch_layout->u.map[idx++].id = (id != AV_CHAN_NONE ? id : AV_CHAN_UNKNOWN); + } } + return av_channel_layout_retype(ch_layout, 0, AV_CHANNEL_LAYOUT_RETYPE_FLAG_CANONICAL); } return 0; @@ -580,7 +588,7 @@ int ff_mov_read_chan(AVFormatContext *s, AVIOContext *pb, AVStream *st, if (!ch_layout->nb_channels) ch_layout->nb_channels = nb_channels; if (nb_channels == ch_layout->nb_channels) { - ret = mov_get_channel_layout(ch_layout, layout_tag, mov_ch_layout_map); + ret = mov_get_channel_layout(ch_layout, layout_tag, 0, mov_ch_layout_map); if (ret < 0) return ret; } else { @@ -741,16 +749,17 @@ int ff_mov_get_channel_config_from_layout(const AVChannelLayout *layout, int *co return 0; } -int ff_mov_get_channel_layout_from_config(int config, AVChannelLayout *layout) +int ff_mov_get_channel_layout_from_config(int config, AVChannelLayout *layout, uint64_t omitted_channel_map) { if (config > 0) { uint32_t layout_tag; + int nb_omitted_channels = av_popcount64(omitted_channel_map); - if (layout->nb_channels <= 0 || layout->nb_channels > UINT16_MAX) + if (layout->nb_channels <= 0 || layout->nb_channels > UINT16_MAX - nb_omitted_channels) return AVERROR_INVALIDDATA; - layout_tag = (config << 16) | layout->nb_channels; - return mov_get_channel_layout(layout, layout_tag, iso_ch_layout_map); + layout_tag = (config << 16) | (layout->nb_channels + nb_omitted_channels); + return mov_get_channel_layout(layout, layout_tag, omitted_channel_map, iso_ch_layout_map); } return 1; } @@ -826,13 +835,7 @@ int ff_mov_read_chnl(AVFormatContext *s, AVIOContext *pb, AVStream *st) return ret; } else { uint64_t omitted_channel_map = avio_rb64(pb); - - if (omitted_channel_map) { - avpriv_request_sample(s, "omitted_channel_map 0x%" PRIx64 " != 0", - omitted_channel_map); - return AVERROR_PATCHWELCOME; - } - ret = ff_mov_get_channel_layout_from_config(layout, &st->codecpar->ch_layout); + ret = ff_mov_get_channel_layout_from_config(layout, &st->codecpar->ch_layout, omitted_channel_map); if (ret < 0) return ret; } diff --git a/libavformat/mov_chan.h b/libavformat/mov_chan.h index 604395d7d3..ea8be47196 100644 --- a/libavformat/mov_chan.h +++ b/libavformat/mov_chan.h @@ -176,7 +176,7 @@ int ff_mov_get_channel_config_from_layout(const AVChannelLayout *layout, int *co * 0 if the config was found * <0 on error */ -int ff_mov_get_channel_layout_from_config(int config, AVChannelLayout *layout); +int ff_mov_get_channel_layout_from_config(int config, AVChannelLayout *layout, uint64_t omitted_channel_map); /** * Get ISO/IEC 23001-8 OutputChannelPosition from AVChannelLayout. -- 2.35.3 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [FFmpeg-devel] [PATCH 1/4] avformat/mov_chan: check channel count at compile time by using a nonconst expression 2024-04-01 18:56 [FFmpeg-devel] [PATCH 1/4] avformat/mov_chan: check channel count at compile time by using a nonconst expression Marton Balint ` (2 preceding siblings ...) 2024-04-01 18:56 ` [FFmpeg-devel] [PATCH 4/4] avformat/mov_chan: add support for omitted_channel bitmask in " Marton Balint @ 2024-04-01 20:41 ` Andreas Rheinhardt 2024-04-02 22:40 ` [FFmpeg-devel] [PATCH v2 1/4] avformat/mov_chan: check channel count of layout tags at compile time Marton Balint 3 siblings, 1 reply; 9+ messages in thread From: Andreas Rheinhardt @ 2024-04-01 20:41 UTC (permalink / raw) To: ffmpeg-devel Marton Balint: > If the channel tag does not match the number of channels, the constant > expression evaluation should fail. > > Signed-off-by: Marton Balint <cus@passwd.hu> > --- > libavformat/mov_chan.c | 48 +++++++++++++++++++----------------------- > 1 file changed, 22 insertions(+), 26 deletions(-) > > diff --git a/libavformat/mov_chan.c b/libavformat/mov_chan.c > index e7d181d71f..6ccc26b3f1 100644 > --- a/libavformat/mov_chan.c > +++ b/libavformat/mov_chan.c > @@ -81,24 +81,28 @@ struct MovChannelLayoutMap { > }; > }; > > -#define TAG(_0) {.tag = _0} > -#define ID(_0) {.id = c_##_0} > -#define CHLIST(_0, ...) TAG(_0), __VA_ARGS__ > -#define CHLIST01(_0, _1) CHLIST(_0, ID(_1)) > -#define CHLIST02(_0, _1, _2) CHLIST(_0, ID(_1), ID(_2)) > -#define CHLIST03(_0, _1, _2, _3) CHLIST(_0, ID(_1), ID(_2), ID(_3)) > -#define CHLIST04(_0, _1, _2, _3, _4) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4)) > -#define CHLIST05(_0, _1, _2, _3, _4, _5) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5)) > -#define CHLIST06(_0, _1, _2, _3, _4, _5, _6) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6)) > -#define CHLIST07(_0, _1, _2, _3, _4, _5, _6, _7) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7)) > -#define CHLIST08(_0, _1, _2, _3, _4, _5, _6, _7, _8) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8)) > -#define CHLIST09(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9)) > -#define CHLIST16(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ > - CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \ > - ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16)) > -#define CHLIST21(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \ > - CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \ > - ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16), ID(_17), ID(_18), ID(_19), ID(_20), ID(_21)) > +static int nonconst_expr(void) { > + return 0; > +} > + > +#define TAG(_tag, _cnt) {.tag = (_tag & 0xffff) == _cnt ? _tag : nonconst_expr()} > +#define ID(_0) {.id = c_##_0} > +#define CHLIST(_tag, _cnt, ...) TAG(_tag, _cnt), __VA_ARGS__ > +#define CHLIST01(_tag, _1) CHLIST(_tag, 1, ID(_1)) > +#define CHLIST02(_tag, _1, _2) CHLIST(_tag, 2, ID(_1), ID(_2)) > +#define CHLIST03(_tag, _1, _2, _3) CHLIST(_tag, 3, ID(_1), ID(_2), ID(_3)) > +#define CHLIST04(_tag, _1, _2, _3, _4) CHLIST(_tag, 4, ID(_1), ID(_2), ID(_3), ID(_4)) > +#define CHLIST05(_tag, _1, _2, _3, _4, _5) CHLIST(_tag, 5, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5)) > +#define CHLIST06(_tag, _1, _2, _3, _4, _5, _6) CHLIST(_tag, 6, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6)) > +#define CHLIST07(_tag, _1, _2, _3, _4, _5, _6, _7) CHLIST(_tag, 7, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7)) > +#define CHLIST08(_tag, _1, _2, _3, _4, _5, _6, _7, _8) CHLIST(_tag, 8, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8)) > +#define CHLIST09(_tag, _1, _2, _3, _4, _5, _6, _7, _8, _9) CHLIST(_tag, 9, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9)) > +#define CHLIST16(_tag, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ > + CHLIST(_tag, 16, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \ > + ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16)) > +#define CHLIST21(_tag, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \ > + CHLIST(_tag, 21, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \ > + ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16), ID(_17), ID(_18), ID(_19), ID(_20), ID(_21)) > > static const struct MovChannelLayoutMap mov_ch_layout_map[] = { > CHLIST01( MOV_CH_LAYOUT_MONO, C ), > @@ -281,14 +285,6 @@ static const struct { > > static const struct MovChannelLayoutMap* find_layout_map(uint32_t tag) > { > -#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 1 > - { > - int i; > - for (i = 0; i < FF_ARRAY_ELEMS(mov_ch_layout_map); i += 1 + (mov_ch_layout_map[i].tag & 0xffff)) > - av_assert2(mov_ch_layout_map[i].tag & 0xffff0000); > - av_assert2(i == FF_ARRAY_ELEMS(mov_ch_layout_map)); > - } > -#endif > for (int i = 0; i < FF_ARRAY_ELEMS(mov_ch_layout_map); i += 1 + (mov_ch_layout_map[i].tag & 0xffff)) > if (mov_ch_layout_map[i].tag == tag) > return &mov_ch_layout_map[i + 1]; When you want to check something at compile-time, wouldn't a static_assert be the more appropriate tool? It allows to get nicer error messages. I see two ways how to use static_assert here (a) is preferred): a) Turn the table used to initialize mov_ch_layout_map into an X-macro and make TAG evaluate to static_assert((_tag & 0xffff) == _cnt, "Channel count of " #_tag " wrong");} in one pass. b) Shoehorn it into the TAG macro, e.g. like so: #define CHECK_CONSISTENCY(_tag, _cnt) \ sizeof(struct {int a; static_assert((_tag & 0xffff) == _cnt, \ "Channel count of " #_tag " wrong");}) #define TAG(_tag, _cnt) {.tag = CHECK_CONSISTENCY(_tag, (_cnt)) ? _tag : 0} static_assert may only be used where a declaration can be used; we use sizeof with a new struct type to circumvent this. This is legal C, but unfortunately MSVC warns about it (although it accepts it). - Andreas _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 9+ messages in thread
* [FFmpeg-devel] [PATCH v2 1/4] avformat/mov_chan: check channel count of layout tags at compile time 2024-04-01 20:41 ` [FFmpeg-devel] [PATCH 1/4] avformat/mov_chan: check channel count at compile time by using a nonconst expression Andreas Rheinhardt @ 2024-04-02 22:40 ` Marton Balint 2024-04-08 19:48 ` Marton Balint 0 siblings, 1 reply; 9+ messages in thread From: Marton Balint @ 2024-04-02 22:40 UTC (permalink / raw) To: ffmpeg-devel; +Cc: Marton Balint We can do this by using an X-macro for channel map declaration and doing a static_assert() in one pass for the check. Thanks for Andreas Rheinhardt for the suggestion. Signed-off-by: Marton Balint <cus@passwd.hu> --- libavformat/mov_chan.c | 217 ++++++++++++++++++++--------------------- 1 file changed, 108 insertions(+), 109 deletions(-) diff --git a/libavformat/mov_chan.c b/libavformat/mov_chan.c index e7d181d71f..4bb0ee7405 100644 --- a/libavformat/mov_chan.c +++ b/libavformat/mov_chan.c @@ -23,6 +23,7 @@ * @author Justin Ruggles */ +#include <assert.h> #include <stdint.h> #include "libavutil/avassert.h" @@ -81,108 +82,114 @@ struct MovChannelLayoutMap { }; }; -#define TAG(_0) {.tag = _0} -#define ID(_0) {.id = c_##_0} -#define CHLIST(_0, ...) TAG(_0), __VA_ARGS__ -#define CHLIST01(_0, _1) CHLIST(_0, ID(_1)) -#define CHLIST02(_0, _1, _2) CHLIST(_0, ID(_1), ID(_2)) -#define CHLIST03(_0, _1, _2, _3) CHLIST(_0, ID(_1), ID(_2), ID(_3)) -#define CHLIST04(_0, _1, _2, _3, _4) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4)) -#define CHLIST05(_0, _1, _2, _3, _4, _5) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5)) -#define CHLIST06(_0, _1, _2, _3, _4, _5, _6) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6)) -#define CHLIST07(_0, _1, _2, _3, _4, _5, _6, _7) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7)) -#define CHLIST08(_0, _1, _2, _3, _4, _5, _6, _7, _8) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8)) -#define CHLIST09(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9)) -#define CHLIST16(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ - CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \ - ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16)) -#define CHLIST21(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \ - CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \ - ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16), ID(_17), ID(_18), ID(_19), ID(_20), ID(_21)) - +#define TAG(_tag, _cnt) {.tag = _tag} +#define ID(_0) {.id = c_##_0} +#define CHLIST01(_tag, _1) CHLIST(_tag, 1, ID(_1)) +#define CHLIST02(_tag, _1, _2) CHLIST(_tag, 2, ID(_1), ID(_2)) +#define CHLIST03(_tag, _1, _2, _3) CHLIST(_tag, 3, ID(_1), ID(_2), ID(_3)) +#define CHLIST04(_tag, _1, _2, _3, _4) CHLIST(_tag, 4, ID(_1), ID(_2), ID(_3), ID(_4)) +#define CHLIST05(_tag, _1, _2, _3, _4, _5) CHLIST(_tag, 5, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5)) +#define CHLIST06(_tag, _1, _2, _3, _4, _5, _6) CHLIST(_tag, 6, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6)) +#define CHLIST07(_tag, _1, _2, _3, _4, _5, _6, _7) CHLIST(_tag, 7, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7)) +#define CHLIST08(_tag, _1, _2, _3, _4, _5, _6, _7, _8) CHLIST(_tag, 8, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8)) +#define CHLIST09(_tag, _1, _2, _3, _4, _5, _6, _7, _8, _9) CHLIST(_tag, 9, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9)) +#define CHLIST16(_tag, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ + CHLIST(_tag, 16, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \ + ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16)) +#define CHLIST21(_tag, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \ + CHLIST(_tag, 21, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \ + ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16), ID(_17), ID(_18), ID(_19), ID(_20), ID(_21)) + +#define MOV_CH_LAYOUT_MAP \ + CHLIST01( MOV_CH_LAYOUT_MONO, C )\ + CHLIST02( MOV_CH_LAYOUT_STEREO, L, R )\ + CHLIST02( MOV_CH_LAYOUT_STEREOHEADPHONES, L, R )\ + CHLIST02( MOV_CH_LAYOUT_BINAURAL, L, R )\ + CHLIST02( MOV_CH_LAYOUT_MIDSIDE, L, R )\ + CHLIST02( MOV_CH_LAYOUT_XY, L, R )\ + CHLIST02( MOV_CH_LAYOUT_MATRIXSTEREO, Lt, Rt )\ + CHLIST02( MOV_CH_LAYOUT_AC3_1_0_1, C, LFE )\ + CHLIST03( MOV_CH_LAYOUT_MPEG_3_0_A, L, R, C )\ + CHLIST03( MOV_CH_LAYOUT_MPEG_3_0_B, C, L, R )\ + CHLIST03( MOV_CH_LAYOUT_AC3_3_0, L, C, R )\ + CHLIST03( MOV_CH_LAYOUT_ITU_2_1, L, R, Cs )\ + CHLIST03( MOV_CH_LAYOUT_DVD_4, L, R, LFE )\ + CHLIST04( MOV_CH_LAYOUT_AMBISONIC_B_FORMAT, W, X, Y, Z )\ + CHLIST04( MOV_CH_LAYOUT_QUADRAPHONIC, L, R, Rls, Rrs )\ + CHLIST04( MOV_CH_LAYOUT_MPEG_4_0_A, L, R, C, Cs )\ + CHLIST04( MOV_CH_LAYOUT_MPEG_4_0_B, C, L, R, Cs )\ + CHLIST04( MOV_CH_LAYOUT_AC3_3_1, L, C, R, Cs )\ + CHLIST04( MOV_CH_LAYOUT_ITU_2_2, L, R, Ls, Rs )\ + CHLIST04( MOV_CH_LAYOUT_DVD_5, L, R, LFE, Cs )\ + CHLIST04( MOV_CH_LAYOUT_AC3_2_1_1, L, R, Cs, LFE )\ + CHLIST04( MOV_CH_LAYOUT_DVD_10, L, R, C, LFE )\ + CHLIST04( MOV_CH_LAYOUT_AC3_3_0_1, L, C, R, LFE )\ + CHLIST04( MOV_CH_LAYOUT_DTS_3_1, C, L, R, LFE )\ + CHLIST05( MOV_CH_LAYOUT_PENTAGONAL, L, R, Rls, Rrs, C )\ + CHLIST05( MOV_CH_LAYOUT_MPEG_5_0_A, L, R, C, Ls, Rs )\ + CHLIST05( MOV_CH_LAYOUT_MPEG_5_0_B, L, R, Ls, Rs, C )\ + CHLIST05( MOV_CH_LAYOUT_MPEG_5_0_C, L, C, R, Ls, Rs )\ + CHLIST05( MOV_CH_LAYOUT_MPEG_5_0_D, C, L, R, Ls, Rs )\ + CHLIST05( MOV_CH_LAYOUT_DVD_6, L, R, LFE, Ls, Rs )\ + CHLIST05( MOV_CH_LAYOUT_DVD_18, L, R, Ls, Rs, LFE )\ + CHLIST05( MOV_CH_LAYOUT_DVD_11, L, R, C, LFE, Cs )\ + CHLIST05( MOV_CH_LAYOUT_AC3_3_1_1, L, C, R, Cs, LFE )\ + CHLIST05( MOV_CH_LAYOUT_DTS_4_1, C, L, R, Cs, LFE )\ + CHLIST06( MOV_CH_LAYOUT_HEXAGONAL, L, R, Rls, Rrs, C, Cs )\ + CHLIST06( MOV_CH_LAYOUT_DTS_6_0_C, C, Cs, L, R, Rls, Rrs )\ + CHLIST06( MOV_CH_LAYOUT_MPEG_5_1_A, L, R, C, LFE, Ls, Rs )\ + CHLIST06( MOV_CH_LAYOUT_MPEG_5_1_B, L, R, Ls, Rs, C, LFE )\ + CHLIST06( MOV_CH_LAYOUT_MPEG_5_1_C, L, C, R, Ls, Rs, LFE )\ + CHLIST06( MOV_CH_LAYOUT_MPEG_5_1_D, C, L, R, Ls, Rs, LFE )\ + CHLIST06( MOV_CH_LAYOUT_AUDIOUNIT_6_0, L, R, Ls, Rs, C, Cs )\ + CHLIST06( MOV_CH_LAYOUT_AAC_6_0, C, L, R, Ls, Rs, Cs )\ + CHLIST06( MOV_CH_LAYOUT_EAC3_6_0_A, L, C, R, Ls, Rs, Cs )\ + CHLIST06( MOV_CH_LAYOUT_DTS_6_0_A, Lc, Rc, L, R, Ls, Rs )\ + CHLIST06( MOV_CH_LAYOUT_DTS_6_0_B, C, L, R, Rls, Rrs, Ts )\ + CHLIST07( MOV_CH_LAYOUT_MPEG_6_1_A, L, R, C, LFE, Ls, Rs, Cs )\ + CHLIST07( MOV_CH_LAYOUT_AAC_6_1, C, L, R, Ls, Rs, Cs, LFE )\ + CHLIST07( MOV_CH_LAYOUT_EAC3_6_1_A, L, C, R, Ls, Rs, LFE, Cs )\ + CHLIST07( MOV_CH_LAYOUT_DTS_6_1_D, C, L, R, Ls, Rs, LFE, Cs )\ + CHLIST07( MOV_CH_LAYOUT_AUDIOUNIT_7_0, L, R, Ls, Rs, C, Rls, Rrs )\ + CHLIST07( MOV_CH_LAYOUT_AAC_7_0, C, L, R, Ls, Rs, Rls, Rrs )\ + CHLIST07( MOV_CH_LAYOUT_EAC3_7_0_A, L, C, R, Ls, Rs, Rls, Rrs )\ + CHLIST07( MOV_CH_LAYOUT_AUDIOUNIT_7_0_FRONT, L, R, Ls, Rs, C, Lc, Rc )\ + CHLIST07( MOV_CH_LAYOUT_DTS_7_0, Lc, C, Rc, L, R, Ls, Rs )\ + CHLIST07( MOV_CH_LAYOUT_EAC3_6_1_B, L, C, R, Ls, Rs, LFE, Ts )\ + CHLIST07( MOV_CH_LAYOUT_EAC3_6_1_C, L, C, R, Ls, Rs, LFE, Vhc )\ + CHLIST07( MOV_CH_LAYOUT_DTS_6_1_A, Lc, Rc, L, R, Ls, Rs, LFE )\ + CHLIST07( MOV_CH_LAYOUT_DTS_6_1_B, C, L, R, Rls, Rrs, Ts, LFE )\ + CHLIST07( MOV_CH_LAYOUT_DTS_6_1_C, C, Cs, L, R, Rls, Rrs, LFE )\ + CHLIST08( MOV_CH_LAYOUT_OCTAGONAL, L, R, Rls, Rrs, C, Cs, Ls, Rs )\ + CHLIST08( MOV_CH_LAYOUT_AAC_OCTAGONAL, C, L, R, Ls, Rs, Rls, Rrs, Cs )\ + CHLIST08( MOV_CH_LAYOUT_CUBE, L, R, Rls, Rrs, Vhl, Vhr, Rlt, Rrt )\ + CHLIST08( MOV_CH_LAYOUT_MPEG_7_1_A, L, R, C, LFE, Ls, Rs, Lc, Rc )\ + CHLIST08( MOV_CH_LAYOUT_MPEG_7_1_B, C, Lc, Rc, L, R, Ls, Rs, LFE )\ + CHLIST08( MOV_CH_LAYOUT_EMAGIC_DEFAULT_7_1, L, R, Ls, Rs, C, LFE, Lc, Rc )\ + CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_B, L, C, R, Ls, Rs, LFE, Lc, Rc )\ + CHLIST08( MOV_CH_LAYOUT_DTS_7_1, Lc, C, Rc, L, R, Ls, Rs, LFE )\ + CHLIST08( MOV_CH_LAYOUT_MPEG_7_1_C, L, R, C, LFE, Ls, Rs, Rls, Rrs )\ + CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_A, L, C, R, Ls, Rs, LFE, Rls, Rrs )\ + CHLIST08( MOV_CH_LAYOUT_SMPTE_DTV, L, R, C, LFE, Ls, Rs, Lt, Rt )\ + CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_C, L, C, R, Ls, Rs, LFE, Lsd, Rsd )\ + CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_D, L, C, R, Ls, Rs, LFE, Lw, Rw )\ + CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_E, L, C, R, Ls, Rs, LFE, Vhl, Vhr )\ + CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_F, L, C, R, Ls, Rs, LFE, Cs, Ts )\ + CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_G, L, C, R, Ls, Rs, LFE, Cs, Vhc )\ + CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_H, L, C, R, Ls, Rs, LFE, Ts, Vhc )\ + CHLIST08( MOV_CH_LAYOUT_DTS_8_0_A, Lc, Rc, L, R, Ls, Rs, Rls, Rrs )\ + CHLIST08( MOV_CH_LAYOUT_DTS_8_0_B, Lc, C, Rc, L, R, Ls, Cs, Rs )\ + CHLIST09( MOV_CH_LAYOUT_DTS_8_1_A, Lc, Rc, L, R, Ls, Rs, Rls, Rrs, LFE )\ + CHLIST09( MOV_CH_LAYOUT_DTS_8_1_B, Lc, C, Rc, L, R, Ls, Cs, Rs, LFE )\ + CHLIST16( MOV_CH_LAYOUT_TMH_10_2_STD, L, R, C, Vhc, Lsd, Rsd, Ls, Rs, Vhl, Vhr, Lw, Rw, Csd, Cs, LFE1, LFE2 )\ + CHLIST21( MOV_CH_LAYOUT_TMH_10_2_FULL, L, R, C, Vhc, Lsd, Rsd, Ls, Rs, Vhl, Vhr, Lw, Rw, Csd, Cs, LFE1, LFE2, Lc, Rc, HI, VI, Haptic )\ + +#define CHLIST(_tag, _cnt, ...) static_assert((_tag & 0xffff) == _cnt, "Channel count of " #_tag " is not " #_cnt); +MOV_CH_LAYOUT_MAP +#undef CHLIST +#define CHLIST(_tag, _cnt, ...) TAG(_tag, _cnt), __VA_ARGS__, static const struct MovChannelLayoutMap mov_ch_layout_map[] = { - CHLIST01( MOV_CH_LAYOUT_MONO, C ), - CHLIST02( MOV_CH_LAYOUT_STEREO, L, R ), - CHLIST02( MOV_CH_LAYOUT_STEREOHEADPHONES, L, R ), - CHLIST02( MOV_CH_LAYOUT_BINAURAL, L, R ), - CHLIST02( MOV_CH_LAYOUT_MIDSIDE, L, R ), //C, sides - CHLIST02( MOV_CH_LAYOUT_XY, L, R ), //X (left ), Y (right ) - CHLIST02( MOV_CH_LAYOUT_MATRIXSTEREO, Lt, Rt ), - CHLIST02( MOV_CH_LAYOUT_AC3_1_0_1, C, LFE ), - CHLIST03( MOV_CH_LAYOUT_MPEG_3_0_A, L, R, C ), - CHLIST03( MOV_CH_LAYOUT_MPEG_3_0_B, C, L, R ), - CHLIST03( MOV_CH_LAYOUT_AC3_3_0, L, C, R ), - CHLIST03( MOV_CH_LAYOUT_ITU_2_1, L, R, Cs ), - CHLIST03( MOV_CH_LAYOUT_DVD_4, L, R, LFE ), - CHLIST04( MOV_CH_LAYOUT_AMBISONIC_B_FORMAT, W, X, Y, Z ), - CHLIST04( MOV_CH_LAYOUT_QUADRAPHONIC, L, R, Rls, Rrs ), - CHLIST04( MOV_CH_LAYOUT_MPEG_4_0_A, L, R, C, Cs ), - CHLIST04( MOV_CH_LAYOUT_MPEG_4_0_B, C, L, R, Cs ), - CHLIST04( MOV_CH_LAYOUT_AC3_3_1, L, C, R, Cs ), - CHLIST04( MOV_CH_LAYOUT_ITU_2_2, L, R, Ls, Rs ), - CHLIST04( MOV_CH_LAYOUT_DVD_5, L, R, LFE, Cs ), - CHLIST04( MOV_CH_LAYOUT_AC3_2_1_1, L, R, Cs, LFE ), - CHLIST04( MOV_CH_LAYOUT_DVD_10, L, R, C, LFE ), - CHLIST04( MOV_CH_LAYOUT_AC3_3_0_1, L, C, R, LFE ), - CHLIST04( MOV_CH_LAYOUT_DTS_3_1, C, L, R, LFE ), - CHLIST05( MOV_CH_LAYOUT_PENTAGONAL, L, R, Rls, Rrs, C ), - CHLIST05( MOV_CH_LAYOUT_MPEG_5_0_A, L, R, C, Ls, Rs ), - CHLIST05( MOV_CH_LAYOUT_MPEG_5_0_B, L, R, Ls, Rs, C ), - CHLIST05( MOV_CH_LAYOUT_MPEG_5_0_C, L, C, R, Ls, Rs ), - CHLIST05( MOV_CH_LAYOUT_MPEG_5_0_D, C, L, R, Ls, Rs ), - CHLIST05( MOV_CH_LAYOUT_DVD_6, L, R, LFE, Ls, Rs ), - CHLIST05( MOV_CH_LAYOUT_DVD_18, L, R, Ls, Rs, LFE ), - CHLIST05( MOV_CH_LAYOUT_DVD_11, L, R, C, LFE, Cs ), - CHLIST05( MOV_CH_LAYOUT_AC3_3_1_1, L, C, R, Cs, LFE ), - CHLIST05( MOV_CH_LAYOUT_DTS_4_1, C, L, R, Cs, LFE ), - CHLIST06( MOV_CH_LAYOUT_HEXAGONAL, L, R, Rls, Rrs, C, Cs ), - CHLIST06( MOV_CH_LAYOUT_DTS_6_0_C, C, Cs, L, R, Rls, Rrs ), - CHLIST06( MOV_CH_LAYOUT_MPEG_5_1_A, L, R, C, LFE, Ls, Rs ), - CHLIST06( MOV_CH_LAYOUT_MPEG_5_1_B, L, R, Ls, Rs, C, LFE ), - CHLIST06( MOV_CH_LAYOUT_MPEG_5_1_C, L, C, R, Ls, Rs, LFE ), - CHLIST06( MOV_CH_LAYOUT_MPEG_5_1_D, C, L, R, Ls, Rs, LFE ), - CHLIST06( MOV_CH_LAYOUT_AUDIOUNIT_6_0, L, R, Ls, Rs, C, Cs ), - CHLIST06( MOV_CH_LAYOUT_AAC_6_0, C, L, R, Ls, Rs, Cs ), - CHLIST06( MOV_CH_LAYOUT_EAC3_6_0_A, L, C, R, Ls, Rs, Cs ), - CHLIST06( MOV_CH_LAYOUT_DTS_6_0_A, Lc, Rc, L, R, Ls, Rs ), - CHLIST06( MOV_CH_LAYOUT_DTS_6_0_B, C, L, R, Rls, Rrs, Ts ), - CHLIST07( MOV_CH_LAYOUT_MPEG_6_1_A, L, R, C, LFE, Ls, Rs, Cs ), - CHLIST07( MOV_CH_LAYOUT_AAC_6_1, C, L, R, Ls, Rs, Cs, LFE ), - CHLIST07( MOV_CH_LAYOUT_EAC3_6_1_A, L, C, R, Ls, Rs, LFE, Cs ), - CHLIST07( MOV_CH_LAYOUT_DTS_6_1_D, C, L, R, Ls, Rs, LFE, Cs ), - CHLIST07( MOV_CH_LAYOUT_AUDIOUNIT_7_0, L, R, Ls, Rs, C, Rls, Rrs ), - CHLIST07( MOV_CH_LAYOUT_AAC_7_0, C, L, R, Ls, Rs, Rls, Rrs ), - CHLIST07( MOV_CH_LAYOUT_EAC3_7_0_A, L, C, R, Ls, Rs, Rls, Rrs ), - CHLIST07( MOV_CH_LAYOUT_AUDIOUNIT_7_0_FRONT, L, R, Ls, Rs, C, Lc, Rc ), - CHLIST07( MOV_CH_LAYOUT_DTS_7_0, Lc, C, Rc, L, R, Ls, Rs ), - CHLIST07( MOV_CH_LAYOUT_EAC3_6_1_B, L, C, R, Ls, Rs, LFE, Ts ), - CHLIST07( MOV_CH_LAYOUT_EAC3_6_1_C, L, C, R, Ls, Rs, LFE, Vhc ), - CHLIST07( MOV_CH_LAYOUT_DTS_6_1_A, Lc, Rc, L, R, Ls, Rs, LFE ), - CHLIST07( MOV_CH_LAYOUT_DTS_6_1_B, C, L, R, Rls, Rrs, Ts, LFE ), - CHLIST07( MOV_CH_LAYOUT_DTS_6_1_C, C, Cs, L, R, Rls, Rrs, LFE ), - CHLIST08( MOV_CH_LAYOUT_OCTAGONAL, L, R, Rls, Rrs, C, Cs, Ls, Rs ), - CHLIST08( MOV_CH_LAYOUT_AAC_OCTAGONAL, C, L, R, Ls, Rs, Rls, Rrs, Cs ), - CHLIST08( MOV_CH_LAYOUT_CUBE, L, R, Rls, Rrs, Vhl, Vhr, Rlt, Rrt ), - CHLIST08( MOV_CH_LAYOUT_MPEG_7_1_A, L, R, C, LFE, Ls, Rs, Lc, Rc ), - CHLIST08( MOV_CH_LAYOUT_MPEG_7_1_B, C, Lc, Rc, L, R, Ls, Rs, LFE ), - CHLIST08( MOV_CH_LAYOUT_EMAGIC_DEFAULT_7_1, L, R, Ls, Rs, C, LFE, Lc, Rc ), - CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_B, L, C, R, Ls, Rs, LFE, Lc, Rc ), - CHLIST08( MOV_CH_LAYOUT_DTS_7_1, Lc, C, Rc, L, R, Ls, Rs, LFE ), - CHLIST08( MOV_CH_LAYOUT_MPEG_7_1_C, L, R, C, LFE, Ls, Rs, Rls, Rrs ), - CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_A, L, C, R, Ls, Rs, LFE, Rls, Rrs ), - CHLIST08( MOV_CH_LAYOUT_SMPTE_DTV, L, R, C, LFE, Ls, Rs, Lt, Rt ), - CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_C, L, C, R, Ls, Rs, LFE, Lsd, Rsd ), - CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_D, L, C, R, Ls, Rs, LFE, Lw, Rw ), - CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_E, L, C, R, Ls, Rs, LFE, Vhl, Vhr ), - CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_F, L, C, R, Ls, Rs, LFE, Cs, Ts ), - CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_G, L, C, R, Ls, Rs, LFE, Cs, Vhc ), - CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_H, L, C, R, Ls, Rs, LFE, Ts, Vhc ), - CHLIST08( MOV_CH_LAYOUT_DTS_8_0_A, Lc, Rc, L, R, Ls, Rs, Rls, Rrs ), - CHLIST08( MOV_CH_LAYOUT_DTS_8_0_B, Lc, C, Rc, L, R, Ls, Cs, Rs ), - CHLIST09( MOV_CH_LAYOUT_DTS_8_1_A, Lc, Rc, L, R, Ls, Rs, Rls, Rrs, LFE ), - CHLIST09( MOV_CH_LAYOUT_DTS_8_1_B, Lc, C, Rc, L, R, Ls, Cs, Rs, LFE ), - CHLIST16( MOV_CH_LAYOUT_TMH_10_2_STD, L, R, C, Vhc, Lsd, Rsd, Ls, Rs, Vhl, Vhr, Lw, Rw, Csd, Cs, LFE1, LFE2), - CHLIST21( MOV_CH_LAYOUT_TMH_10_2_FULL, L, R, C, Vhc, Lsd, Rsd, Ls, Rs, Vhl, Vhr, Lw, Rw, Csd, Cs, LFE1, LFE2, Lc, Rc, HI, VI, Haptic), + MOV_CH_LAYOUT_MAP }; static const enum MovChannelLayoutTag mov_ch_layouts_aac[] = { @@ -281,14 +288,6 @@ static const struct { static const struct MovChannelLayoutMap* find_layout_map(uint32_t tag) { -#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 1 - { - int i; - for (i = 0; i < FF_ARRAY_ELEMS(mov_ch_layout_map); i += 1 + (mov_ch_layout_map[i].tag & 0xffff)) - av_assert2(mov_ch_layout_map[i].tag & 0xffff0000); - av_assert2(i == FF_ARRAY_ELEMS(mov_ch_layout_map)); - } -#endif for (int i = 0; i < FF_ARRAY_ELEMS(mov_ch_layout_map); i += 1 + (mov_ch_layout_map[i].tag & 0xffff)) if (mov_ch_layout_map[i].tag == tag) return &mov_ch_layout_map[i + 1]; -- 2.35.3 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [FFmpeg-devel] [PATCH v2 1/4] avformat/mov_chan: check channel count of layout tags at compile time 2024-04-02 22:40 ` [FFmpeg-devel] [PATCH v2 1/4] avformat/mov_chan: check channel count of layout tags at compile time Marton Balint @ 2024-04-08 19:48 ` Marton Balint 0 siblings, 0 replies; 9+ messages in thread From: Marton Balint @ 2024-04-08 19:48 UTC (permalink / raw) To: FFmpeg development discussions and patches On Wed, 3 Apr 2024, Marton Balint wrote: > We can do this by using an X-macro for channel map declaration and doing a > static_assert() in one pass for the check. Thanks for Andreas Rheinhardt for > the suggestion. Will apply the series. Regards, Marton > > Signed-off-by: Marton Balint <cus@passwd.hu> > --- > libavformat/mov_chan.c | 217 ++++++++++++++++++++--------------------- > 1 file changed, 108 insertions(+), 109 deletions(-) > > diff --git a/libavformat/mov_chan.c b/libavformat/mov_chan.c > index e7d181d71f..4bb0ee7405 100644 > --- a/libavformat/mov_chan.c > +++ b/libavformat/mov_chan.c > @@ -23,6 +23,7 @@ > * @author Justin Ruggles > */ > > +#include <assert.h> > #include <stdint.h> > > #include "libavutil/avassert.h" > @@ -81,108 +82,114 @@ struct MovChannelLayoutMap { > }; > }; > > -#define TAG(_0) {.tag = _0} > -#define ID(_0) {.id = c_##_0} > -#define CHLIST(_0, ...) TAG(_0), __VA_ARGS__ > -#define CHLIST01(_0, _1) CHLIST(_0, ID(_1)) > -#define CHLIST02(_0, _1, _2) CHLIST(_0, ID(_1), ID(_2)) > -#define CHLIST03(_0, _1, _2, _3) CHLIST(_0, ID(_1), ID(_2), ID(_3)) > -#define CHLIST04(_0, _1, _2, _3, _4) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4)) > -#define CHLIST05(_0, _1, _2, _3, _4, _5) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5)) > -#define CHLIST06(_0, _1, _2, _3, _4, _5, _6) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6)) > -#define CHLIST07(_0, _1, _2, _3, _4, _5, _6, _7) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7)) > -#define CHLIST08(_0, _1, _2, _3, _4, _5, _6, _7, _8) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8)) > -#define CHLIST09(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9)) > -#define CHLIST16(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ > - CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \ > - ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16)) > -#define CHLIST21(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \ > - CHLIST(_0, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \ > - ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16), ID(_17), ID(_18), ID(_19), ID(_20), ID(_21)) > - > +#define TAG(_tag, _cnt) {.tag = _tag} > +#define ID(_0) {.id = c_##_0} > +#define CHLIST01(_tag, _1) CHLIST(_tag, 1, ID(_1)) > +#define CHLIST02(_tag, _1, _2) CHLIST(_tag, 2, ID(_1), ID(_2)) > +#define CHLIST03(_tag, _1, _2, _3) CHLIST(_tag, 3, ID(_1), ID(_2), ID(_3)) > +#define CHLIST04(_tag, _1, _2, _3, _4) CHLIST(_tag, 4, ID(_1), ID(_2), ID(_3), ID(_4)) > +#define CHLIST05(_tag, _1, _2, _3, _4, _5) CHLIST(_tag, 5, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5)) > +#define CHLIST06(_tag, _1, _2, _3, _4, _5, _6) CHLIST(_tag, 6, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6)) > +#define CHLIST07(_tag, _1, _2, _3, _4, _5, _6, _7) CHLIST(_tag, 7, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7)) > +#define CHLIST08(_tag, _1, _2, _3, _4, _5, _6, _7, _8) CHLIST(_tag, 8, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8)) > +#define CHLIST09(_tag, _1, _2, _3, _4, _5, _6, _7, _8, _9) CHLIST(_tag, 9, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9)) > +#define CHLIST16(_tag, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ > + CHLIST(_tag, 16, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \ > + ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16)) > +#define CHLIST21(_tag, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \ > + CHLIST(_tag, 21, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \ > + ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16), ID(_17), ID(_18), ID(_19), ID(_20), ID(_21)) > + > +#define MOV_CH_LAYOUT_MAP \ > + CHLIST01( MOV_CH_LAYOUT_MONO, C )\ > + CHLIST02( MOV_CH_LAYOUT_STEREO, L, R )\ > + CHLIST02( MOV_CH_LAYOUT_STEREOHEADPHONES, L, R )\ > + CHLIST02( MOV_CH_LAYOUT_BINAURAL, L, R )\ > + CHLIST02( MOV_CH_LAYOUT_MIDSIDE, L, R )\ > + CHLIST02( MOV_CH_LAYOUT_XY, L, R )\ > + CHLIST02( MOV_CH_LAYOUT_MATRIXSTEREO, Lt, Rt )\ > + CHLIST02( MOV_CH_LAYOUT_AC3_1_0_1, C, LFE )\ > + CHLIST03( MOV_CH_LAYOUT_MPEG_3_0_A, L, R, C )\ > + CHLIST03( MOV_CH_LAYOUT_MPEG_3_0_B, C, L, R )\ > + CHLIST03( MOV_CH_LAYOUT_AC3_3_0, L, C, R )\ > + CHLIST03( MOV_CH_LAYOUT_ITU_2_1, L, R, Cs )\ > + CHLIST03( MOV_CH_LAYOUT_DVD_4, L, R, LFE )\ > + CHLIST04( MOV_CH_LAYOUT_AMBISONIC_B_FORMAT, W, X, Y, Z )\ > + CHLIST04( MOV_CH_LAYOUT_QUADRAPHONIC, L, R, Rls, Rrs )\ > + CHLIST04( MOV_CH_LAYOUT_MPEG_4_0_A, L, R, C, Cs )\ > + CHLIST04( MOV_CH_LAYOUT_MPEG_4_0_B, C, L, R, Cs )\ > + CHLIST04( MOV_CH_LAYOUT_AC3_3_1, L, C, R, Cs )\ > + CHLIST04( MOV_CH_LAYOUT_ITU_2_2, L, R, Ls, Rs )\ > + CHLIST04( MOV_CH_LAYOUT_DVD_5, L, R, LFE, Cs )\ > + CHLIST04( MOV_CH_LAYOUT_AC3_2_1_1, L, R, Cs, LFE )\ > + CHLIST04( MOV_CH_LAYOUT_DVD_10, L, R, C, LFE )\ > + CHLIST04( MOV_CH_LAYOUT_AC3_3_0_1, L, C, R, LFE )\ > + CHLIST04( MOV_CH_LAYOUT_DTS_3_1, C, L, R, LFE )\ > + CHLIST05( MOV_CH_LAYOUT_PENTAGONAL, L, R, Rls, Rrs, C )\ > + CHLIST05( MOV_CH_LAYOUT_MPEG_5_0_A, L, R, C, Ls, Rs )\ > + CHLIST05( MOV_CH_LAYOUT_MPEG_5_0_B, L, R, Ls, Rs, C )\ > + CHLIST05( MOV_CH_LAYOUT_MPEG_5_0_C, L, C, R, Ls, Rs )\ > + CHLIST05( MOV_CH_LAYOUT_MPEG_5_0_D, C, L, R, Ls, Rs )\ > + CHLIST05( MOV_CH_LAYOUT_DVD_6, L, R, LFE, Ls, Rs )\ > + CHLIST05( MOV_CH_LAYOUT_DVD_18, L, R, Ls, Rs, LFE )\ > + CHLIST05( MOV_CH_LAYOUT_DVD_11, L, R, C, LFE, Cs )\ > + CHLIST05( MOV_CH_LAYOUT_AC3_3_1_1, L, C, R, Cs, LFE )\ > + CHLIST05( MOV_CH_LAYOUT_DTS_4_1, C, L, R, Cs, LFE )\ > + CHLIST06( MOV_CH_LAYOUT_HEXAGONAL, L, R, Rls, Rrs, C, Cs )\ > + CHLIST06( MOV_CH_LAYOUT_DTS_6_0_C, C, Cs, L, R, Rls, Rrs )\ > + CHLIST06( MOV_CH_LAYOUT_MPEG_5_1_A, L, R, C, LFE, Ls, Rs )\ > + CHLIST06( MOV_CH_LAYOUT_MPEG_5_1_B, L, R, Ls, Rs, C, LFE )\ > + CHLIST06( MOV_CH_LAYOUT_MPEG_5_1_C, L, C, R, Ls, Rs, LFE )\ > + CHLIST06( MOV_CH_LAYOUT_MPEG_5_1_D, C, L, R, Ls, Rs, LFE )\ > + CHLIST06( MOV_CH_LAYOUT_AUDIOUNIT_6_0, L, R, Ls, Rs, C, Cs )\ > + CHLIST06( MOV_CH_LAYOUT_AAC_6_0, C, L, R, Ls, Rs, Cs )\ > + CHLIST06( MOV_CH_LAYOUT_EAC3_6_0_A, L, C, R, Ls, Rs, Cs )\ > + CHLIST06( MOV_CH_LAYOUT_DTS_6_0_A, Lc, Rc, L, R, Ls, Rs )\ > + CHLIST06( MOV_CH_LAYOUT_DTS_6_0_B, C, L, R, Rls, Rrs, Ts )\ > + CHLIST07( MOV_CH_LAYOUT_MPEG_6_1_A, L, R, C, LFE, Ls, Rs, Cs )\ > + CHLIST07( MOV_CH_LAYOUT_AAC_6_1, C, L, R, Ls, Rs, Cs, LFE )\ > + CHLIST07( MOV_CH_LAYOUT_EAC3_6_1_A, L, C, R, Ls, Rs, LFE, Cs )\ > + CHLIST07( MOV_CH_LAYOUT_DTS_6_1_D, C, L, R, Ls, Rs, LFE, Cs )\ > + CHLIST07( MOV_CH_LAYOUT_AUDIOUNIT_7_0, L, R, Ls, Rs, C, Rls, Rrs )\ > + CHLIST07( MOV_CH_LAYOUT_AAC_7_0, C, L, R, Ls, Rs, Rls, Rrs )\ > + CHLIST07( MOV_CH_LAYOUT_EAC3_7_0_A, L, C, R, Ls, Rs, Rls, Rrs )\ > + CHLIST07( MOV_CH_LAYOUT_AUDIOUNIT_7_0_FRONT, L, R, Ls, Rs, C, Lc, Rc )\ > + CHLIST07( MOV_CH_LAYOUT_DTS_7_0, Lc, C, Rc, L, R, Ls, Rs )\ > + CHLIST07( MOV_CH_LAYOUT_EAC3_6_1_B, L, C, R, Ls, Rs, LFE, Ts )\ > + CHLIST07( MOV_CH_LAYOUT_EAC3_6_1_C, L, C, R, Ls, Rs, LFE, Vhc )\ > + CHLIST07( MOV_CH_LAYOUT_DTS_6_1_A, Lc, Rc, L, R, Ls, Rs, LFE )\ > + CHLIST07( MOV_CH_LAYOUT_DTS_6_1_B, C, L, R, Rls, Rrs, Ts, LFE )\ > + CHLIST07( MOV_CH_LAYOUT_DTS_6_1_C, C, Cs, L, R, Rls, Rrs, LFE )\ > + CHLIST08( MOV_CH_LAYOUT_OCTAGONAL, L, R, Rls, Rrs, C, Cs, Ls, Rs )\ > + CHLIST08( MOV_CH_LAYOUT_AAC_OCTAGONAL, C, L, R, Ls, Rs, Rls, Rrs, Cs )\ > + CHLIST08( MOV_CH_LAYOUT_CUBE, L, R, Rls, Rrs, Vhl, Vhr, Rlt, Rrt )\ > + CHLIST08( MOV_CH_LAYOUT_MPEG_7_1_A, L, R, C, LFE, Ls, Rs, Lc, Rc )\ > + CHLIST08( MOV_CH_LAYOUT_MPEG_7_1_B, C, Lc, Rc, L, R, Ls, Rs, LFE )\ > + CHLIST08( MOV_CH_LAYOUT_EMAGIC_DEFAULT_7_1, L, R, Ls, Rs, C, LFE, Lc, Rc )\ > + CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_B, L, C, R, Ls, Rs, LFE, Lc, Rc )\ > + CHLIST08( MOV_CH_LAYOUT_DTS_7_1, Lc, C, Rc, L, R, Ls, Rs, LFE )\ > + CHLIST08( MOV_CH_LAYOUT_MPEG_7_1_C, L, R, C, LFE, Ls, Rs, Rls, Rrs )\ > + CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_A, L, C, R, Ls, Rs, LFE, Rls, Rrs )\ > + CHLIST08( MOV_CH_LAYOUT_SMPTE_DTV, L, R, C, LFE, Ls, Rs, Lt, Rt )\ > + CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_C, L, C, R, Ls, Rs, LFE, Lsd, Rsd )\ > + CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_D, L, C, R, Ls, Rs, LFE, Lw, Rw )\ > + CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_E, L, C, R, Ls, Rs, LFE, Vhl, Vhr )\ > + CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_F, L, C, R, Ls, Rs, LFE, Cs, Ts )\ > + CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_G, L, C, R, Ls, Rs, LFE, Cs, Vhc )\ > + CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_H, L, C, R, Ls, Rs, LFE, Ts, Vhc )\ > + CHLIST08( MOV_CH_LAYOUT_DTS_8_0_A, Lc, Rc, L, R, Ls, Rs, Rls, Rrs )\ > + CHLIST08( MOV_CH_LAYOUT_DTS_8_0_B, Lc, C, Rc, L, R, Ls, Cs, Rs )\ > + CHLIST09( MOV_CH_LAYOUT_DTS_8_1_A, Lc, Rc, L, R, Ls, Rs, Rls, Rrs, LFE )\ > + CHLIST09( MOV_CH_LAYOUT_DTS_8_1_B, Lc, C, Rc, L, R, Ls, Cs, Rs, LFE )\ > + CHLIST16( MOV_CH_LAYOUT_TMH_10_2_STD, L, R, C, Vhc, Lsd, Rsd, Ls, Rs, Vhl, Vhr, Lw, Rw, Csd, Cs, LFE1, LFE2 )\ > + CHLIST21( MOV_CH_LAYOUT_TMH_10_2_FULL, L, R, C, Vhc, Lsd, Rsd, Ls, Rs, Vhl, Vhr, Lw, Rw, Csd, Cs, LFE1, LFE2, Lc, Rc, HI, VI, Haptic )\ > + > +#define CHLIST(_tag, _cnt, ...) static_assert((_tag & 0xffff) == _cnt, "Channel count of " #_tag " is not " #_cnt); > +MOV_CH_LAYOUT_MAP > +#undef CHLIST > +#define CHLIST(_tag, _cnt, ...) TAG(_tag, _cnt), __VA_ARGS__, > static const struct MovChannelLayoutMap mov_ch_layout_map[] = { > - CHLIST01( MOV_CH_LAYOUT_MONO, C ), > - CHLIST02( MOV_CH_LAYOUT_STEREO, L, R ), > - CHLIST02( MOV_CH_LAYOUT_STEREOHEADPHONES, L, R ), > - CHLIST02( MOV_CH_LAYOUT_BINAURAL, L, R ), > - CHLIST02( MOV_CH_LAYOUT_MIDSIDE, L, R ), //C, sides > - CHLIST02( MOV_CH_LAYOUT_XY, L, R ), //X (left ), Y (right ) > - CHLIST02( MOV_CH_LAYOUT_MATRIXSTEREO, Lt, Rt ), > - CHLIST02( MOV_CH_LAYOUT_AC3_1_0_1, C, LFE ), > - CHLIST03( MOV_CH_LAYOUT_MPEG_3_0_A, L, R, C ), > - CHLIST03( MOV_CH_LAYOUT_MPEG_3_0_B, C, L, R ), > - CHLIST03( MOV_CH_LAYOUT_AC3_3_0, L, C, R ), > - CHLIST03( MOV_CH_LAYOUT_ITU_2_1, L, R, Cs ), > - CHLIST03( MOV_CH_LAYOUT_DVD_4, L, R, LFE ), > - CHLIST04( MOV_CH_LAYOUT_AMBISONIC_B_FORMAT, W, X, Y, Z ), > - CHLIST04( MOV_CH_LAYOUT_QUADRAPHONIC, L, R, Rls, Rrs ), > - CHLIST04( MOV_CH_LAYOUT_MPEG_4_0_A, L, R, C, Cs ), > - CHLIST04( MOV_CH_LAYOUT_MPEG_4_0_B, C, L, R, Cs ), > - CHLIST04( MOV_CH_LAYOUT_AC3_3_1, L, C, R, Cs ), > - CHLIST04( MOV_CH_LAYOUT_ITU_2_2, L, R, Ls, Rs ), > - CHLIST04( MOV_CH_LAYOUT_DVD_5, L, R, LFE, Cs ), > - CHLIST04( MOV_CH_LAYOUT_AC3_2_1_1, L, R, Cs, LFE ), > - CHLIST04( MOV_CH_LAYOUT_DVD_10, L, R, C, LFE ), > - CHLIST04( MOV_CH_LAYOUT_AC3_3_0_1, L, C, R, LFE ), > - CHLIST04( MOV_CH_LAYOUT_DTS_3_1, C, L, R, LFE ), > - CHLIST05( MOV_CH_LAYOUT_PENTAGONAL, L, R, Rls, Rrs, C ), > - CHLIST05( MOV_CH_LAYOUT_MPEG_5_0_A, L, R, C, Ls, Rs ), > - CHLIST05( MOV_CH_LAYOUT_MPEG_5_0_B, L, R, Ls, Rs, C ), > - CHLIST05( MOV_CH_LAYOUT_MPEG_5_0_C, L, C, R, Ls, Rs ), > - CHLIST05( MOV_CH_LAYOUT_MPEG_5_0_D, C, L, R, Ls, Rs ), > - CHLIST05( MOV_CH_LAYOUT_DVD_6, L, R, LFE, Ls, Rs ), > - CHLIST05( MOV_CH_LAYOUT_DVD_18, L, R, Ls, Rs, LFE ), > - CHLIST05( MOV_CH_LAYOUT_DVD_11, L, R, C, LFE, Cs ), > - CHLIST05( MOV_CH_LAYOUT_AC3_3_1_1, L, C, R, Cs, LFE ), > - CHLIST05( MOV_CH_LAYOUT_DTS_4_1, C, L, R, Cs, LFE ), > - CHLIST06( MOV_CH_LAYOUT_HEXAGONAL, L, R, Rls, Rrs, C, Cs ), > - CHLIST06( MOV_CH_LAYOUT_DTS_6_0_C, C, Cs, L, R, Rls, Rrs ), > - CHLIST06( MOV_CH_LAYOUT_MPEG_5_1_A, L, R, C, LFE, Ls, Rs ), > - CHLIST06( MOV_CH_LAYOUT_MPEG_5_1_B, L, R, Ls, Rs, C, LFE ), > - CHLIST06( MOV_CH_LAYOUT_MPEG_5_1_C, L, C, R, Ls, Rs, LFE ), > - CHLIST06( MOV_CH_LAYOUT_MPEG_5_1_D, C, L, R, Ls, Rs, LFE ), > - CHLIST06( MOV_CH_LAYOUT_AUDIOUNIT_6_0, L, R, Ls, Rs, C, Cs ), > - CHLIST06( MOV_CH_LAYOUT_AAC_6_0, C, L, R, Ls, Rs, Cs ), > - CHLIST06( MOV_CH_LAYOUT_EAC3_6_0_A, L, C, R, Ls, Rs, Cs ), > - CHLIST06( MOV_CH_LAYOUT_DTS_6_0_A, Lc, Rc, L, R, Ls, Rs ), > - CHLIST06( MOV_CH_LAYOUT_DTS_6_0_B, C, L, R, Rls, Rrs, Ts ), > - CHLIST07( MOV_CH_LAYOUT_MPEG_6_1_A, L, R, C, LFE, Ls, Rs, Cs ), > - CHLIST07( MOV_CH_LAYOUT_AAC_6_1, C, L, R, Ls, Rs, Cs, LFE ), > - CHLIST07( MOV_CH_LAYOUT_EAC3_6_1_A, L, C, R, Ls, Rs, LFE, Cs ), > - CHLIST07( MOV_CH_LAYOUT_DTS_6_1_D, C, L, R, Ls, Rs, LFE, Cs ), > - CHLIST07( MOV_CH_LAYOUT_AUDIOUNIT_7_0, L, R, Ls, Rs, C, Rls, Rrs ), > - CHLIST07( MOV_CH_LAYOUT_AAC_7_0, C, L, R, Ls, Rs, Rls, Rrs ), > - CHLIST07( MOV_CH_LAYOUT_EAC3_7_0_A, L, C, R, Ls, Rs, Rls, Rrs ), > - CHLIST07( MOV_CH_LAYOUT_AUDIOUNIT_7_0_FRONT, L, R, Ls, Rs, C, Lc, Rc ), > - CHLIST07( MOV_CH_LAYOUT_DTS_7_0, Lc, C, Rc, L, R, Ls, Rs ), > - CHLIST07( MOV_CH_LAYOUT_EAC3_6_1_B, L, C, R, Ls, Rs, LFE, Ts ), > - CHLIST07( MOV_CH_LAYOUT_EAC3_6_1_C, L, C, R, Ls, Rs, LFE, Vhc ), > - CHLIST07( MOV_CH_LAYOUT_DTS_6_1_A, Lc, Rc, L, R, Ls, Rs, LFE ), > - CHLIST07( MOV_CH_LAYOUT_DTS_6_1_B, C, L, R, Rls, Rrs, Ts, LFE ), > - CHLIST07( MOV_CH_LAYOUT_DTS_6_1_C, C, Cs, L, R, Rls, Rrs, LFE ), > - CHLIST08( MOV_CH_LAYOUT_OCTAGONAL, L, R, Rls, Rrs, C, Cs, Ls, Rs ), > - CHLIST08( MOV_CH_LAYOUT_AAC_OCTAGONAL, C, L, R, Ls, Rs, Rls, Rrs, Cs ), > - CHLIST08( MOV_CH_LAYOUT_CUBE, L, R, Rls, Rrs, Vhl, Vhr, Rlt, Rrt ), > - CHLIST08( MOV_CH_LAYOUT_MPEG_7_1_A, L, R, C, LFE, Ls, Rs, Lc, Rc ), > - CHLIST08( MOV_CH_LAYOUT_MPEG_7_1_B, C, Lc, Rc, L, R, Ls, Rs, LFE ), > - CHLIST08( MOV_CH_LAYOUT_EMAGIC_DEFAULT_7_1, L, R, Ls, Rs, C, LFE, Lc, Rc ), > - CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_B, L, C, R, Ls, Rs, LFE, Lc, Rc ), > - CHLIST08( MOV_CH_LAYOUT_DTS_7_1, Lc, C, Rc, L, R, Ls, Rs, LFE ), > - CHLIST08( MOV_CH_LAYOUT_MPEG_7_1_C, L, R, C, LFE, Ls, Rs, Rls, Rrs ), > - CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_A, L, C, R, Ls, Rs, LFE, Rls, Rrs ), > - CHLIST08( MOV_CH_LAYOUT_SMPTE_DTV, L, R, C, LFE, Ls, Rs, Lt, Rt ), > - CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_C, L, C, R, Ls, Rs, LFE, Lsd, Rsd ), > - CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_D, L, C, R, Ls, Rs, LFE, Lw, Rw ), > - CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_E, L, C, R, Ls, Rs, LFE, Vhl, Vhr ), > - CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_F, L, C, R, Ls, Rs, LFE, Cs, Ts ), > - CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_G, L, C, R, Ls, Rs, LFE, Cs, Vhc ), > - CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_H, L, C, R, Ls, Rs, LFE, Ts, Vhc ), > - CHLIST08( MOV_CH_LAYOUT_DTS_8_0_A, Lc, Rc, L, R, Ls, Rs, Rls, Rrs ), > - CHLIST08( MOV_CH_LAYOUT_DTS_8_0_B, Lc, C, Rc, L, R, Ls, Cs, Rs ), > - CHLIST09( MOV_CH_LAYOUT_DTS_8_1_A, Lc, Rc, L, R, Ls, Rs, Rls, Rrs, LFE ), > - CHLIST09( MOV_CH_LAYOUT_DTS_8_1_B, Lc, C, Rc, L, R, Ls, Cs, Rs, LFE ), > - CHLIST16( MOV_CH_LAYOUT_TMH_10_2_STD, L, R, C, Vhc, Lsd, Rsd, Ls, Rs, Vhl, Vhr, Lw, Rw, Csd, Cs, LFE1, LFE2), > - CHLIST21( MOV_CH_LAYOUT_TMH_10_2_FULL, L, R, C, Vhc, Lsd, Rsd, Ls, Rs, Vhl, Vhr, Lw, Rw, Csd, Cs, LFE1, LFE2, Lc, Rc, HI, VI, Haptic), > + MOV_CH_LAYOUT_MAP > }; > > static const enum MovChannelLayoutTag mov_ch_layouts_aac[] = { > @@ -281,14 +288,6 @@ static const struct { > > static const struct MovChannelLayoutMap* find_layout_map(uint32_t tag) > { > -#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 1 > - { > - int i; > - for (i = 0; i < FF_ARRAY_ELEMS(mov_ch_layout_map); i += 1 + (mov_ch_layout_map[i].tag & 0xffff)) > - av_assert2(mov_ch_layout_map[i].tag & 0xffff0000); > - av_assert2(i == FF_ARRAY_ELEMS(mov_ch_layout_map)); > - } > -#endif > for (int i = 0; i < FF_ARRAY_ELEMS(mov_ch_layout_map); i += 1 + (mov_ch_layout_map[i].tag & 0xffff)) > if (mov_ch_layout_map[i].tag == tag) > return &mov_ch_layout_map[i + 1]; > -- > 2.35.3 > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2024-04-08 19:48 UTC | newest] Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2024-04-01 18:56 [FFmpeg-devel] [PATCH 1/4] avformat/mov_chan: check channel count at compile time by using a nonconst expression Marton Balint 2024-04-01 18:56 ` [FFmpeg-devel] [PATCH 2/4] avformat/mov_chan: factorize some layout map search functions Marton Balint 2024-04-01 18:56 ` [FFmpeg-devel] [PATCH 3/4] avformat/mov_chan: respect channel order when parsing and creating chnl atom Marton Balint 2024-04-01 19:37 ` James Almer 2024-04-01 20:43 ` Marton Balint 2024-04-01 18:56 ` [FFmpeg-devel] [PATCH 4/4] avformat/mov_chan: add support for omitted_channel bitmask in " Marton Balint 2024-04-01 20:41 ` [FFmpeg-devel] [PATCH 1/4] avformat/mov_chan: check channel count at compile time by using a nonconst expression Andreas Rheinhardt 2024-04-02 22:40 ` [FFmpeg-devel] [PATCH v2 1/4] avformat/mov_chan: check channel count of layout tags at compile time Marton Balint 2024-04-08 19:48 ` Marton Balint
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git