PR #23728 opened by Zhao Zhili (quink) URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23728 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23728.patch
>From 531e4aff667098afe6c84557c911fab8831bb940 Mon Sep 17 00:00:00 2001 From: Zhao Zhili <[email protected]> Date: Tue, 7 Jul 2026 14:49:49 +0800 Subject: [PATCH 1/4] avcodec/bsf: fix codec-id match loop in av_bsf_link The break statement only exits the inner j loop, so the outer i loop always runs to the AV_CODEC_ID_NONE terminator and the match result is never recorded. Signed-off-by: Zhao Zhili <[email protected]> --- libavcodec/bitstreamfilter.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/libavcodec/bitstreamfilter.c b/libavcodec/bitstreamfilter.c index ae445143fe..57310e417e 100644 --- a/libavcodec/bitstreamfilter.c +++ b/libavcodec/bitstreamfilter.c @@ -144,13 +144,18 @@ int av_bsf_link(AVBitStreamFilterContext *src, unsigned srcpad, } if (src->output_pads[srcpad].codec_ids && dst->input_pads[dstpad].codec_ids) { - int i; - for (i = 0; src->output_pads[srcpad].codec_ids[i] != AV_CODEC_ID_NONE; i++) + int i, found = 0; + for (i = 0; src->output_pads[srcpad].codec_ids[i] != AV_CODEC_ID_NONE; i++) { for (int j = 0; dst->input_pads[dstpad].codec_ids[j] != AV_CODEC_ID_NONE; j++) - if (src->output_pads[srcpad].codec_ids[i] == dst->input_pads[dstpad].codec_ids[j]) + if (src->output_pads[srcpad].codec_ids[i] == dst->input_pads[dstpad].codec_ids[j]) { + found = 1; break; + } + if (found) + break; + } - if (src->output_pads->codec_ids[i] == AV_CODEC_ID_NONE) { + if (!found) { av_log(src, AV_LOG_ERROR, "No common codec id between source and dest pads\n"); av_log(src, AV_LOG_ERROR, "Supported input pad codecs are: "); for (i = 0; dst->input_pads->codec_ids[i] != AV_CODEC_ID_NONE; i++) { -- 2.52.0 >From 1a2717018c81b834bf76caafa1cdfad5fb0c525b Mon Sep 17 00:00:00 2001 From: Zhao Zhili <[email protected]> Date: Tue, 7 Jul 2026 14:58:59 +0800 Subject: [PATCH 2/4] avcodec/bsf: fix wrong pad index in av_bsf_link diagnostics The error-path log loops read pad 0's codec id list instead of the actual srcpad/dstpad, printing the wrong supported-codec list when a link is rejected. Signed-off-by: Zhao Zhili <[email protected]> --- libavcodec/bitstreamfilter.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libavcodec/bitstreamfilter.c b/libavcodec/bitstreamfilter.c index 57310e417e..7e31470640 100644 --- a/libavcodec/bitstreamfilter.c +++ b/libavcodec/bitstreamfilter.c @@ -158,15 +158,15 @@ int av_bsf_link(AVBitStreamFilterContext *src, unsigned srcpad, if (!found) { av_log(src, AV_LOG_ERROR, "No common codec id between source and dest pads\n"); av_log(src, AV_LOG_ERROR, "Supported input pad codecs are: "); - for (i = 0; dst->input_pads->codec_ids[i] != AV_CODEC_ID_NONE; i++) { - enum AVCodecID codec_id = dst->input_pads->codec_ids[i]; + for (i = 0; dst->input_pads[dstpad].codec_ids[i] != AV_CODEC_ID_NONE; i++) { + enum AVCodecID codec_id = dst->input_pads[dstpad].codec_ids[i]; av_log(src, AV_LOG_ERROR, "%s (%d) ", avcodec_get_name(codec_id), codec_id); } av_log(src, AV_LOG_ERROR, "\n"); av_log(src, AV_LOG_ERROR, "Supported output pad codecs are: "); - for (i = 0; src->output_pads->codec_ids[i] != AV_CODEC_ID_NONE; i++) { - enum AVCodecID codec_id = src->output_pads->codec_ids[i]; + for (i = 0; src->output_pads[srcpad].codec_ids[i] != AV_CODEC_ID_NONE; i++) { + enum AVCodecID codec_id = src->output_pads[srcpad].codec_ids[i]; av_log(src, AV_LOG_ERROR, "%s (%d) ", avcodec_get_name(codec_id), codec_id); } -- 2.52.0 >From 6678cd984897bfbab77c7ebd1554828b74bc20af Mon Sep 17 00:00:00 2001 From: Zhao Zhili <[email protected]> Date: Tue, 7 Jul 2026 15:01:46 +0800 Subject: [PATCH 3/4] avcodec/bsf: tighten loop variable scope in av_bsf_link And replace tab-indented log lines with spaces. No functional change. Signed-off-by: Zhao Zhili <[email protected]> --- libavcodec/bitstreamfilter.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libavcodec/bitstreamfilter.c b/libavcodec/bitstreamfilter.c index 7e31470640..e8c1f37b4d 100644 --- a/libavcodec/bitstreamfilter.c +++ b/libavcodec/bitstreamfilter.c @@ -144,8 +144,8 @@ int av_bsf_link(AVBitStreamFilterContext *src, unsigned srcpad, } if (src->output_pads[srcpad].codec_ids && dst->input_pads[dstpad].codec_ids) { - int i, found = 0; - for (i = 0; src->output_pads[srcpad].codec_ids[i] != AV_CODEC_ID_NONE; i++) { + int found = 0; + for (int i = 0; src->output_pads[srcpad].codec_ids[i] != AV_CODEC_ID_NONE; i++) { for (int j = 0; dst->input_pads[dstpad].codec_ids[j] != AV_CODEC_ID_NONE; j++) if (src->output_pads[srcpad].codec_ids[i] == dst->input_pads[dstpad].codec_ids[j]) { found = 1; @@ -157,15 +157,15 @@ int av_bsf_link(AVBitStreamFilterContext *src, unsigned srcpad, if (!found) { av_log(src, AV_LOG_ERROR, "No common codec id between source and dest pads\n"); - av_log(src, AV_LOG_ERROR, "Supported input pad codecs are: "); - for (i = 0; dst->input_pads[dstpad].codec_ids[i] != AV_CODEC_ID_NONE; i++) { + av_log(src, AV_LOG_ERROR, "Supported input pad codecs are: "); + for (int i = 0; dst->input_pads[dstpad].codec_ids[i] != AV_CODEC_ID_NONE; i++) { enum AVCodecID codec_id = dst->input_pads[dstpad].codec_ids[i]; av_log(src, AV_LOG_ERROR, "%s (%d) ", avcodec_get_name(codec_id), codec_id); } av_log(src, AV_LOG_ERROR, "\n"); - av_log(src, AV_LOG_ERROR, "Supported output pad codecs are: "); - for (i = 0; src->output_pads[srcpad].codec_ids[i] != AV_CODEC_ID_NONE; i++) { + av_log(src, AV_LOG_ERROR, "Supported output pad codecs are: "); + for (int i = 0; src->output_pads[srcpad].codec_ids[i] != AV_CODEC_ID_NONE; i++) { enum AVCodecID codec_id = src->output_pads[srcpad].codec_ids[i]; av_log(src, AV_LOG_ERROR, "%s (%d) ", avcodec_get_name(codec_id), codec_id); -- 2.52.0 >From 5e29c9abf863b7ce61c1bc7ef0e5c9f3e9fc3e72 Mon Sep 17 00:00:00 2001 From: Zhao Zhili <[email protected]> Date: Tue, 7 Jul 2026 15:19:09 +0800 Subject: [PATCH 4/4] avcodec/bsf/source: fix packet leak on av_packet_ref failure Signed-off-by: Zhao Zhili <[email protected]> --- libavcodec/bsf/source.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libavcodec/bsf/source.c b/libavcodec/bsf/source.c index 896538e5c9..cbc8c138b8 100644 --- a/libavcodec/bsf/source.c +++ b/libavcodec/bsf/source.c @@ -85,8 +85,10 @@ int attribute_align_arg av_bsf_source_add_packet(AVBitStreamFilterContext *ctx, if ((flags & AV_BSF_SOURCE_FLAG_KEEP_REF)) { ret = av_packet_ref(copy, pkt); - if (ret < 0) + if (ret < 0) { + av_packet_free(©); return ret; + } } else av_packet_move_ref(copy, pkt); -- 2.52.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
