Only count the number of channels that are present on input. Fix a case where input FL+FR+BL gives a better score to 6.1 than quad because BL+BR→SL+SR counts as two remapped channels while BL→BL+BR counts as one preserved and one extra.
Signed-off-by: Nicolas George <geo...@nsup.org> --- libavfilter/avfiltergraph.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) There are more issues in this score logic. For example stereo+BR→stereo+SL is accepted because of the BL+BR→SL+SR substitution, this is wrong. The obvious fix would be to change "(out_chlayout & cmp1)" into "(out_chlayout & cmp1) == cmp1", i.e. only accept a substitution if the target is entirely available in the output, but that would break the case stereo+BR→stereo+SL. I do not have time for a more complete fix right now, but I believe the present patch is valid and useful by itself. diff --git a/libavfilter/avfiltergraph.c b/libavfilter/avfiltergraph.c index a859ecb..7d358a4 100644 --- a/libavfilter/avfiltergraph.c +++ b/libavfilter/avfiltergraph.c @@ -923,13 +923,14 @@ static void swap_channel_layouts_on_filter(AVFilterContext *filter) for (k = 0; k < FF_ARRAY_ELEMS(ch_subst); k++) { uint64_t cmp0 = ch_subst[k][0]; uint64_t cmp1 = ch_subst[k][1]; + uint64_t mapped = in_chlayout & cmp0; if (( in_chlayout & cmp0) && (!(out_chlayout & cmp0)) && (out_chlayout & cmp1) && (!( in_chlayout & cmp1))) { in_chlayout &= ~cmp0; out_chlayout &= ~cmp1; /* add score for channel match, minus a deduction for having to do the substitution */ - score += 10 * av_get_channel_layout_nb_channels(cmp1) - 2; + score += 10 * av_get_channel_layout_nb_channels(mapped) - 2; } } -- 2.1.3 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel