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 69A264C2E6 for ; Sun, 9 Nov 2025 16:37:07 +0000 (UTC) Authentication-Results: ffbox; dkim=fail (body hash mismatch (got b'nhUL8XntLrkX6Ky1wf/ya4wBdV5zyXb2jlb+W09XH7w=', expected b'tSFwtSNxoJ2kbMQeXdgShF/uK1oCFgNcYN47CkaKU60=')) 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=1762706218; 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=nhUL8XntLrkX6Ky1wf/ya4wBdV5zyXb2jlb+W09XH7w=; b=suGBZtrK9yR6vPfSnmvnM06gMu/FLehJAfaFp4YM2wfYCdI7KzAy9k7QAW8lhy+ni+r8l gsrDdBlNguBID/DOytvazVgf8xsOT64O0Jh3PO6Bq0lk5gWF4yT2VYgx8HJGUIhV3f5u5FE wcPRy7VundjQzf9NKC8QQcJq4Z2KutUjqcesHouQasTcwBl78I/fFX2dmQwYy+XRGQ2bUaV iI3eTUW8k42efdq3smHvz1M5432spFQEOQ0G7WD1ZSzQ8KiCBY10DOgC6t8N9KaTX0FOR3u JxCRjIJffTbpbBNeEd8kwMW2jNaIeTfrxmBxXZD4x69PkDKUgPqiZvKSApug== Received: from [172.19.0.2] (unknown [172.19.0.2]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 4E99368FBC0; Sun, 9 Nov 2025 18:36:58 +0200 (EET) ARC-Seal: i=1; cv=none; a=rsa-sha256; d=ffmpeg.org; s=arc; t=1762706203; b=dj1Dl0t6gw4MiafSflLUHYwYQJINtUOSMl62OPbqCd/RUTSo4OZAqCwTLOcAkdAGTaFh3 34Cj+tNo6PJhF7/uu4s/tkFw+N3XaB/7zuJ09qNsxMdHqQ9HbdBK3HI6h1a0UujswOzzuyV T6X8Zdd8FVeDuSFlTNRTl0pudhe5Z5yEGeG8KGmuvgJzun+UgDI9eLpx7W77JxtQmMcQMM4 z0ZXhRDwQL/BIBrejimAth9flrGX7JvycQ67sbuj571w38c4zbPp++6rYgTXo5WDfqhkoPI cuf/ezBcxsdRawCFOu2FyxjrlJ/EgkrjAb31PasHAu14jb6Xgpjt3wCiKTNQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=ffmpeg.org; s=arc; t=1762706203; 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=ee2Ky4NucPHX9H+tysLDyj5puJXnfGMfGbv+iyqa6z0=; b=d943aWiZ0JkGl8htvFy/SsTn+KouzVhY5uiY81OoYpuR0OOqIHAXoptwinGZEiGjODpin SYc3Tshh6vNchtEf+U5ITK8bXUZ4y+h2kkU4QsKqSEcQMKpHTQG6DAkdfM6g4y++Ttnp59+ zEKbJI+YcimqUxFkqUMN/h+2vSVI9Gd2ma5jPKQIYsVxdzxvk/Vw7wygCSrXR/s2uzGMee2 RX7JWSxYSlJ7lgPoc8KaDEa2gC8I8ypBQDABOBXnaolZu+RTBbg6y3sSx3Idjjntg8iZ+iN 6x15iIfv4Zv87CNIIDs1WUXSToUs4DMpT1daQnpDySs+CtetUcQ0OvFbHugQ== 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=1762706191; h=content-type : mime-version : content-transfer-encoding : from : to : reply-to : subject : date : from; bh=tSFwtSNxoJ2kbMQeXdgShF/uK1oCFgNcYN47CkaKU60=; b=WF7tQtcrHAlpeyvYu2aCOxUw2UD5NkSGOViH9FBEJAPFBnTvBXXxfRbNJy7jL0ifANTm6 khZFtlh2Hw1V64gk8d53kg4PdOSi6Vk+2u1pRRHJifvbtD0Ozp/Bsm5eezd6JPwqxx6yYEs BGLGGlxDpHmcy4o1WRxmjAwrPJOYqdohhmp+6KIlzh9WzvPq/h63gGtZIQnhJdcRqJxpmET D2xfscsunw2sYDRm/OIe4ZMLgM1mOVcDRxlrHM4KasnmKVfI7XG7p/jrvSk9WjYZ3nKPtdg B9312LUiie/fXbBakJEmXsaW1qMjpc77xJcRN2uUU1tgcGCmLny2GaUkaVBQ== Received: from 188d6d40ca7a (code.ffmpeg.org [188.245.149.3]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id C61F168FB0F for ; Sun, 9 Nov 2025 18:36:31 +0200 (EET) MIME-Version: 1.0 To: ffmpeg-devel@ffmpeg.org Date: Sun, 09 Nov 2025 16:36:31 -0000 Message-ID: <176270619193.25.443855757706134554@2cb04c0e5124> Message-ID-Hash: 2ZXAIIQWTSJ4277LLVA3USFAC2JMCZ35 X-Message-ID-Hash: 2ZXAIIQWTSJ4277LLVA3USFAC2JMCZ35 X-MailFrom: code@ffmpeg.org X-Mailman-Rule-Hits: nonmember-moderation 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 X-Mailman-Version: 3.3.10 Precedence: list Reply-To: FFmpeg development discussions and patches Subject: [FFmpeg-devel] [PATCH] Re-initialize stream on new metadata. (PR #20876) 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: toots via ffmpeg-devel Cc: toots Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Archived-At: List-Archive: List-Post: PR #20876 opened by toots URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20876 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20876.patch >>From e4ae6472ff667d22826a2fb0f48e9bd8e9daa3c2 Mon Sep 17 00:00:00 2001 From: Romain Beauxis Date: Fri, 14 Mar 2025 00:27:04 -0500 Subject: [PATCH] Re-initialize stream on new metadata. --- libavformat/oggenc.c | 38 ++++++++++++++++++++++++++++++++------ tests/fate/ogg-flac.mak | 4 ++++ tests/fate/ogg-opus.mak | 4 ++++ tests/fate/ogg-vorbis.mak | 4 ++++ 4 files changed, 44 insertions(+), 6 deletions(-) diff --git a/libavformat/oggenc.c b/libavformat/oggenc.c index e1bb7dd972..26d9b06c6b 100644 --- a/libavformat/oggenc.c +++ b/libavformat/oggenc.c @@ -40,6 +40,9 @@ #define MAX_PAGE_SIZE 65025 +static int ogg_write_trailer(AVFormatContext *s); +static void ogg_deinit(AVFormatContext *s); + typedef struct OGGPage { int64_t start_granule; int64_t granule; @@ -66,6 +69,7 @@ typedef struct OGGStreamContext { OGGPage page; ///< current page unsigned serial_num; ///< serial number int64_t last_granule; ///< last packet granule + int packet_written; } OGGStreamContext; typedef struct OGGPageList { @@ -640,6 +644,28 @@ static int ogg_write_packet_internal(AVFormatContext *s, AVPacket *pkt) OGGStreamContext *oggstream = st->priv_data; int ret; int64_t granule; + const uint8_t *side_metadata; + size_t size; + + side_metadata = av_packet_get_side_data(pkt, AV_PKT_DATA_STRINGS_METADATA, &size); + if (side_metadata && oggstream->packet_written) { + if (1 < s->nb_streams) { + av_log(s, AV_LOG_WARNING, "Multiple streams present: cannot insert new metadata!\n"); + } else { + ogg_write_trailer(s); + ogg_deinit(s); + ogg_init(s); + + av_dict_free(&st->metadata); + ret = av_packet_unpack_dictionary(side_metadata, size, &st->metadata); + if (ret < 0) + return ret; + + ogg_write_header(s); + } + } + + oggstream->packet_written = 1; if (st->codecpar->codec_id == AV_CODEC_ID_THEORA) { int64_t pts = oggstream->vrev < 1 ? pkt->pts : pkt->pts + pkt->duration; @@ -720,7 +746,7 @@ static int ogg_write_trailer(AVFormatContext *s) return 0; } -static void ogg_free(AVFormatContext *s) +static void ogg_deinit(AVFormatContext *s) { OGGContext *ogg = s->priv_data; OGGPageList *p = ogg->page_list; @@ -772,7 +798,7 @@ const FFOutputFormat ff_ogg_muxer = { .write_header = ogg_write_header, .write_packet = ogg_write_packet, .write_trailer = ogg_write_trailer, - .deinit = ogg_free, + .deinit = ogg_deinit, .p.flags = AVFMT_TS_NEGATIVE | AVFMT_TS_NONSTRICT, .p.priv_class = &ogg_muxer_class, .flags_internal = FF_OFMT_FLAG_ALLOW_FLUSH, @@ -791,7 +817,7 @@ const FFOutputFormat ff_oga_muxer = { .write_header = ogg_write_header, .write_packet = ogg_write_packet, .write_trailer = ogg_write_trailer, - .deinit = ogg_free, + .deinit = ogg_deinit, .p.flags = AVFMT_TS_NEGATIVE, .p.priv_class = &ogg_muxer_class, .flags_internal = FF_OFMT_FLAG_ALLOW_FLUSH, @@ -813,7 +839,7 @@ const FFOutputFormat ff_ogv_muxer = { .write_header = ogg_write_header, .write_packet = ogg_write_packet, .write_trailer = ogg_write_trailer, - .deinit = ogg_free, + .deinit = ogg_deinit, .p.flags = AVFMT_TS_NEGATIVE | AVFMT_TS_NONSTRICT, .p.priv_class = &ogg_muxer_class, .flags_internal = FF_OFMT_FLAG_ALLOW_FLUSH, @@ -832,7 +858,7 @@ const FFOutputFormat ff_spx_muxer = { .write_header = ogg_write_header, .write_packet = ogg_write_packet, .write_trailer = ogg_write_trailer, - .deinit = ogg_free, + .deinit = ogg_deinit, .p.flags = AVFMT_TS_NEGATIVE, .p.priv_class = &ogg_muxer_class, .flags_internal = FF_OFMT_FLAG_ALLOW_FLUSH, @@ -851,7 +877,7 @@ const FFOutputFormat ff_opus_muxer = { .write_header = ogg_write_header, .write_packet = ogg_write_packet, .write_trailer = ogg_write_trailer, - .deinit = ogg_free, + .deinit = ogg_deinit, .p.flags = AVFMT_TS_NEGATIVE, .p.priv_class = &ogg_muxer_class, .flags_internal = FF_OFMT_FLAG_ALLOW_FLUSH, diff --git a/tests/fate/ogg-flac.mak b/tests/fate/ogg-flac.mak index 07bdb232cb..083e99e852 100644 --- a/tests/fate/ogg-flac.mak +++ b/tests/fate/ogg-flac.mak @@ -2,6 +2,10 @@ FATE_OGG_FLAC += fate-ogg-flac-chained-meta fate-ogg-flac-chained-meta: REF = $(SRC_PATH)/tests/ref/fate/ogg-flac-chained-meta.txt fate-ogg-flac-chained-meta: CMD = run $(APITESTSDIR)/api-dump-stream-meta-test$(EXESUF) $(TARGET_SAMPLES)/ogg-flac/chained-meta.ogg +FATE_OGG_FLAC += fate-ogg-flac-copy-chained-meta +fate-ogg-flac-copy-chained-meta: REF = $(SRC_PATH)/tests/ref/fate/ogg-flac-chained-meta.txt +fate-ogg-flac-copy-chained-meta: CMD = run $(FFMPEG) -nostdin -hide_banner -loglevel quiet -i ../fate-suite/ogg-flac/chained-meta.ogg -c copy -f ogg - | $(APITESTSDIR)/api-dump-stream-meta-test$(EXESUF) /dev/stdin + FATE_OGG_FLAC-$(call DEMDEC, OGG, FLAC, FLAC_PARSER) += $(FATE_OGG_FLAC) FATE_SAMPLES_DUMP_STREAM_META += $(FATE_OGG_FLAC-yes) diff --git a/tests/fate/ogg-opus.mak b/tests/fate/ogg-opus.mak index 54b6fbabde..e75952fb67 100644 --- a/tests/fate/ogg-opus.mak +++ b/tests/fate/ogg-opus.mak @@ -2,6 +2,10 @@ FATE_OGG_OPUS += fate-ogg-opus-chained-meta fate-ogg-opus-chained-meta: REF = $(SRC_PATH)/tests/ref/fate/ogg-opus-chained-meta.txt fate-ogg-opus-chained-meta: CMD = run $(APITESTSDIR)/api-dump-stream-meta-test$(EXESUF) $(TARGET_SAMPLES)/ogg-opus/chained-meta.ogg +FATE_OGG_OPUS += fate-ogg-opus-copy-chained-meta +fate-ogg-opus-copy-chained-meta: REF = $(SRC_PATH)/tests/ref/fate/ogg-opus-chained-meta.txt +fate-ogg-opus-copy-chained-meta: CMD = run $(FFMPEG) -nostdin -hide_banner -loglevel quiet -i ../fate-suite/ogg-opus/chained-meta.ogg -c copy -f ogg - | $(APITESTSDIR)/api-dump-stream-meta-test$(EXESUF) /dev/stdin + FATE_OGG_OPUS-$(call DEMDEC, OGG, OPUS) += $(FATE_OGG_OPUS) FATE_SAMPLES_DUMP_STREAM_META += $(FATE_OGG_OPUS-yes) diff --git a/tests/fate/ogg-vorbis.mak b/tests/fate/ogg-vorbis.mak index 74805d591e..ac33783bc9 100644 --- a/tests/fate/ogg-vorbis.mak +++ b/tests/fate/ogg-vorbis.mak @@ -2,6 +2,10 @@ FATE_OGG_VORBIS += fate-ogg-vorbis-chained-meta fate-ogg-vorbis-chained-meta: REF = $(SRC_PATH)/tests/ref/fate/ogg-vorbis-chained-meta.txt fate-ogg-vorbis-chained-meta: CMD = run $(APITESTSDIR)/api-dump-stream-meta-test$(EXESUF) $(TARGET_SAMPLES)/ogg-vorbis/chained-meta.ogg +FATE_OGG_VORBIS += fate-ogg-vorbis-copy-chained-meta +fate-ogg-vorbis-copy-chained-meta: REF = $(SRC_PATH)/tests/ref/fate/ogg-vorbis-chained-meta.txt +fate-ogg-vorbis-copy-chained-meta: CMD = run $(FFMPEG) -nostdin -hide_banner -loglevel quiet -i ../fate-suite/ogg-vorbis/chained-meta.ogg -c copy -f ogg - | $(APITESTSDIR)/api-dump-stream-meta-test$(EXESUF) /dev/stdin + FATE_OGG_VORBIS-$(call DEMDEC, OGG, VORBIS) += $(FATE_OGG_VORBIS) FATE_SAMPLES_DUMP_STREAM_META += $(FATE_OGG_VORBIS-yes) -- 2.49.1 _______________________________________________ ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org