PR #23218 opened by James Almer (jamrial)
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23218
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23218.patch

It's against the documented behavior of bitstream filters.


>From 23837610047ad0d908ebc0d23d24885a6eac47f1 Mon Sep 17 00:00:00 2001
From: James Almer <[email protected]>
Date: Sun, 24 May 2026 14:42:38 -0300
Subject: [PATCH] avcodec/bsf/h264_mp4toannexb: don't overwrite output codecpar
 extradata after init()

It's against the documented behavior of bitstream filters.

Signed-off-by: James Almer <[email protected]>
---
 libavcodec/bsf/h264_mp4toannexb.c | 39 ++++++++++++++++++++-----------
 1 file changed, 25 insertions(+), 14 deletions(-)

diff --git a/libavcodec/bsf/h264_mp4toannexb.c 
b/libavcodec/bsf/h264_mp4toannexb.c
index 36b09b4dd6..4c9070a617 100644
--- a/libavcodec/bsf/h264_mp4toannexb.c
+++ b/libavcodec/bsf/h264_mp4toannexb.c
@@ -82,7 +82,7 @@ static void count_or_copy(uint8_t **out, uint64_t *out_size,
 }
 
 static int h264_extradata_to_annexb(AVBSFContext *ctx,
-                                    uint8_t *extradata, int extradata_size)
+                                    uint8_t **extradata, size_t 
*extradata_size)
 {
     H264BSFContext *s = ctx->priv_data;
     GetByteContext ogb, *gb = &ogb;
@@ -93,12 +93,12 @@ static int h264_extradata_to_annexb(AVBSFContext *ctx,
     const int padding                   = AV_INPUT_BUFFER_PADDING_SIZE;
     int length_size, pps_offset = 0;
 
-    if (extradata_size < 7) {
-        av_log(ctx, AV_LOG_ERROR, "Invalid extradata size: %d\n", 
extradata_size);
+    if (*extradata_size < 7) {
+        av_log(ctx, AV_LOG_ERROR, "Invalid extradata size: %zu\n", 
*extradata_size);
         return AVERROR_INVALIDDATA;
     }
 
-    bytestream2_init(gb, extradata, extradata_size);
+    bytestream2_init(gb, *extradata, *extradata_size);
 
     bytestream2_skipu(gb, 4);
 
@@ -172,9 +172,8 @@ pps:
                "The resulting stream may not play.\n");
     }
 
-    av_freep(&ctx->par_out->extradata);
-    ctx->par_out->extradata      = out;
-    ctx->par_out->extradata_size = total_size;
+    *extradata      = out;
+    *extradata_size = total_size;
 
     s->length_size      = length_size;
     s->new_idr          = 1;
@@ -259,7 +258,9 @@ static int h264_mp4toannexb_filter_ps(H264BSFContext *s,
 
 static int h264_mp4toannexb_init(AVBSFContext *ctx)
 {
-    int extra_size = ctx->par_in->extradata_size;
+    uint8_t *extradata = ctx->par_in->extradata;
+    size_t extra_size = ctx->par_in->extradata_size;
+    int ret;
 
     /* retrieve sps and pps NAL units from extradata */
     if (!extra_size                                               ||
@@ -269,9 +270,15 @@ static int h264_mp4toannexb_init(AVBSFContext *ctx)
                "The input looks like it is Annex B already\n");
         return 0;
     }
-    return h264_extradata_to_annexb(ctx,
-                                    ctx->par_in->extradata,
-                                    ctx->par_in->extradata_size);
+    ret = h264_extradata_to_annexb(ctx, &extradata, &extra_size);
+    if (ret < 0)
+        return ret;
+
+    av_freep(&ctx->par_out->extradata);
+    ctx->par_out->extradata = extradata;
+    ctx->par_out->extradata_size = extra_size;
+
+    return 0;
 }
 
 static int h264_mp4toannexb_filter(AVBSFContext *ctx, AVPacket *opkt)
@@ -294,11 +301,15 @@ static int h264_mp4toannexb_filter(AVBSFContext *ctx, 
AVPacket *opkt)
     extradata = av_packet_get_side_data(in, AV_PKT_DATA_NEW_EXTRADATA,
                                         &extradata_size);
     if (extradata && extradata[0] == 1) {
-        ret = h264_extradata_to_annexb(ctx, extradata, extradata_size);
+        ret = h264_extradata_to_annexb(ctx, &extradata, &extradata_size);
         if (ret < 0)
             goto fail;
-        av_packet_side_data_remove(in->side_data, &in->side_data_elems,
-                                   AV_PKT_DATA_NEW_EXTRADATA);
+        ret = av_packet_add_side_data(in, AV_PKT_DATA_NEW_EXTRADATA,
+                                      extradata, extradata_size);
+        if (ret < 0) {
+            av_free(extradata);
+            goto fail;
+        }
     }
 
     /* nothing to filter */
-- 
2.52.0

_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to