PR #22922 opened by jiangjie URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/22922 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/22922.patch
>From 1770e581030b46b59982704ecc85b6d0bbcc4b30 Mon Sep 17 00:00:00 2001 From: jiangjie <[email protected]> Date: Sun, 26 Apr 2026 16:23:59 +0800 Subject: [PATCH] avcodec/hevc_mp4toannexb_bsf: process new extradata --- libavcodec/bsf/hevc_mp4toannexb.c | 35 ++++++++++++------- tests/fate/hevc.mak | 3 ++ .../fate/hevc-bsf-mp4toannexb-new-extradata | 9 +++++ 3 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 tests/ref/fate/hevc-bsf-mp4toannexb-new-extradata diff --git a/libavcodec/bsf/hevc_mp4toannexb.c b/libavcodec/bsf/hevc_mp4toannexb.c index 60f38ac414..5811c4152c 100644 --- a/libavcodec/bsf/hevc_mp4toannexb.c +++ b/libavcodec/bsf/hevc_mp4toannexb.c @@ -38,8 +38,9 @@ typedef struct HEVCBSFContext { int extradata_parsed; } HEVCBSFContext; -static int hevc_extradata_to_annexb(AVBSFContext *ctx) -{ +static int hevc_extradata_to_annexb(AVBSFContext* ctx, + uint8_t* extradata, int extradata_size) { + HEVCBSFContext *s = ctx->priv_data; GetByteContext gb; int length_size, num_arrays, i, j; int ret = 0; @@ -47,7 +48,7 @@ static int hevc_extradata_to_annexb(AVBSFContext *ctx) uint8_t *new_extradata = NULL; size_t new_extradata_size = 0; - bytestream2_init(&gb, ctx->par_in->extradata, ctx->par_in->extradata_size); + bytestream2_init(&gb, extradata, extradata_size); bytestream2_skip(&gb, 21); length_size = (bytestream2_get_byte(&gb) & 3) + 1; @@ -92,7 +93,9 @@ static int hevc_extradata_to_annexb(AVBSFContext *ctx) if (!new_extradata_size) av_log(ctx, AV_LOG_WARNING, "No parameter sets in the extradata\n"); - return length_size; + s->length_size = length_size; + s->extradata_parsed = 1; + return 0; fail: av_freep(&new_extradata); return ret; @@ -100,20 +103,15 @@ fail: static int hevc_mp4toannexb_init(AVBSFContext *ctx) { - HEVCBSFContext *s = ctx->priv_data; - int ret; - if (ctx->par_in->extradata_size < MIN_HEVCC_LENGTH || AV_RB24(ctx->par_in->extradata) == 1 || AV_RB32(ctx->par_in->extradata) == 1) { av_log(ctx, AV_LOG_VERBOSE, "The input looks like it is Annex B already\n"); } else { - ret = hevc_extradata_to_annexb(ctx); - if (ret < 0) - return ret; - s->length_size = ret; - s->extradata_parsed = 1; + return hevc_extradata_to_annexb(ctx, + ctx->par_in->extradata, + ctx->par_in->extradata_size); } return 0; @@ -128,11 +126,24 @@ static int hevc_mp4toannexb_filter(AVBSFContext *ctx, AVPacket *out) int got_irap = 0; int got_ps = 0, seen_irap_ps = 0; int i, ret = 0; + size_t extradata_size; + uint8_t* extradata; ret = ff_bsf_get_packet(ctx, &in); if (ret < 0) return ret; + extradata = + av_packet_get_side_data(in, AV_PKT_DATA_NEW_EXTRADATA, &extradata_size); + if (extradata_size >= MIN_HEVCC_LENGTH && + ((extradata[0] == 1) || + (extradata[0] == 0 && (extradata[1] || extradata[2] > 1)))) { + ret = hevc_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); + } + if (!s->extradata_parsed) { av_packet_move_ref(out, in); av_packet_free(&in); diff --git a/tests/fate/hevc.mak b/tests/fate/hevc.mak index 351f188968..8d6d10e825 100644 --- a/tests/fate/hevc.mak +++ b/tests/fate/hevc.mak @@ -235,6 +235,9 @@ fate-hevc-bsf-mp4toannexb: CMD = md5 -i $(TARGET_PATH)/tests/data/hevc-mp4.mov - fate-hevc-bsf-mp4toannexb: CMP = oneline fate-hevc-bsf-mp4toannexb: REF = 73019329ed7f81c24f9af67c34c640c0 +FATE_HEVC-$(call DEMMUX, HEVC MOV, MOV HEVC, HEVC_PARSER HEVC_MP4TOANNEXB_BSF EXTRACT_EXTRADATA_BSF HEVC_METADATA_BSF) += fate-hevc-bsf-mp4toannexb-new-extradata +fate-hevc-bsf-mp4toannexb-new-extradata: CMD = stream_remux mov $(TARGET_SAMPLES)/hevc/extradata-reload-multi-stsd.mov "" hevc "-bsf hevc_mp4toannexb,hevc_metadata -map 0:v" + # Start with IDR, POC < 0 after the second IDR FATE_HEVC-$(call FRAMECRC, MOV HEVC,, HEVC_PARSER MOV_MUXER DTS2PTS_BSF) += fate-hevc-bsf-dts2pts-idr fate-hevc-bsf-dts2pts-idr: CMD = transcode "hevc" $(TARGET_SAMPLES)/hevc-conformance/SLIST_B_Sony_8.bit mov "-c:v copy -bsf:v dts2pts" "-c:v copy" diff --git a/tests/ref/fate/hevc-bsf-mp4toannexb-new-extradata b/tests/ref/fate/hevc-bsf-mp4toannexb-new-extradata new file mode 100644 index 0000000000..9644359d98 --- /dev/null +++ b/tests/ref/fate/hevc-bsf-mp4toannexb-new-extradata @@ -0,0 +1,9 @@ +#tb 0: 1/25 +#media_type 0: video +#codec_id 0: rawvideo +#dimensions 0: 128x128 +#sar 0: 1/1 +0, 0, 0, 1, 24576, 0x76a8158f +0, 1, 1, 1, 24576, 0x804e162a +0, 2, 2, 1, 24576, 0xc1d05bea +0, 3, 3, 1, 24576, 0xd84f5c77 -- 2.52.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
