From: Romain Beauxis <romain.beauxis@gmail.com>
To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Subject: Re: [FFmpeg-devel] [PATCH v5 1/6] libavcodec: Add generic metadata injection using AV_PKT_DATA_METADATA_UPDATE
Date: Tue, 18 Feb 2025 22:36:56 -0600
Message-ID: <CABWZ6OThZF5tA_K+NRud4komiEVRx9JwYGWiqzWWZxu-BJAiTA@mail.gmail.com> (raw)
In-Reply-To: <CABWZ6OTf-sY+3aw0dTkFmVxSOVj3M5gd-zgJ4S+=zet+vnbDTQ@mail.gmail.com>
Le mar. 18 févr. 2025 à 22:11, Romain Beauxis
<romain.beauxis@gmail.com> a écrit :
>
> Le mar. 18 févr. 2025 à 17:28, Lynne <dev@lynne.ee> a écrit :
> >
> > On 17/02/2025 17:19, Romain Beauxis wrote:
> > > libavcodec/decode.c: intercept `AV_PKT_DATA_METADATA_UPDATE` packet extra data,
> > > attach them to the next decoded frame.
> > >
> > > The metadata needs to be cached because there is no guarantee that each packet
> > > will generate a decoded frame immediately.
> > >
> > > `AV_PKT_DATA_METADATA_UPDATE` does not seem used in `libavcodec` at the moment
> > > so regression risks seem low.
> > >
> > > This generic mechanism could be reused to support more in-band metadata update
> > > in the future.
> > >
> > > ---
> > > libavcodec/decode.c | 20 ++++++++++++++++++++
> > > 1 file changed, 20 insertions(+)
> > >
> > > diff --git a/libavcodec/decode.c b/libavcodec/decode.c
> > > index cac7e620d2..96e2f0ce95 100644
> > > --- a/libavcodec/decode.c
> > > +++ b/libavcodec/decode.c
> > > @@ -97,6 +97,8 @@ typedef struct DecodeContext {
> > > int lcevc_frame;
> > > int width;
> > > int height;
> > > +
> > > + AVDictionary *pending_metadata;
> > > } DecodeContext;
> > >
> > > static DecodeContext *decode_ctx(AVCodecInternal *avci)
> > > @@ -729,6 +731,8 @@ int attribute_align_arg avcodec_send_packet(AVCodecContext *avctx, const AVPacke
> > > {
> > > AVCodecInternal *avci = avctx->internal;
> > > DecodeContext *dc = decode_ctx(avci);
> > > + const uint8_t *side_metadata;
> > > + size_t size;
> > > int ret;
> > >
> > > if (!avcodec_is_open(avctx) || !av_codec_is_decoder(avctx->codec))
> > > @@ -746,6 +750,14 @@ int attribute_align_arg avcodec_send_packet(AVCodecContext *avctx, const AVPacke
> > > ret = av_packet_ref(avci->buffer_pkt, avpkt);
> > > if (ret < 0)
> > > return ret;
> > > +
> > > + side_metadata = av_packet_get_side_data(avpkt, AV_PKT_DATA_METADATA_UPDATE, &size);
> > > + if (side_metadata) {
> > > + av_dict_free(&dc->pending_metadata);
> > > + ret = av_packet_unpack_dictionary(side_metadata, size, &dc->pending_metadata);
> > > + if (ret < 0)
> > > + return ret;
> > > + }
> > > } else
> > > dc->draining_started = 1;
> > >
> > > @@ -815,6 +827,7 @@ fail:
> > > int ff_decode_receive_frame(AVCodecContext *avctx, AVFrame *frame)
> > > {
> > > AVCodecInternal *avci = avctx->internal;
> > > + DecodeContext *dc = decode_ctx(avci);
> > > int ret;
> > >
> > > if (!avcodec_is_open(avctx) || !av_codec_is_decoder(avctx->codec))
> > > @@ -887,6 +900,12 @@ int ff_decode_receive_frame(AVCodecContext *avctx, AVFrame *frame)
> > > }
> > > }
> > > #endif
> > > +
> > > + if (dc->pending_metadata) {
> > > + av_dict_copy(&frame->metadata, dc->pending_metadata, AV_DICT_APPEND);
> > > + av_dict_free(&dc->pending_metadata);
> > > + }
> > > +
> > > return 0;
> > > fail:
> > > av_frame_unref(frame);
> > > @@ -2314,4 +2333,5 @@ void ff_decode_internal_uninit(AVCodecContext *avctx)
> > > DecodeContext *dc = decode_ctx(avci);
> > >
> > > av_refstruct_unref(&dc->lcevc);
> > > + av_dict_free(&dc->pending_metadata);
> > > }
> >
> > btw, jamrial mentioned that AVSTREAM_EVENT_FLAG_METADATA_UPDATED exists.
> > I only see it used to inform API users that metadata has been updated,
> > but you should set the flag.
> >
> > Other than that, I'm fine with the patchset. You should resend it with
> > the change, and if there are no comments, I'll merge it in a few days.
>
> Thank you for the review.
>
> Thanks for pointing that out. Since ogg vorbis already supports
> AVSTREAM_EVENT_FLAG_METADATA_UPDATED I think it would make sense to
> favor our the whole process from there.
>
> However, I have some questions about how this is implemented in vorbis.
>
> The vorbis implementation:
> * Parses new comment metadata and adds them to the AVStream's metadata
> * Entries are appended in this case there is already an existing one:
>
> if (av_dict_get(*m, t, NULL, 0))
> av_dict_set(m, t, ";", AV_DICT_APPEND);
> av_dict_set(m, t, v, AV_DICT_APPEND);
>
> * Then AVSTREAM_EVENT_FLAG_METADATA_UPDATED is set on the AVStream.
>
> I can see a couple of issues:
> * This is pretty unexpected behavior. Any consumer of the stream's
> metadata would expect a single title, not an accumulation of all
> previously parsed titles
> * This is also a memory leak.
>
> Should we make it so the stream's duplicated metadata are taking the
> last value instead?
Actually, I'd miss a sneaky `av_dict_free` call!
Updated patchset coming soon!
-- Romain
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
next prev parent reply other threads:[~2025-02-19 4:37 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-17 16:19 [FFmpeg-devel] [PATCH v5 0/6] Properly decode ogg metadata in ogg/flac and ogg/opus chained bitstreams Romain Beauxis
2025-02-17 16:19 ` [FFmpeg-devel] [PATCH v5 1/6] libavcodec: Add generic metadata injection using AV_PKT_DATA_METADATA_UPDATE Romain Beauxis
2025-02-17 19:10 ` Lynne
2025-02-17 19:18 ` Romain Beauxis
2025-02-18 23:28 ` Lynne
2025-02-19 4:11 ` Romain Beauxis
2025-02-19 4:36 ` Romain Beauxis [this message]
2025-02-17 16:19 ` [FFmpeg-devel] [PATCH v5 2/6] tests: Add stream dump test API util Romain Beauxis
2025-02-17 16:19 ` [FFmpeg-devel] [PATCH v5 3/6] Parse ogg/flac comments in new ogg packets Romain Beauxis
2025-02-17 16:19 ` [FFmpeg-devel] [PATCH v5 4/6] tests: Add chained ogg/flac stream dump test Romain Beauxis
2025-02-17 16:19 ` [FFmpeg-devel] [PATCH v5 5/6] Parse comments from secondary chained ogg/opus streams Romain Beauxis
2025-02-17 16:19 ` [FFmpeg-devel] [PATCH v5 6/6] tests: Add chained ogg/opus stream dump test Romain Beauxis
2025-02-17 16:30 ` [FFmpeg-devel] [PATCH v5 0/6] Properly decode ogg metadata in ogg/flac and ogg/opus chained bitstreams Romain Beauxis
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CABWZ6OThZF5tA_K+NRud4komiEVRx9JwYGWiqzWWZxu-BJAiTA@mail.gmail.com \
--to=romain.beauxis@gmail.com \
--cc=ffmpeg-devel@ffmpeg.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git