Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Romain Beauxis <romain.beauxis@gmail.com>
To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Subject: Re: [FFmpeg-devel] [PATCH v7 1/8] Add generic metadata injection using AV_PKT_DATA_METADATA_UPDATE
Date: Mon, 10 Mar 2025 08:49:24 -0500
Message-ID: <CABWZ6OTehyeihv_m+QOL_fPH=1vZxhJsrCpvPVEei6ykaUJrnQ@mail.gmail.com> (raw)
In-Reply-To: <AS8P250MB07446D772D0C8628157692DB8FD62@AS8P250MB0744.EURP250.PROD.OUTLOOK.COM>

Le lun. 10 mars 2025 à 02:13, Andreas Rheinhardt
<andreas.rheinhardt@outlook.com> a écrit :
>
> Romain Beauxis:
> > libavcodec/decode.c: intercept `AV_PKT_DATA_METADATA_UPDATE` packet
> > extra data, attach them to the next decoded frame.
> >
> > ---
> >  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);
> >  }
>
> Why is this not in ff_decode_frame_props_from_pkt() (in
> add_metadata_from_side_data())?

At the moment, metadata updates arrive attached to ogg header packets.
See this test output:

Stream ID: 0, packet PTS: 704, packet DTS: 704, metadata:
encoder=Lavc61.19.100 libvorbis:title=First Stream
Stream ID: 0, frame PTS: 704, metadata:
Stream ID: 0, packet PTS: 0, packet DTS: 0, metadata:
encoder=Lavc61.19.100 libvorbis:title=First Stream
Stream ID: 0, packet PTS: 0, packet DTS: 0, metadata:
encoder=Lavc61.19.100 libvorbis:title=Second Stream
Stream ID: 0, packet PTS: 0, packet DTS: 0, metadata:
encoder=Lavc61.19.100 libvorbis:title=Second Stream
Stream ID: 0, packet PTS: 0, packet DTS: 0, metadata:
encoder=Lavc61.19.100 libvorbis:title=Second Stream
Stream ID: 0, frame PTS: 0, metadata: encoder=Lavc61.19.100
libvorbis:title=Second Stream

(Note that this is the current behavior)

These packets do not provide an audio frame immediately so the
metadata update has to be delayed to the next decoded frame.

It seems to me that the semantics of these functions is to get data
from a submitted packet and attach it to its corresponding frame.

In this case this would not work.

In future work, we want to remove the ogg header packet from the
demuxer output and attach the metadata update directly to the first
packet sent for decoding.

At that point, the functionality could be moved to the
add_metadata_from_side_data function.

Does that make sense?

-- 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".

  reply	other threads:[~2025-03-10 13:49 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-02-25 22:01 [FFmpeg-devel] [PATCH v7 0/8] Properly decode ogg metadata in ogg/{vorbis, flac, opus} chained bitstreams Romain Beauxis
2025-02-25 22:01 ` [FFmpeg-devel] [PATCH v7 1/8] Add generic metadata injection using AV_PKT_DATA_METADATA_UPDATE Romain Beauxis
2025-03-09 18:31   ` Michael Niedermayer
2025-03-10 13:50     ` Romain Beauxis
2025-03-10  7:13   ` Andreas Rheinhardt
2025-03-10 13:49     ` Romain Beauxis [this message]
2025-02-25 22:01 ` [FFmpeg-devel] [PATCH v7 2/8] tests: Add stream dump test API util Romain Beauxis
2025-02-25 22:01 ` [FFmpeg-devel] [PATCH v7 3/8] tests: Add chained ogg/vorbis stream dump test Romain Beauxis
2025-02-25 22:03   ` Romain Beauxis
2025-02-25 22:01 ` [FFmpeg-devel] [PATCH v7 4/8] libavformat/oggdec.h, libavformat/oggparsevorbis.c: Factor out vorbis metadata update mechanism Romain Beauxis
2025-02-25 22:01 ` [FFmpeg-devel] [PATCH v7 5/8] libavformat/oggparseflac.c: Parse ogg/flac comments in new ogg packets, add them to ogg stream new_metadata Romain Beauxis
2025-02-25 22:01 ` [FFmpeg-devel] [PATCH v7 6/8] tests: Add chained ogg/flac stream dump test Romain Beauxis
2025-02-25 22:01 ` [FFmpeg-devel] [PATCH v7 7/8] libavformat/oggparseopus.c: Parse comments from secondary chained streams header packet Romain Beauxis
2025-02-25 22:01 ` [FFmpeg-devel] [PATCH v7 8/8] tests: Add chained ogg/opus stream dump test Romain Beauxis
2025-02-28 19:54 ` [FFmpeg-devel] [PATCH v7 0/8] Properly decode ogg metadata in ogg/{vorbis, flac, opus} chained bitstreams Romain Beauxis
2025-03-07 22:03   ` 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='CABWZ6OTehyeihv_m+QOL_fPH=1vZxhJsrCpvPVEei6ykaUJrnQ@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