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-devel@ffmpeg.org
Cc: Romain Beauxis <romain.beauxis@gmail.com>
Subject: [FFmpeg-devel] [PATCH v4 0/5] Properly decode ogg metadata in ogg/flac and ogg/opus chained bitstreams
Date: Mon, 10 Feb 2025 13:25:54 -0600
Message-ID: <20250210192600.42502-1-romain.beauxis@gmail.com> (raw)

This is a series of patches to allow proper decoding of ogg metadata
in chained ogg/flac and ogg/opus streams.

Changes since v3:
* Added opus implementation
* Cleaned up, separated patches in a more logical way.

Summary of code changes:

The changes in this patch series allow proper decoding of metadata associated
with subsequent streams in chained ogg/flac and ogg/opus bitstream.

This is done by intercepting ogg packets with comments in the
ogg demuxer, parsing the comment block and attaching it as packed
AV_PKT_DATA_METADATA_UPDATE side-data.

The new metadata can then be unpacked in the corresponding decoder and properly
added to the first decoded audio frame after the comment packet.

It is worth noting that is using a mechanism specific to ogg stream that
seemed to only have been used for vorbis streams so far.

Along with the changes are new FATE tests validating the implementation.

Discussion and context:

ogg/opus is a pretty popular combination of codec and encapsulation. In
particular, it is widely used in Icecast streams, where chained streams
are the norm because of the ogg specs requirement for inserting in-band
metadata.

ogg/flac streams are pretty important because there are perhaps the only
combination of lossless audio codec and open-source container that
allows for proper transmittion of lossless audio data accross systems
such as Icecast, browser media tags and more.

In the context of long-running audio streams, the ogg bitstream specs[1]
have historically been very badly implemented. For each new track and
each new metadata, the specs require the logical bitstream to come to a
full EOF and then start with a full new logical stream.

These specs have often been confused with a gobal EOF by most
implementations.

Furtunately, FFmpeg is a little better at that in that it is able to
parse chained logical ogg bitstreams and properly output either encoded
ogg packets or decoded audio.

Current limitations with chained ogg streams in FFmpeg include:
1. Metadata from secondary chained ogg/flac and ogg/opus bitstreams are
   ignored by the demuxer/decoder.
2. Secondary chained streams packet headers are silently removed by the
   demuxer when decoding ogg/opus streams.
3. No adjustment underlying PTS or DTS: PTS and DTS of secondary chained
   streams reset from their own logical stream initial value causing
   timestamp discontinuity.
4. Chained bitstreams with more than one underlying type of content
   (audio+video, etc) is not yet supported though this is a much less needed
   feature.

The changes in this patch series address issues #1 and #2.

Future work could address the remaining issues.

Thanks,
-- Romain

[1]: https://xiph.org/ogg/doc/framing.html

Romain Beauxis (6):
  libavformat/oggparseopus.c: Parse extradata from secondary chained
    streams header packet.
  tests: Add stream dump test API util.
  libavformat/oggparseopus.c: Parse comments from secondary chained
    ogg/opus streams and pass them as ogg stream new_metadata.
  tests: Add chained ogg/opus stream dump test.
  libavformat/oggparseflac.c: Parse ogg/flac comments in new ogg
    packets, add them to ogg stream new_metadata.
  tests: Add chained ogg/flac stream dump test.

 libavcodec/flacdec.c                  |  20 ++-
 libavcodec/opus/dec.c                 |  24 ++++
 libavformat/oggdec.c                  |   4 -
 libavformat/oggparseflac.c            |  28 +++++
 libavformat/oggparseopus.c            |  25 ++++
 tests/Makefile                        |   3 +
 tests/api/Makefile                    |   2 +-
 tests/api/api-dump-stream-meta-test.c | 169 ++++++++++++++++++++++++++
 tests/fate/ogg-flac.mak               |  11 ++
 tests/fate/ogg-opus.mak               |  11 ++
 10 files changed, 291 insertions(+), 6 deletions(-)
 create mode 100644 tests/api/api-dump-stream-meta-test.c
 create mode 100644 tests/fate/ogg-flac.mak
 create mode 100644 tests/fate/ogg-opus.mak

-- 
2.39.5 (Apple Git-154)

_______________________________________________
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-02-10 19:26 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-02-10 19:25 Romain Beauxis [this message]
2025-02-10 19:25 ` [FFmpeg-devel] [PATCH v4 1/6] Pass ogg/opus secondary header packets to the Romain Beauxis
2025-02-10 19:25 ` [FFmpeg-devel] [PATCH v4 2/6] tests: Add stream dump test API util Romain Beauxis
2025-02-10 19:25 ` [FFmpeg-devel] [PATCH v4 3/6] Pass secondary ogg/opus chained streams metadata Romain Beauxis
2025-02-10 19:25 ` [FFmpeg-devel] [PATCH v4 4/6] tests: Add chained ogg/opus stream dump test Romain Beauxis
2025-02-10 19:25 ` [FFmpeg-devel] [PATCH v4 5/6] Parse secondary chained ogg/flac stream comments Romain Beauxis
2025-02-10 19:26 ` [FFmpeg-devel] [PATCH v4 6/6] tests: Add chained ogg/flac stream dump test 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=20250210192600.42502-1-romain.beauxis@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