From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 2F8314B671 for ; Fri, 24 Oct 2025 17:18:46 +0000 (UTC) Authentication-Results: ffbox; dkim=fail (body hash mismatch (got b'3r+LLKJCEkNWhaJobmrl/MC1DTGkPedIbGteGbOoXwE=', expected b'vg+lDcCq4uhpd3hkDGA82zjpBizAG5i54y3ld6xbFwE=')) header.d=ffmpeg.org header.i=@ffmpeg.org header.a=rsa-sha256 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1761326311; h=mime-version : to : date : message-id : reply-to : subject : list-id : list-archive : list-archive : list-help : list-owner : list-post : list-subscribe : list-unsubscribe : from : cc : content-type : content-transfer-encoding : from; bh=3r+LLKJCEkNWhaJobmrl/MC1DTGkPedIbGteGbOoXwE=; b=lKrabxaQlEtzTcJ6pAYmN/JPM4tijt6QIKkuvHRb9PNhtn9UnTKLBnslxBhQdaoIB7R/K xkbcaow3uACcULe5Yjyk7SD5W5RWg/LQGIBTyVI8fnyqnk8hV3l/Q280lNRqRjdDsfXddtE m5oJXo8ELPPBcAaSHDztNkatvr0AGm7DbaARl7mRKE5WNA3x/HQ4skWb5e3jBvpCJUK4z0t fVv3P71KgJAE3tQild2puekV8SSZsUzNTKUZfnyjpu7BwXnUAvWmA2BJBItUZwZDodz82No 9QZu+F0j0LaXzYg1KhTPy+eBjpBHfp3hhioZo1T76mypbVWGC/nbrFJjTtqA== Received: from [172.19.0.2] (unknown [172.19.0.2]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 043A668F673; Fri, 24 Oct 2025 20:18:31 +0300 (EEST) ARC-Seal: i=1; cv=none; a=rsa-sha256; d=ffmpeg.org; s=arc; t=1761326309; b=EGzQY1zvrtHS1hVntfgnmpXDwyIedhZtUNH/c3VWyg7oef5dBdI+XNHHMyvGaQY2NDwXf FBnSRw7COUp82cl1mKnX7Y4zFQK0V+rp5Zh0wBWnaK5gAeweZZoUrglfiVTyZJr7nbpbN+J dJFeAWA0PbWTFhmK86pms8YkC7c5x3UriS4LDNmShfh7VUb/HYVJuYyoFhfAFORsHeBfRIg sZ6iJMSfFckYtEd3KUpSJEfZuVGxdf4BwTt4oK6Xrfr2h/8Y0h35oImJIIxOikowlPZ8dKK rYMQfyW0IpZO3InboLQkaGNrYw5V1MZQy8OrPjTtAPDWdXwHu6WgD7rDnMcQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=ffmpeg.org; s=arc; t=1761326309; h=from : sender : reply-to : subject : date : message-id : to : cc : mime-version : content-type : content-transfer-encoding : content-id : content-description : resent-date : resent-from : resent-sender : resent-to : resent-cc : resent-message-id : in-reply-to : references : list-id : list-help : list-unsubscribe : list-subscribe : list-post : list-owner : list-archive; bh=6VzerIuxbq4UqdTzc7l9gmCJaBhgdqvOZQkiONiEUIo=; b=HALSTfnUdl3ftna+mftOFB7TGJdFJZjXmUO77+XTFBt+bGgqt/w4b4ZoTGnz8mTA+eOsB 6qAvpb+IZB3V6J9jtpxcehOT1GT+KAT7m1BIwe8ZdNU//44jBQSfeE+rvfZVdPL8F/HOfjy 26ErYh0+WySXlOM3mcroqb7tbYiFGsbl4ouMx1ZMy3C+mGsUxy9Oyb/YOORc2/I1yoqi67E R+6QehDOkyDzKHPKHYrCDHJBHuF9Nh1icJxUUSuAEy14U6xW6gnclNi0I+4kiJaNLzgnDz3 VaOAJWySQmHzU4eYZ7ntYu5WZLniQEv2Sm7BnaXU7U5CCcwBUhx+QPGaWf1w== ARC-Authentication-Results: i=1; ffmpeg.org; dkim=pass header.d=ffmpeg.org header.i=@ffmpeg.org; arc=none; dmarc=pass header.from=ffmpeg.org policy.dmarc=quarantine Authentication-Results: ffmpeg.org; dkim=pass header.d=ffmpeg.org header.i=@ffmpeg.org; arc=none (Message is not ARC signed); dmarc=pass (Used From Domain Record) header.from=ffmpeg.org policy.dmarc=quarantine DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1761326302; h=content-type : mime-version : content-transfer-encoding : from : to : reply-to : subject : date : from; bh=vg+lDcCq4uhpd3hkDGA82zjpBizAG5i54y3ld6xbFwE=; b=gz84FFH9CqSOTFbTZgraZSkRAXKFH1JBHmttUTXkR5yvr5RIMuLfZ7x4lWigaB9lb5oBY gqEYCsbmAIJXssDyRwTBFlC9uMGr6GsJ0uYknjWqzoi2NiqH7MoF/wVXw1sDE8V+sWW8Ib6 hEckVt0srC+nZYTQCmLP8A/tRdxg0Nvtb9JsvMIuARb7ijKKffAUda8KLf5NT6lEtN1VXNF rtDeJSvpP60e7sa/Bk8FP40Tv49b048KSKPUZgF6jgTKSH/x9o208r0KDhZSdGYOH67XZiO 4QRzB6TXDhZagJ8+jQgfAu4irrzPM4JUEjlRVTeFKp3SraLAUag/j+PhLCbQ== Received: from 547bf0a948a1 (code.ffmpeg.org [188.245.149.3]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id 9068768F658 for ; Fri, 24 Oct 2025 20:18:22 +0300 (EEST) MIME-Version: 1.0 To: ffmpeg-devel@ffmpeg.org Date: Fri, 24 Oct 2025 17:18:22 -0000 Message-ID: <176132630270.25.14665566471023796367@7d278768979e> Message-ID-Hash: ZRBSDR22UST6KPFSKCY3SHIN3UAFXZ63 X-Message-ID-Hash: ZRBSDR22UST6KPFSKCY3SHIN3UAFXZ63 X-MailFrom: code@ffmpeg.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-ffmpeg-devel.ffmpeg.org-0; header-match-ffmpeg-devel.ffmpeg.org-1; header-match-ffmpeg-devel.ffmpeg.org-2; header-match-ffmpeg-devel.ffmpeg.org-3; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list Reply-To: FFmpeg development discussions and patches Subject: [FFmpeg-devel] [PATCH] avformat/demux: pass new extradata to the parser (PR #20745) List-Id: FFmpeg development discussions and patches Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: James Almer via ffmpeg-devel Cc: James Almer Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Archived-At: List-Archive: List-Post: PR #20745 opened by James Almer (jamrial) URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20745 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20745.patch Fixes parsing errors in files like the sample provided here, which while technically harmless for decoding scenarios, should still not happen. >>From 18ca5461f58d92ffa6c32032b6fefab92fe93db1 Mon Sep 17 00:00:00 2001 From: James Almer Date: Fri, 24 Oct 2025 13:34:43 -0300 Subject: [PATCH 1/5] avcodec/parser: add a flush mechanism Signed-off-by: James Almer --- libavcodec/avcodec.h | 3 +++ libavcodec/parser.c | 35 +++++++++++++++++++++++++++++++++++ libavcodec/parser.h | 1 + 3 files changed, 39 insertions(+) diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 83a4e56e22..1d08523728 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -2743,6 +2743,7 @@ typedef struct AVCodecParser { const uint8_t *buf, int buf_size); void (*parser_close)(AVCodecParserContext *s); int (*split)(AVCodecContext *avctx, const uint8_t *buf, int buf_size); + void (*parser_flush)(AVCodecParserContext *s); } AVCodecParser; /** @@ -2796,6 +2797,8 @@ int av_parser_parse2(AVCodecParserContext *s, int64_t pts, int64_t dts, int64_t pos); +void av_parser_flush(AVCodecParserContext *s); + void av_parser_close(AVCodecParserContext *s); /** diff --git a/libavcodec/parser.c b/libavcodec/parser.c index af966766ee..5ad5e127c3 100644 --- a/libavcodec/parser.c +++ b/libavcodec/parser.c @@ -191,6 +191,28 @@ int av_parser_parse2(AVCodecParserContext *s, AVCodecContext *avctx, return index; } +av_cold void av_parser_flush(AVCodecParserContext *s) +{ + if (s->parser->parser_flush) + s->parser->parser_flush(s); + + s->pict_type = AV_PICTURE_TYPE_I; + s->fetch_timestamp = 1; + s->key_frame = -1; + s->dts_sync_point = INT_MIN; + s->dts_ref_dts_delta = INT_MIN; + s->pts_dts_delta = INT_MIN; + s->format = -1; + + s->flags &= ~PARSER_FLAG_FETCHED_OFFSET; + + memset(s->cur_frame_end, 0, sizeof(s->cur_frame_end)); + memset(s->cur_frame_pts, 0, sizeof(s->cur_frame_pts)); + memset(s->cur_frame_pos, 0, sizeof(s->cur_frame_pos)); + s->cur_offset = 0; + s->cur_frame_start_index = 0; +} + av_cold void av_parser_close(AVCodecParserContext *s) { if (s) { @@ -288,6 +310,19 @@ int ff_combine_frame(ParseContext *pc, int next, return 0; } +av_cold void ff_parse_flush(AVCodecParserContext *s) +{ + ParseContext *pc = s->priv_data; + + pc->index = 0; + pc->last_index = 0; + pc->overread_index = 0; + pc->state = 0; + pc->frame_start_found = 0; + pc->overread = 0; + pc->state64 = 0; +} + av_cold void ff_parse_close(AVCodecParserContext *s) { ParseContext *pc = s->priv_data; diff --git a/libavcodec/parser.h b/libavcodec/parser.h index 2cee5ae4ff..a9ce63336b 100644 --- a/libavcodec/parser.h +++ b/libavcodec/parser.h @@ -45,6 +45,7 @@ typedef struct ParseContext{ * AVERROR(ENOMEM) if there was a memory allocation error */ int ff_combine_frame(ParseContext *pc, int next, const uint8_t **buf, int *buf_size); +void ff_parse_flush(AVCodecParserContext *s); void ff_parse_close(AVCodecParserContext *s); /** -- 2.49.1 >>From aa8653894129f336c5ff675a3cf3e2ae1a426c05 Mon Sep 17 00:00:00 2001 From: James Almer Date: Fri, 24 Oct 2025 13:35:08 -0300 Subject: [PATCH 2/5] avcodec/av1_parser: add a flush callback Signed-off-by: James Almer --- libavcodec/av1_parser.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/libavcodec/av1_parser.c b/libavcodec/av1_parser.c index ed6e1b61ad..c89a5f3b2c 100644 --- a/libavcodec/av1_parser.c +++ b/libavcodec/av1_parser.c @@ -201,6 +201,16 @@ static av_cold int av1_parser_init(AVCodecParserContext *ctx) return 0; } +static av_cold void av1_parser_flush(AVCodecParserContext *ctx) +{ + AV1ParseContext *s = ctx->priv_data; + + s->parsed_extradata = 0; + + ff_cbs_fragment_reset(&s->temporal_unit); + ff_parse_flush(s); +} + static av_cold void av1_parser_close(AVCodecParserContext *ctx) { AV1ParseContext *s = ctx->priv_data; @@ -214,5 +224,6 @@ const AVCodecParser ff_av1_parser = { .priv_data_size = sizeof(AV1ParseContext), .parser_init = av1_parser_init, .parser_close = av1_parser_close, + .parser_flush = av1_parser_flush, .parser_parse = av1_parser_parse, }; -- 2.49.1 >>From 1510f56d50f5ec771013cb6eb95e747ae017f8a0 Mon Sep 17 00:00:00 2001 From: James Almer Date: Fri, 24 Oct 2025 13:35:17 -0300 Subject: [PATCH 3/5] avcodec/h264_parser: add a flush callback Signed-off-by: James Almer --- libavcodec/h264_parser.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/libavcodec/h264_parser.c b/libavcodec/h264_parser.c index 722cbcb42f..5526807520 100644 --- a/libavcodec/h264_parser.c +++ b/libavcodec/h264_parser.c @@ -661,6 +661,16 @@ static int h264_parse(AVCodecParserContext *s, return next; } +static av_cold void h264_flush(AVCodecParserContext *s) +{ + H264ParseContext *p = s->priv_data; + + p->got_first = 0; + ff_h264_sei_uninit(&p->sei); + ff_h264_ps_uninit(&p->ps); + ff_parse_flush(s); +} + static av_cold void h264_close(AVCodecParserContext *s) { H264ParseContext *p = s->priv_data; @@ -687,5 +697,6 @@ const AVCodecParser ff_h264_parser = { .priv_data_size = sizeof(H264ParseContext), .parser_init = init, .parser_parse = h264_parse, + .parser_flush = h264_flush, .parser_close = h264_close, }; -- 2.49.1 >>From 507895a3b256c62657617a4e07d18345a7814d92 Mon Sep 17 00:00:00 2001 From: James Almer Date: Fri, 24 Oct 2025 13:35:29 -0300 Subject: [PATCH 4/5] avcodec/hevc/parser: add a flush callback Signed-off-by: James Almer --- libavcodec/hevc/parser.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/libavcodec/hevc/parser.c b/libavcodec/hevc/parser.c index 16b40e2b10..d7be923169 100644 --- a/libavcodec/hevc/parser.c +++ b/libavcodec/hevc/parser.c @@ -341,6 +341,17 @@ static int hevc_parse(AVCodecParserContext *s, AVCodecContext *avctx, return next; } +static void hevc_parser_flush(AVCodecParserContext *s) +{ + HEVCParserContext *ctx = s->priv_data; + + ctx->parsed_extradata = 0; + + ff_hevc_ps_uninit(&ctx->ps); + ff_hevc_reset_sei(&ctx->sei); + ff_parse_flush(s); +} + static void hevc_parser_close(AVCodecParserContext *s) { HEVCParserContext *ctx = s->priv_data; @@ -357,4 +368,5 @@ const AVCodecParser ff_hevc_parser = { .priv_data_size = sizeof(HEVCParserContext), .parser_parse = hevc_parse, .parser_close = hevc_parser_close, + .parser_flush = hevc_parser_flush, }; -- 2.49.1 >>From 344c8cc1d82662985124040e4a2b1b1b342d88af Mon Sep 17 00:00:00 2001 From: James Almer Date: Fri, 24 Oct 2025 13:40:29 -0300 Subject: [PATCH 5/5] avformat/demux: pass new extradata to the parser The parser API doesn't work with packets, only raw data, so in order for it to be made aware of new extradata propagated through packet side data we need to pass it in some other form, namely, replacing the main extradata and ensuring it will be parsed by forcing a flush. Signed-off-by: James Almer --- libavformat/demux.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/libavformat/demux.c b/libavformat/demux.c index 374a84cda5..fa8730ee86 100644 --- a/libavformat/demux.c +++ b/libavformat/demux.c @@ -1167,7 +1167,10 @@ static int parse_packet(AVFormatContext *s, AVPacket *pkt, AVPacket *out_pkt = si->parse_pkt; AVStream *st = s->streams[stream_index]; FFStream *const sti = ffstream(st); + AVPacketSideData *sd = NULL; const uint8_t *data = pkt->data; + const uint8_t *extradata = sti->avctx->extradata; + int extradata_size = sti->avctx->extradata_size; int size = pkt->size; int ret = 0, got_output = flush; @@ -1184,6 +1187,17 @@ static int parse_packet(AVFormatContext *s, AVPacket *pkt, } } + if (pkt->side_data_elems) + sd = av_packet_side_data_get(pkt->side_data, pkt->side_data_elems, + AV_PKT_DATA_NEW_EXTRADATA); + if (sd) { + av_assert1(size && !flush); + + av_parser_flush(sti->parser); + sti->avctx->extradata = sd->data; + sti->avctx->extradata_size = sd->size; + } + while (size > 0 || (flush && got_output)) { int64_t next_pts = pkt->pts; int64_t next_dts = pkt->dts; @@ -1277,6 +1291,11 @@ static int parse_packet(AVFormatContext *s, AVPacket *pkt, } fail: + if (sd) { + sti->avctx->extradata = extradata; + sti->avctx->extradata_size = extradata_size; + } + if (ret < 0) av_packet_unref(out_pkt); av_packet_unref(pkt); -- 2.49.1 _______________________________________________ ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org