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".
next prev parent 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