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 v2 1/2] Parse ogg/flac header again after processing a new chained ogg bitstream.
Date: Thu, 30 Jan 2025 08:08:02 +0100
Message-ID: <CABWZ6ORQXGRdnu2i=URMDGnX_vnSB7VQb_ojNomqSv+iEgkjyA@mail.gmail.com> (raw)
In-Reply-To: <F22B7072-F33B-40A6-B64C-E7D65E16222E@gmail.com>

Le mer. 29 janv. 2025 à 17:40, Marvin Scholz <epirat07@gmail.com> a écrit :
>
>
>
> On 29 Jan 2025, at 15:40, Romain Beauxis wrote:
>
> > This patch makes sure that ogg/flac headers are parsed again when
> > encountering a new logic stream inside a chained ogg bistream[1].
> >
> > This patches makes it possible to retrieve metadata in chained ogg/flac
> > bitstreams. It is particularly important because ogg/flac is one of the
> > only (if not the only one) lossless container supported over
HTTP/icecast.
> >
> > The patch has been tested with various ogg/flac encoders and appears to
> > work fine with ffmpeg.
> >
> > Changes since last version:
> > * Make sure to clear the stream's metadata before parsing again.
> >
> > 1: https://xiph.org/ogg/doc/oggstream.html
> >
>
> Hi, thanks a lot for trying to solve this, see remarks inline below:
>
> > ---
> >  libavformat/oggdec.c       | 7 +++++--
> >  libavformat/oggparseflac.c | 2 ++
> >  2 files changed, 7 insertions(+), 2 deletions(-)
> >
> > diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c
> > index 5339fdd32c..d986e19817 100644
> > --- a/libavformat/oggdec.c
> > +++ b/libavformat/oggdec.c
> > @@ -239,8 +239,11 @@ static int ogg_replace_stream(AVFormatContext *s,
uint32_t serial, char *magic,
> >      os->start_trimming = 0;
> >      os->end_trimming = 0;
> >
> > -    /* Chained files have extradata as a new packet */
> > -    if (codec == &ff_opus_codec)
> > +    /* Parse opus and flac header on new chained bitstream.
> > +     * For opus, header contains required extradata as new packet
> > +     * For both formats, this makes it possible to read chained
metadata. */
> > +    if (codec == &ff_opus_codec ||
> > +        codec == &ff_flac_codec)
> >          os->header = -1;
> >
> >      return i;
> > diff --git a/libavformat/oggparseflac.c b/libavformat/oggparseflac.c
> > index f25ed9cc15..932907fa1a 100644
> > --- a/libavformat/oggparseflac.c
> > +++ b/libavformat/oggparseflac.c
> > @@ -72,6 +72,8 @@ flac_header (AVFormatContext * s, int idx)
> >
> >          avpriv_set_pts_info(st, 64, 1, samplerate);
> >      } else if (mdt == FLAC_METADATA_TYPE_VORBIS_COMMENT) {
> > +        /* New metadata packet; release old data. */
> > +        av_dict_free(&st->metadata);
>
> I do not think it’s fine to change this mid-demuxing, as the caller
> has no way to know this changed „behind its back“ so may still hold
> on to the old pointer and run into invalid memory access.
>
> I checked with James and he suggested that maybe propagating the new
> metadata with AVPacket’s side_data might be a better approach, similar
> to AV_PKT_DATA_NEW_EXTRADATA.

Thank you for the review!

Do you mean the st->metadata dictionary?

The nature of `av_dict` is to be an ever-changing pointer; each time a
value is changed, the underlying pointer is changed so I think keeping a
long-term pointer on it is a programming error.

It's also worth noting that this is the same method used currently by the
vorbis decoder.

That being said, updating the AVStream is not natural and requires the user
to constantly check on it.

It would be more natural to have:
* The headers packets flow out of the demuxer as it is now so anyone
operating at this level can see them and act accordingly.
* Have the decoded frame carry the new metadata, which is a more natural
place for it.

I'll look into this. Hopefully this is a better approach and also one that
could be generalized to all ogg-encapsulated formats..

-- 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-01-30  7:08 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-01-29 14:40 Romain Beauxis
2025-01-29 14:40 ` [FFmpeg-devel] [PATCH v1 2/2] Add stream dump test with test for ogg/flac Romain Beauxis
2025-01-29 16:05   ` Romain Beauxis
2025-01-29 16:40 ` [FFmpeg-devel] [PATCH v2 1/2] Parse ogg/flac header again after processing a new chained ogg bitstream Marvin Scholz
2025-01-30  7:08   ` Romain Beauxis [this message]
2025-02-04 10:57     ` 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='CABWZ6ORQXGRdnu2i=URMDGnX_vnSB7VQb_ojNomqSv+iEgkjyA@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