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(&copy);
             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]

Reply via email to