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]
