This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit 7a205ebf3a6a1ea14a7fb1d3fa07ccae5fd297dd Author: Andreas Rheinhardt <[email protected]> AuthorDate: Fri Aug 7 12:10:01 2026 +0200 Commit: Andreas Rheinhardt <[email protected]> CommitDate: Wed Aug 12 00:09:05 2026 +0200 swresample/rematrix: Avoid repeated calls to av_channel_layout* funcs Signed-off-by: Andreas Rheinhardt <[email protected]> --- libswresample/rematrix.c | 177 +++++++++++++++++++++++------------------------ 1 file changed, 88 insertions(+), 89 deletions(-) diff --git a/libswresample/rematrix.c b/libswresample/rematrix.c index 5e9f536814..67d9b48339 100644 --- a/libswresample/rematrix.c +++ b/libswresample/rematrix.c @@ -121,23 +121,24 @@ static int sane_layout(AVChannelLayout *ch_layout) { } else if (ch_layout->order != AV_CHANNEL_ORDER_NATIVE) return 0; - if(!av_channel_layout_subset(ch_layout, AV_CH_LAYOUT_SURROUND)) // at least 1 front speaker + uint64_t mask = av_channel_layout_subset(ch_layout, ~(uint64_t)0); + if(!(mask & AV_CH_LAYOUT_SURROUND)) // at least 1 front speaker return 0; - if(!even(av_channel_layout_subset(ch_layout, (AV_CH_FRONT_LEFT | AV_CH_FRONT_RIGHT)))) // no asymmetric front + if (!even(mask & (AV_CH_FRONT_LEFT | AV_CH_FRONT_RIGHT))) // no asymmetric front return 0; - if(!even(av_channel_layout_subset(ch_layout, (AV_CH_SIDE_LEFT | AV_CH_SIDE_RIGHT)))) // no asymmetric side + if (!even(mask & (AV_CH_SIDE_LEFT | AV_CH_SIDE_RIGHT))) // no asymmetric side return 0; - if(!even(av_channel_layout_subset(ch_layout, (AV_CH_BACK_LEFT | AV_CH_BACK_RIGHT)))) + if (!even(mask & (AV_CH_BACK_LEFT | AV_CH_BACK_RIGHT))) return 0; - if(!even(av_channel_layout_subset(ch_layout, (AV_CH_FRONT_LEFT_OF_CENTER | AV_CH_FRONT_RIGHT_OF_CENTER)))) + if (!even(mask & (AV_CH_FRONT_LEFT_OF_CENTER | AV_CH_FRONT_RIGHT_OF_CENTER))) return 0; - if(!even(av_channel_layout_subset(ch_layout, (AV_CH_TOP_FRONT_LEFT | AV_CH_TOP_FRONT_RIGHT)))) + if (!even(mask & (AV_CH_TOP_FRONT_LEFT | AV_CH_TOP_FRONT_RIGHT))) return 0; - if(!even(av_channel_layout_subset(ch_layout, (AV_CH_TOP_BACK_LEFT | AV_CH_TOP_BACK_RIGHT)))) + if (!even(mask & (AV_CH_TOP_BACK_LEFT | AV_CH_TOP_BACK_RIGHT))) return 0; - if(!even(av_channel_layout_subset(ch_layout, (AV_CH_TOP_SIDE_LEFT | AV_CH_TOP_SIDE_RIGHT)))) + if (!even(mask & (AV_CH_TOP_SIDE_LEFT | AV_CH_TOP_SIDE_RIGHT))) return 0; - if(!even(av_channel_layout_subset(ch_layout, (AV_CH_BOTTOM_FRONT_LEFT | AV_CH_BOTTOM_FRONT_RIGHT)))) + if (!even(mask & (AV_CH_BOTTOM_FRONT_LEFT | AV_CH_BOTTOM_FRONT_RIGHT))) return 0; return 1; @@ -149,14 +150,14 @@ static void build_matrix(const AVChannelLayout *in_ch_layout, const AVChannelLay ptrdiff_t stride, enum AVMatrixEncoding matrix_encoding) { double matrix[NUM_NAMED_CHANNELS][NUM_NAMED_CHANNELS]={{0}}; - uint64_t unaccounted = av_channel_layout_subset(in_ch_layout, UINT64_MAX) & - ~av_channel_layout_subset(out_ch_layout, UINT64_MAX); + uint64_t in_mask = av_channel_layout_subset(in_ch_layout, ~(uint64_t)0); + uint64_t out_mask = av_channel_layout_subset(out_ch_layout, ~(uint64_t)0); + uint64_t unaccounted = in_mask & ~out_mask; double maxcoef=0; int i, j; for(i=0; i<FF_ARRAY_ELEMS(matrix); i++){ - if( av_channel_layout_index_from_channel(in_ch_layout, i) >= 0 - && av_channel_layout_index_from_channel(out_ch_layout, i) >= 0) + if (in_mask & out_mask & (1ULL << i)) matrix[i][i]= 1.0; } @@ -164,8 +165,8 @@ static void build_matrix(const AVChannelLayout *in_ch_layout, const AVChannelLay //FIXME implement full ac3 if(unaccounted & AV_CH_FRONT_CENTER){ - if (av_channel_layout_subset(out_ch_layout, AV_CH_LAYOUT_STEREO) == AV_CH_LAYOUT_STEREO) { - if (av_channel_layout_subset(in_ch_layout, AV_CH_LAYOUT_STEREO)) { + if ((out_mask & AV_CH_LAYOUT_STEREO) == AV_CH_LAYOUT_STEREO) { + if (in_mask & AV_CH_LAYOUT_STEREO) { matrix[ FRONT_LEFT][FRONT_CENTER]+= center_mix_level; matrix[FRONT_RIGHT][FRONT_CENTER]+= center_mix_level; } else { @@ -176,23 +177,23 @@ static void build_matrix(const AVChannelLayout *in_ch_layout, const AVChannelLay av_assert0(0); } if(unaccounted & AV_CH_LAYOUT_STEREO){ - if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_CENTER) >= 0) { + if (out_mask & AV_CH_FRONT_CENTER) { matrix[FRONT_CENTER][ FRONT_LEFT]+= M_SQRT1_2; matrix[FRONT_CENTER][FRONT_RIGHT]+= M_SQRT1_2; - if (av_channel_layout_index_from_channel(in_ch_layout, AV_CHAN_FRONT_CENTER) >= 0) + if (in_mask & AV_CH_FRONT_CENTER) matrix[FRONT_CENTER][ FRONT_CENTER] = center_mix_level*sqrt(2); }else av_assert0(0); } if(unaccounted & AV_CH_BACK_CENTER){ - if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_BACK_LEFT) >= 0) { + if (out_mask & AV_CH_BACK_LEFT) { matrix[ BACK_LEFT][BACK_CENTER]+= M_SQRT1_2; matrix[BACK_RIGHT][BACK_CENTER]+= M_SQRT1_2; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_SIDE_LEFT) >= 0) { + } else if (out_mask & AV_CH_SIDE_LEFT) { matrix[ SIDE_LEFT][BACK_CENTER]+= M_SQRT1_2; matrix[SIDE_RIGHT][BACK_CENTER]+= M_SQRT1_2; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_LEFT) >= 0) { + } else if (out_mask & AV_CH_FRONT_LEFT) { if (matrix_encoding == AV_MATRIX_ENCODING_DOLBY || matrix_encoding == AV_MATRIX_ENCODING_DPLII) { if (unaccounted & (AV_CH_BACK_LEFT | AV_CH_SIDE_LEFT)) { @@ -206,24 +207,24 @@ static void build_matrix(const AVChannelLayout *in_ch_layout, const AVChannelLay matrix[ FRONT_LEFT][BACK_CENTER]+= surround_mix_level * M_SQRT1_2; matrix[FRONT_RIGHT][BACK_CENTER]+= surround_mix_level * M_SQRT1_2; } - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_CENTER) >= 0) { + } else if (out_mask & AV_CH_FRONT_CENTER) { matrix[ FRONT_CENTER][BACK_CENTER]+= surround_mix_level * M_SQRT1_2; }else av_assert0(0); } if(unaccounted & AV_CH_BACK_LEFT){ - if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_BACK_CENTER) >= 0) { + if (out_mask & AV_CH_BACK_CENTER) { matrix[BACK_CENTER][ BACK_LEFT]+= M_SQRT1_2; matrix[BACK_CENTER][BACK_RIGHT]+= M_SQRT1_2; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_SIDE_LEFT) >= 0) { - if (av_channel_layout_index_from_channel(in_ch_layout, AV_CHAN_SIDE_LEFT) >= 0) { + } else if (out_mask & AV_CH_SIDE_LEFT) { + if (in_mask & AV_CH_SIDE_LEFT) { matrix[ SIDE_LEFT][ BACK_LEFT]+= M_SQRT1_2; matrix[SIDE_RIGHT][BACK_RIGHT]+= M_SQRT1_2; }else{ matrix[ SIDE_LEFT][ BACK_LEFT]+= 1.0; matrix[SIDE_RIGHT][BACK_RIGHT]+= 1.0; } - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_LEFT) >= 0) { + } else if (out_mask & AV_CH_FRONT_LEFT) { if (matrix_encoding == AV_MATRIX_ENCODING_DOLBY) { matrix[FRONT_LEFT ][BACK_LEFT ] -= surround_mix_level * M_SQRT1_2; matrix[FRONT_LEFT ][BACK_RIGHT] -= surround_mix_level * M_SQRT1_2; @@ -238,7 +239,7 @@ static void build_matrix(const AVChannelLayout *in_ch_layout, const AVChannelLay matrix[ FRONT_LEFT][ BACK_LEFT] += surround_mix_level; matrix[FRONT_RIGHT][BACK_RIGHT] += surround_mix_level; } - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_CENTER) >= 0) { + } else if (out_mask & AV_CH_FRONT_CENTER) { matrix[ FRONT_CENTER][BACK_LEFT ]+= surround_mix_level*M_SQRT1_2; matrix[ FRONT_CENTER][BACK_RIGHT]+= surround_mix_level*M_SQRT1_2; }else @@ -246,20 +247,20 @@ static void build_matrix(const AVChannelLayout *in_ch_layout, const AVChannelLay } if(unaccounted & AV_CH_SIDE_LEFT){ - if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_BACK_LEFT) >= 0) { + if (out_mask & AV_CH_BACK_LEFT) { /* if back channels do not exist in the input, just copy side channels to back channels, otherwise mix side into back */ - if (av_channel_layout_index_from_channel(in_ch_layout, AV_CHAN_BACK_LEFT) >= 0) { + if (in_mask & AV_CH_BACK_LEFT) { matrix[BACK_LEFT ][SIDE_LEFT ] += M_SQRT1_2; matrix[BACK_RIGHT][SIDE_RIGHT] += M_SQRT1_2; } else { matrix[BACK_LEFT ][SIDE_LEFT ] += 1.0; matrix[BACK_RIGHT][SIDE_RIGHT] += 1.0; } - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_BACK_CENTER) >= 0) { + } else if (out_mask & AV_CH_BACK_CENTER) { matrix[BACK_CENTER][ SIDE_LEFT]+= M_SQRT1_2; matrix[BACK_CENTER][SIDE_RIGHT]+= M_SQRT1_2; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_LEFT) >= 0) { + } else if (out_mask & AV_CH_FRONT_LEFT) { if (matrix_encoding == AV_MATRIX_ENCODING_DOLBY) { matrix[FRONT_LEFT ][SIDE_LEFT ] -= surround_mix_level * M_SQRT1_2; matrix[FRONT_LEFT ][SIDE_RIGHT] -= surround_mix_level * M_SQRT1_2; @@ -274,7 +275,7 @@ static void build_matrix(const AVChannelLayout *in_ch_layout, const AVChannelLay matrix[ FRONT_LEFT][ SIDE_LEFT] += surround_mix_level; matrix[FRONT_RIGHT][SIDE_RIGHT] += surround_mix_level; } - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_CENTER) >= 0) { + } else if (out_mask & AV_CH_FRONT_CENTER) { matrix[ FRONT_CENTER][SIDE_LEFT ]+= surround_mix_level * M_SQRT1_2; matrix[ FRONT_CENTER][SIDE_RIGHT]+= surround_mix_level * M_SQRT1_2; }else @@ -282,10 +283,10 @@ static void build_matrix(const AVChannelLayout *in_ch_layout, const AVChannelLay } if(unaccounted & AV_CH_FRONT_LEFT_OF_CENTER){ - if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_LEFT) >= 0) { + if (out_mask & AV_CH_FRONT_LEFT) { matrix[ FRONT_LEFT][ FRONT_LEFT_OF_CENTER]+= 1.0; matrix[FRONT_RIGHT][FRONT_RIGHT_OF_CENTER]+= 1.0; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_CENTER) >= 0) { + } else if (out_mask & AV_CH_FRONT_CENTER) { matrix[ FRONT_CENTER][ FRONT_LEFT_OF_CENTER]+= M_SQRT1_2; matrix[ FRONT_CENTER][FRONT_RIGHT_OF_CENTER]+= M_SQRT1_2; }else @@ -293,16 +294,16 @@ static void build_matrix(const AVChannelLayout *in_ch_layout, const AVChannelLay } if (unaccounted & AV_CH_TOP_FRONT_LEFT) { - if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_TOP_FRONT_CENTER) >= 0) { + if (out_mask & AV_CH_TOP_FRONT_CENTER) { matrix[TOP_FRONT_CENTER][TOP_FRONT_LEFT ] += M_SQRT1_2; matrix[TOP_FRONT_CENTER][TOP_FRONT_RIGHT] += M_SQRT1_2; - if (av_channel_layout_index_from_channel(in_ch_layout, AV_CHAN_TOP_FRONT_CENTER) >= 0) + if (in_mask & AV_CH_TOP_FRONT_CENTER) matrix[TOP_FRONT_CENTER][TOP_FRONT_CENTER] = center_mix_level * sqrt(2); - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_LEFT) >= 0) { + } else if (out_mask & AV_CH_FRONT_LEFT) { /* U+030 -> M+030 in ITU-R BS.2127-1, Table 16. */ matrix[FRONT_LEFT ][TOP_FRONT_LEFT ] += 1.0; matrix[FRONT_RIGHT][TOP_FRONT_RIGHT] += 1.0; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_CENTER) >= 0) { + } else if (out_mask & AV_CH_FRONT_CENTER) { matrix[FRONT_CENTER][TOP_FRONT_LEFT ] += M_SQRT1_2; matrix[FRONT_CENTER][TOP_FRONT_RIGHT] += M_SQRT1_2; } else @@ -310,14 +311,14 @@ static void build_matrix(const AVChannelLayout *in_ch_layout, const AVChannelLay } if (unaccounted & AV_CH_TOP_FRONT_CENTER) { - if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_TOP_FRONT_LEFT) >= 0) { + if (out_mask & AV_CH_TOP_FRONT_LEFT) { /* U+030 = U-030 = sqrt(1/2) */ matrix[TOP_FRONT_LEFT ][TOP_FRONT_CENTER]+= M_SQRT1_2; matrix[TOP_FRONT_RIGHT][TOP_FRONT_CENTER]+= M_SQRT1_2; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_CENTER) >= 0) { + } else if (out_mask & AV_CH_FRONT_CENTER) { /* M+000 = 1 */ matrix[FRONT_CENTER][TOP_FRONT_CENTER] += 1.0; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_LEFT) >= 0) { + } else if (out_mask & AV_CH_FRONT_LEFT) { /* M+030 = M-030 = sqrt(1/2) */ matrix[FRONT_LEFT ][TOP_FRONT_CENTER] += center_mix_level; matrix[FRONT_RIGHT][TOP_FRONT_CENTER] += center_mix_level; @@ -326,23 +327,23 @@ static void build_matrix(const AVChannelLayout *in_ch_layout, const AVChannelLay } if (unaccounted & AV_CH_TOP_BACK_LEFT) { - if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_TOP_BACK_CENTER) >= 0) { + if (out_mask & AV_CH_TOP_BACK_CENTER) { matrix[TOP_BACK_CENTER][TOP_BACK_LEFT ] += M_SQRT1_2; matrix[TOP_BACK_CENTER][TOP_BACK_RIGHT] += M_SQRT1_2; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_TOP_FRONT_LEFT) >= 0) { + } else if (out_mask & AV_CH_TOP_FRONT_LEFT) { /* IAMF v1.1.0, Section 7.3.2.1.1. */ matrix[TOP_FRONT_LEFT ][TOP_BACK_LEFT ] += M_SQRT1_2; matrix[TOP_FRONT_RIGHT][TOP_BACK_RIGHT] += M_SQRT1_2; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_BACK_LEFT) >= 0) { + } else if (out_mask & AV_CH_BACK_LEFT) { matrix[BACK_LEFT ][TOP_BACK_LEFT ] += 1.0; matrix[BACK_RIGHT][TOP_BACK_RIGHT] += 1.0; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_SIDE_LEFT) >= 0) { + } else if (out_mask & AV_CH_SIDE_LEFT) { matrix[SIDE_LEFT ][TOP_BACK_LEFT ] += 1.0; matrix[SIDE_RIGHT][TOP_BACK_RIGHT] += 1.0; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_LEFT) >= 0) { + } else if (out_mask & AV_CH_FRONT_LEFT) { matrix[FRONT_LEFT ][TOP_BACK_LEFT ] += surround_mix_level; matrix[FRONT_RIGHT][TOP_BACK_RIGHT] += surround_mix_level; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_CENTER) >= 0) { + } else if (out_mask & AV_CH_FRONT_CENTER) { matrix[FRONT_CENTER][TOP_BACK_LEFT ] += surround_mix_level*M_SQRT1_2; matrix[FRONT_CENTER][TOP_BACK_RIGHT] += surround_mix_level*M_SQRT1_2; } else @@ -351,19 +352,19 @@ static void build_matrix(const AVChannelLayout *in_ch_layout, const AVChannelLay /* BS.2127-1 maps U+180 to rear outputs before front outputs. */ if (unaccounted & AV_CH_TOP_BACK_CENTER) { - if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_TOP_BACK_LEFT) >= 0) { + if (out_mask & AV_CH_TOP_BACK_LEFT) { matrix[TOP_BACK_LEFT ][TOP_BACK_CENTER] += M_SQRT1_2; matrix[TOP_BACK_RIGHT][TOP_BACK_CENTER] += M_SQRT1_2; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_BACK_LEFT) >= 0) { + } else if (out_mask & AV_CH_BACK_LEFT) { matrix[BACK_LEFT ][TOP_BACK_CENTER] += M_SQRT1_2; matrix[BACK_RIGHT][TOP_BACK_CENTER] += M_SQRT1_2; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_SIDE_LEFT) >= 0) { + } else if (out_mask & AV_CH_SIDE_LEFT) { matrix[SIDE_LEFT ][TOP_BACK_CENTER] += M_SQRT1_2; matrix[SIDE_RIGHT][TOP_BACK_CENTER] += M_SQRT1_2; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_LEFT) >= 0) { + } else if (out_mask & AV_CH_FRONT_LEFT) { matrix[FRONT_LEFT ][TOP_BACK_CENTER] += 0.5; matrix[FRONT_RIGHT][TOP_BACK_CENTER] += 0.5; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_CENTER) >= 0) + } else if (out_mask & AV_CH_FRONT_CENTER) matrix[FRONT_CENTER][TOP_BACK_CENTER] += 0.5; else av_assert0(0); @@ -371,45 +372,45 @@ static void build_matrix(const AVChannelLayout *in_ch_layout, const AVChannelLay if (unaccounted & AV_CH_TOP_SIDE_LEFT) { - if (av_channel_layout_subset(out_ch_layout, (AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_BACK_CENTER)) == - (AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_BACK_CENTER)) { + if ((out_mask & (AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_BACK_CENTER)) == + (AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_BACK_CENTER)) { /* UH+180 = sqrt(1/3); U±045 = sqrt(2/3)*/ matrix[TOP_FRONT_LEFT ][TOP_SIDE_LEFT ] += SQRT2_3; matrix[TOP_FRONT_RIGHT][TOP_SIDE_RIGHT] += SQRT2_3; matrix[TOP_BACK_CENTER][TOP_SIDE_LEFT ] += SQRT1_3; matrix[TOP_BACK_CENTER][TOP_SIDE_RIGHT] += SQRT1_3; - } else if (av_channel_layout_subset(out_ch_layout, (AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_BACK_LEFT)) == - (AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_BACK_LEFT)) { + } else if ((out_mask & (AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_BACK_LEFT)) == + (AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_BACK_LEFT)) { /* U±030 = U±110 = sqrt(1/2) */ matrix[TOP_FRONT_LEFT ][TOP_SIDE_LEFT ] += M_SQRT1_2; matrix[TOP_FRONT_RIGHT][TOP_SIDE_RIGHT] += M_SQRT1_2; matrix[TOP_BACK_LEFT ][TOP_SIDE_LEFT ] += M_SQRT1_2; matrix[TOP_BACK_RIGHT][TOP_SIDE_RIGHT] += M_SQRT1_2; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_TOP_FRONT_LEFT) >= 0 && - av_channel_layout_subset(out_ch_layout, (AV_CH_BACK_LEFT|AV_CH_SIDE_LEFT))) { + } else if (out_mask & AV_CH_TOP_FRONT_LEFT && + (out_mask & (AV_CH_BACK_LEFT|AV_CH_SIDE_LEFT))) { /* U±030 = M±110 = sqrt(1/2) */ matrix[TOP_FRONT_LEFT ][TOP_SIDE_LEFT] += M_SQRT1_2; matrix[TOP_FRONT_RIGHT][TOP_SIDE_RIGHT] += M_SQRT1_2; - if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_BACK_LEFT) >= 0) { + if (out_mask & AV_CH_BACK_LEFT) { matrix[BACK_LEFT ][TOP_SIDE_LEFT] += M_SQRT1_2; matrix[BACK_RIGHT][TOP_SIDE_RIGHT] += M_SQRT1_2; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_SIDE_LEFT) >= 0) { + } else if (out_mask & AV_CH_SIDE_LEFT) { matrix[SIDE_LEFT ][TOP_SIDE_LEFT] += M_SQRT1_2; matrix[SIDE_RIGHT][TOP_SIDE_RIGHT] += M_SQRT1_2; } - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_SIDE_LEFT) >= 0) { + } else if (out_mask & AV_CH_SIDE_LEFT) { /* M±090 = 1 */ matrix[SIDE_LEFT ][TOP_SIDE_LEFT ] += 1.0; matrix[SIDE_RIGHT][TOP_SIDE_RIGHT] += 1.0; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_LEFT) >= 0) { + } else if (out_mask & AV_CH_FRONT_LEFT) { /* M±030 = M±110 = sqrt(1/2) */ matrix[FRONT_LEFT ][TOP_SIDE_LEFT ] += surround_mix_level; matrix[FRONT_RIGHT][TOP_SIDE_RIGHT] += surround_mix_level; - if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_BACK_LEFT) >= 0) { + if (out_mask & AV_CH_BACK_LEFT) { matrix[BACK_LEFT ][TOP_SIDE_LEFT ] += M_SQRT1_2; matrix[BACK_RIGHT][TOP_SIDE_RIGHT] += M_SQRT1_2; } - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_CENTER) >= 0) { + } else if (out_mask & AV_CH_FRONT_CENTER) { matrix[FRONT_CENTER][TOP_SIDE_LEFT ] += surround_mix_level*M_SQRT1_2; matrix[FRONT_CENTER][TOP_SIDE_RIGHT] += surround_mix_level*M_SQRT1_2; } else @@ -417,54 +418,54 @@ static void build_matrix(const AVChannelLayout *in_ch_layout, const AVChannelLay } if (unaccounted & AV_CH_TOP_CENTER) { - if (av_channel_layout_subset(out_ch_layout, (AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_BACK_LEFT)) == - (AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_BACK_LEFT)) { + if ((out_mask & (AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_BACK_LEFT)) == + (AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_BACK_LEFT)) { /* U+045 = U-045 = U+135 = U-135 = sqrt(1/4) */ matrix[TOP_FRONT_LEFT ][TOP_CENTER] += 0.5; matrix[TOP_FRONT_RIGHT][TOP_CENTER] += 0.5; matrix[TOP_BACK_LEFT ][TOP_CENTER] += 0.5; matrix[TOP_BACK_RIGHT][TOP_CENTER] += 0.5; - } else if (av_channel_layout_subset(out_ch_layout, (AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_BACK_CENTER)) == - (AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_BACK_CENTER)) { + } else if ((out_mask & (AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_BACK_CENTER)) == + (AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_BACK_CENTER)) { /* U+045 = U-045 = UH+180 = sqrt(1/3) */ matrix[TOP_FRONT_LEFT ][TOP_CENTER] += SQRT1_3; matrix[TOP_FRONT_RIGHT][TOP_CENTER] += SQRT1_3; matrix[TOP_BACK_CENTER][TOP_CENTER] += SQRT1_3; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_TOP_FRONT_LEFT) >= 0 && - av_channel_layout_subset(out_ch_layout, (AV_CH_BACK_LEFT|AV_CH_SIDE_LEFT))) { + } else if (out_mask & AV_CH_TOP_FRONT_LEFT && + out_mask & (AV_CH_BACK_LEFT|AV_CH_SIDE_LEFT)) { /* U+045 = U-045 = M+135 = M-135 = sqrt(1/4) * * U+030 = U-030 = M+110 = M-110 = sqrt(1/4) */ matrix[TOP_FRONT_LEFT ][TOP_CENTER] += 0.5; matrix[TOP_FRONT_RIGHT][TOP_CENTER] += 0.5; - if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_BACK_LEFT) >= 0) { + if (out_mask & AV_CH_BACK_LEFT) { matrix[BACK_LEFT ][TOP_CENTER] += 0.5; matrix[BACK_RIGHT][TOP_CENTER] += 0.5; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_SIDE_LEFT) >= 0) { + } else if (out_mask & AV_CH_SIDE_LEFT) { matrix[SIDE_LEFT ][TOP_CENTER] += 0.5; matrix[SIDE_RIGHT][TOP_CENTER] += 0.5; } - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_LEFT) >= 0) { + } else if (out_mask & AV_CH_FRONT_LEFT) { /* M+030 = M-030 = M+135 = M-135 = sqrt(1/4) */ /* M+030 = M-030 = sqrt(1/4) */ matrix[FRONT_LEFT ][TOP_CENTER] += 0.5; matrix[FRONT_RIGHT][TOP_CENTER] += 0.5; - if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_BACK_LEFT) >= 0) { + if (out_mask & AV_CH_BACK_LEFT) { matrix[BACK_LEFT ][TOP_CENTER] += 0.5; matrix[BACK_RIGHT][TOP_CENTER] += 0.5; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_SIDE_LEFT) >= 0) { + } else if (out_mask & AV_CH_SIDE_LEFT) { matrix[SIDE_LEFT ][TOP_CENTER] += 0.5; matrix[SIDE_RIGHT][TOP_CENTER] += 0.5; } - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_CENTER) >= 0) { + } else if (out_mask & AV_CH_FRONT_CENTER) { matrix[FRONT_CENTER][TOP_CENTER] += 0.5; } else av_assert0(0); } if (unaccounted & AV_CH_BOTTOM_FRONT_CENTER) { - if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_CENTER) >= 0) { + if (out_mask & AV_CH_FRONT_CENTER) { matrix[FRONT_CENTER][BOTTOM_FRONT_CENTER] += 1.0; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_LEFT) >= 0) { + } else if (out_mask & AV_CH_FRONT_LEFT) { matrix[FRONT_LEFT ][BOTTOM_FRONT_CENTER] += center_mix_level; matrix[FRONT_RIGHT][BOTTOM_FRONT_CENTER] += center_mix_level; } else @@ -472,16 +473,16 @@ static void build_matrix(const AVChannelLayout *in_ch_layout, const AVChannelLay } if (unaccounted & AV_CH_BOTTOM_FRONT_LEFT) { - if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_BOTTOM_FRONT_CENTER) >= 0) { + if (out_mask & AV_CH_BOTTOM_FRONT_CENTER) { matrix[BOTTOM_FRONT_CENTER][BOTTOM_FRONT_LEFT ] += M_SQRT1_2; matrix[BOTTOM_FRONT_CENTER][BOTTOM_FRONT_RIGHT] += M_SQRT1_2; - if (av_channel_layout_index_from_channel(in_ch_layout, AV_CHAN_BOTTOM_FRONT_CENTER) >= 0) + if (in_mask & AV_CH_BOTTOM_FRONT_CENTER) matrix[BOTTOM_FRONT_CENTER][BOTTOM_FRONT_CENTER] = center_mix_level * sqrt(2); - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_LEFT) >= 0) { + } else if (out_mask & AV_CH_FRONT_LEFT) { /* M±030 = 1 */ matrix[FRONT_LEFT ][BOTTOM_FRONT_LEFT ] += 1.0; matrix[FRONT_RIGHT][BOTTOM_FRONT_RIGHT] += 1.0; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_CENTER) >= 0) { + } else if (out_mask & AV_CH_FRONT_CENTER) { matrix[FRONT_CENTER][BOTTOM_FRONT_LEFT ] += M_SQRT1_2; matrix[FRONT_CENTER][BOTTOM_FRONT_RIGHT] += M_SQRT1_2; } else @@ -490,9 +491,9 @@ static void build_matrix(const AVChannelLayout *in_ch_layout, const AVChannelLay /* mix LFE into front left/right or center */ if (unaccounted & AV_CH_LOW_FREQUENCY) { - if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_CENTER) >= 0) { + if (out_mask & AV_CH_FRONT_CENTER) { matrix[FRONT_CENTER][LOW_FREQUENCY] += lfe_mix_level; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_LEFT) >= 0) { + } else if (out_mask & AV_CH_FRONT_LEFT) { matrix[FRONT_LEFT ][LOW_FREQUENCY] += lfe_mix_level * M_SQRT1_2; matrix[FRONT_RIGHT][LOW_FREQUENCY] += lfe_mix_level * M_SQRT1_2; } else @@ -501,11 +502,11 @@ static void build_matrix(const AVChannelLayout *in_ch_layout, const AVChannelLay /* mix LFE2 into LFE, front left/right or center */ if (unaccounted & AV_CH_LOW_FREQUENCY_2) { - if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_LOW_FREQUENCY) >= 0) { + if (out_mask & AV_CH_LOW_FREQUENCY) { matrix[LOW_FREQUENCY][LOW_FREQUENCY_2] += M_SQRT1_2; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_CENTER) >= 0) { + } else if (out_mask & AV_CH_FRONT_CENTER) { matrix[FRONT_CENTER][LOW_FREQUENCY_2] += lfe_mix_level; - } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_LEFT) >= 0) { + } else if (out_mask & AV_CH_FRONT_LEFT) { matrix[FRONT_LEFT ][LOW_FREQUENCY_2] += lfe_mix_level * M_SQRT1_2; matrix[FRONT_RIGHT][LOW_FREQUENCY_2] += lfe_mix_level * M_SQRT1_2; } else @@ -525,9 +526,7 @@ static void build_matrix(const AVChannelLayout *in_ch_layout, const AVChannelLay if (i < FF_ARRAY_ELEMS(matrix) && j < FF_ARRAY_ELEMS(matrix[0])) matrix_param[stride*out_i + in_i] = matrix[i][j]; else - matrix_param[stride*out_i + in_i] = i == j && - ( av_channel_layout_index_from_channel(in_ch_layout, i) >= 0 - && av_channel_layout_index_from_channel(out_ch_layout, i) >= 0); + matrix_param[stride*out_i + in_i] = i == j && (in_mask & out_mask & (1ULL << i)); sum += fabs(matrix_param[stride*out_i + in_i]); } maxcoef= FFMAX(maxcoef, sum); _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
