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]

Reply via email to