PR #22343 opened by James Almer (jamrial) URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/22343 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/22343.patch
Given we rewrite these NALUs to remove the encoded data blocks to export as extradata, we need to do the inverse to remove SC, GC and AI blocks to export as filtered data in packets. >From 152b22cf3aa598a36f7d88fb7f0d3bb6ee9fd951 Mon Sep 17 00:00:00 2001 From: James Almer <[email protected]> Date: Sun, 1 Mar 2026 22:57:32 -0300 Subject: [PATCH 1/3] avcodec/bsf/extract_extradata: fix writing filtered LCEVC NALUs when removing extradata write_lcevc_nalu() is meant only for IDR and NON_IDR NALUs. For everything else, just copy it unchanged. Signed-off-by: James Almer <[email protected]> --- libavcodec/bsf/extract_extradata.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libavcodec/bsf/extract_extradata.c b/libavcodec/bsf/extract_extradata.c index 158e78871e..d751656cdf 100644 --- a/libavcodec/bsf/extract_extradata.c +++ b/libavcodec/bsf/extract_extradata.c @@ -421,7 +421,8 @@ static int extract_extradata_lcevc(AVBSFContext *ctx, AVPacket *pkt, *size = write_lcevc_nalu(ctx, &pb_extradata, nal); } else if (s->remove) { bytestream2_put_be24(&pb_filtered_data, 1); //startcode - *size = write_lcevc_nalu(ctx, &pb_filtered_data, nal); + bytestream2_put_bufferu(&pb_filtered_data, nal->raw_data, nal->raw_size); + filtered_size += nal->raw_size; } } -- 2.52.0 >From c1a64b457f2be1855bbe505eeda461d79c96972d Mon Sep 17 00:00:00 2001 From: James Almer <[email protected]> Date: Sun, 1 Mar 2026 22:58:18 -0300 Subject: [PATCH 2/3] avcodec/bsf/extract_extradata: simplify a switch statement And use named defines. Will come in handy the following commit. Signed-off-by: James Almer <[email protected]> --- libavcodec/bsf/extract_extradata.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/libavcodec/bsf/extract_extradata.c b/libavcodec/bsf/extract_extradata.c index d751656cdf..875cff6a2d 100644 --- a/libavcodec/bsf/extract_extradata.c +++ b/libavcodec/bsf/extract_extradata.c @@ -330,16 +330,12 @@ static int write_lcevc_nalu(AVBSFContext *ctx, PutByteContext *pbc, const H2645N } switch (payload_type) { - case 0: - bytestream2_put_buffer(pbc, raw_gbc.buffer, raw_block_size); - sc = 1; - break; - case 1: - bytestream2_put_buffer(pbc, raw_gbc.buffer, raw_block_size); - gc = 1; - break; - case 5: + case LCEVC_PAYLOAD_TYPE_SEQUENCE_CONFIG: + case LCEVC_PAYLOAD_TYPE_GLOBAL_CONFIG: + case LCEVC_PAYLOAD_TYPE_ADDITIONAL_INFO: bytestream2_put_buffer(pbc, raw_gbc.buffer, raw_block_size); + sc |= payload_type == LCEVC_PAYLOAD_TYPE_SEQUENCE_CONFIG; + gc |= payload_type == LCEVC_PAYLOAD_TYPE_GLOBAL_CONFIG; break; default: break; -- 2.52.0 >From 46f3bed0aaf9c0c8e51a57be4cb17845e2d3c639 Mon Sep 17 00:00:00 2001 From: James Almer <[email protected]> Date: Sun, 1 Mar 2026 23:02:27 -0300 Subject: [PATCH 3/3] avcodec/bsf/extract_extradata: remove extradata blocks from supported LCEVC NALUs Given we rewrite these NALUs to remove the encoded data blocks to export as extradata, we need to do the inverse to remove SC, GC and AI blocks to export as filtered data in packes. Signed-off-by: James Almer <[email protected]> --- libavcodec/bsf/extract_extradata.c | 36 ++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/libavcodec/bsf/extract_extradata.c b/libavcodec/bsf/extract_extradata.c index 875cff6a2d..306ede5136 100644 --- a/libavcodec/bsf/extract_extradata.c +++ b/libavcodec/bsf/extract_extradata.c @@ -290,7 +290,8 @@ static inline uint64_t get_mb(GetBitContext *s) { * present in the bitstream, we need to keep track of the raw buffer as we navigate * the stripped buffer. */ -static int write_lcevc_nalu(AVBSFContext *ctx, PutByteContext *pbc, const H2645NAL *nal) +static int write_lcevc_nalu(AVBSFContext *ctx, PutByteContext *pbc, const H2645NAL *nal, + int remove) { GetByteContext gbc, raw_gbc; int sc = 0, gc = 0; @@ -333,11 +334,16 @@ static int write_lcevc_nalu(AVBSFContext *ctx, PutByteContext *pbc, const H2645N case LCEVC_PAYLOAD_TYPE_SEQUENCE_CONFIG: case LCEVC_PAYLOAD_TYPE_GLOBAL_CONFIG: case LCEVC_PAYLOAD_TYPE_ADDITIONAL_INFO: + if (remove) + break; bytestream2_put_buffer(pbc, raw_gbc.buffer, raw_block_size); sc |= payload_type == LCEVC_PAYLOAD_TYPE_SEQUENCE_CONFIG; gc |= payload_type == LCEVC_PAYLOAD_TYPE_GLOBAL_CONFIG; break; default: + if (!remove) + break; + bytestream2_put_buffer(pbc, raw_gbc.buffer, raw_block_size); break; } @@ -345,7 +351,7 @@ static int write_lcevc_nalu(AVBSFContext *ctx, PutByteContext *pbc, const H2645N bytestream2_skip(&raw_gbc, raw_block_size); } - if (!sc && !gc) + if (!remove && !sc && !gc) return AVERROR_INVALIDDATA; bytestream2_put_byte(pbc, 0x80); // rbsp_alignment bits @@ -376,11 +382,10 @@ static int extract_extradata_lcevc(AVBSFContext *ctx, AVPacket *pkt, if (val_in_array(extradata_nal_types, nb_extradata_nal_types, nal->type)) { bytestream2_init_writer(&pb_extradata, NULL, 0); // dummy pass to find sc, gc or ai - if (!write_lcevc_nalu(ctx, &pb_extradata, nal)) + if (!write_lcevc_nalu(ctx, &pb_extradata, nal, 0)) extradata_size += nal->raw_size + 3; - } else if (s->remove) { - filtered_size += nal->raw_size + 3; } + filtered_size += nal->raw_size + 3; } if (extradata_size) { @@ -403,18 +408,35 @@ static int extract_extradata_lcevc(AVBSFContext *ctx, AVPacket *pkt, } *data = extradata; - *size = extradata_size; + *size = 0; bytestream2_init_writer(&pb_extradata, extradata, extradata_size); if (s->remove) bytestream2_init_writer(&pb_filtered_data, filtered_buf->data, filtered_size); + filtered_size = 0; for (i = 0; i < s->h2645_pkt.nb_nals; i++) { H2645NAL *nal = &s->h2645_pkt.nals[i]; if (val_in_array(extradata_nal_types, nb_extradata_nal_types, nal->type)) { bytestream2_put_be24(&pb_extradata, 1); //startcode - *size = write_lcevc_nalu(ctx, &pb_extradata, nal); + ret = write_lcevc_nalu(ctx, &pb_extradata, nal, 0); + if (ret < 0) { + av_freep(data); + av_buffer_unref(&filtered_buf); + return ret; + } + *size += ret; + if (s->remove) { + bytestream2_put_be24(&pb_filtered_data, 1); //startcode + ret = write_lcevc_nalu(ctx, &pb_filtered_data, nal, 1); + if (ret < 0) { + av_freep(data); + av_buffer_unref(&filtered_buf); + return ret; + } + filtered_size += ret; + } } else if (s->remove) { bytestream2_put_be24(&pb_filtered_data, 1); //startcode bytestream2_put_bufferu(&pb_filtered_data, nal->raw_data, nal->raw_size); -- 2.52.0 _______________________________________________ ffmpeg-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
