[FFmpeg-trac] #10364(avformat:new): Missing metadata in chained ogg/flac streams
FFmpeg
trac at avcodec.org
Mon May 15 00:45:58 EEST 2023
#10364: Missing metadata in chained ogg/flac streams
-------------------------------------+------------------------------------
Reporter: toots | Owner: (none)
Type: enhancement | Status: new
Priority: normal | Component: avformat
Version: unspecified | Resolution:
Keywords: | Blocked By:
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
-------------------------------------+------------------------------------
Description changed by toots:
Old description:
> ''Reproduction steps for this bug are similar to
> https://trac.ffmpeg.org/ticket/10363''
>
> How to reproduce:
>
> * Create two short ogg/opus files:
>
> {{{
> ffmpeg -f lavfi -i "sine=frequency=1000:duration=5" -c:a libopus
> -metadata title="test title" /tmp/test.ogg
>
> ffmpeg -f lavfi -i "sine=frequency=1000:duration=5" -c:a libopus
> -metadata title="test title 2" /tmp/test2.ogg
> }}}
>
> * Send a stream to a icecast server
>
> Unfortunately, I couldn't find a way to send a chained ogg bitstream
> using ffmpeg CLI. It seems to always send a single stream so I used ices
> (https://icecast.org/ices/)
>
> (Doc on ogg chained bitstreams: https://xiph.org/ogg/doc/oggstream.html)
>
> {{{
> echo /tmp/test.ogg > /tmp/test.txt
> echo /tmp/test2.ogg >> /tmp/test.txt
> }}}
>
> Ices config:
> {{{
> <?xml version="1.0"?>
> <ices>
> <background>0</background>
> <consolelog>1</consolelog>
>
> <stream>
> <input>
> <module>playlist</module>
> <param name="type">basic</param>
> <param name="file">/tmp/test.m3u</param>
> <param name="once">0</param>
> </input>
>
> <instance>
> <hostname>localhost</hostname>
> <port>8000</port>
> <password>hackme</password>
> <mount>/test.ogg</mount>
> <yp>0</yp>
> </instance>
> </stream>
> </ices>
> }}}
>
> Finally: ices /tmp/ices.xml
>
> * Use the attached program to read the stream:
>
> {{{
> cc flac_chained_metadata.c -g -lavformat -lavutil -o
> flac_chained_metadata
>
> ./flac_chained_metadata http://localhost:8000/test.ogg
> }}}
>
> Output:
> {{{
> encoder=Lavc60.3.100 libopus;Lavc60.3.100 libopus;Lavc60.3.100 libopus
> title=test title
> ....
> }}}
>
> Expected:
> Title should alternate between "test title" and "test title 2"
>
> Solution: add metadata parsing in libavformat/oggparseflac.c:
> {{{
> +static int flac_packet(AVFormatContext *s, int idx)
> +{
> + struct ogg *ogg = s->priv_data;
> + struct ogg_stream *os = ogg->streams + idx;
> + int ret;
> +
> + if (os->psize > 4 && (*(os->buf + os->pstart) & 0x7F) ==
> FLAC_METADATA_TYPE_VORBIS_COMMENT) {
> + AVStream *st = s->streams[idx];
> + av_dict_free(&st->metadata);
> + ret = ff_vorbis_stream_comment(s, st, os->buf + os->pstart + 4,
> + os->psize - 4);
> +
> + if (ret < 0) return ret;
> + }
> +
> + return 0;
> +}
> +
> +
> const struct ogg_codec ff_flac_codec = {
> .magic = "\177FLAC",
> .magicsize = 5,
> .header = flac_header,
> + .packet = flac_packet,
> .nb_header = 2,
> };
> }}}
>
> Patch has been sent but needs an update which will be coming soon.
New description:
''Reproduction steps for this bug are similar to
https://trac.ffmpeg.org/ticket/10363''
How to reproduce:
* Create two short ogg/opus files:
{{{
ffmpeg -f lavfi -i "sine=frequency=1000:duration=5" -c:a flac -metadata
title="test title" /tmp/test.ogg
ffmpeg -f lavfi -i "sine=frequency=1000:duration=5" -c:a flac -metadata
title="test title 2" /tmp/test2.ogg
}}}
* Send a stream to a icecast server
Unfortunately, I couldn't find a way to send a chained ogg bitstream using
ffmpeg CLI. It seems to always send a single stream so I used ices
(https://icecast.org/ices/)
(Doc on ogg chained bitstreams: https://xiph.org/ogg/doc/oggstream.html)
{{{
echo /tmp/test.ogg > /tmp/test.txt
echo /tmp/test2.ogg >> /tmp/test.txt
}}}
Ices config:
{{{
<?xml version="1.0"?>
<ices>
<background>0</background>
<consolelog>1</consolelog>
<stream>
<input>
<module>playlist</module>
<param name="type">basic</param>
<param name="file">/tmp/test.m3u</param>
<param name="once">0</param>
</input>
<instance>
<hostname>localhost</hostname>
<port>8000</port>
<password>hackme</password>
<mount>/test.ogg</mount>
<yp>0</yp>
</instance>
</stream>
</ices>
}}}
Finally: ices /tmp/ices.xml
* Use the attached program to read the stream:
{{{
cc flac_chained_metadata.c -g -lavformat -lavutil -o flac_chained_metadata
./flac_chained_metadata http://localhost:8000/test.ogg
}}}
Output:
{{{
encoder=Lavc60.3.100 libopus;Lavc60.3.100 libopus;Lavc60.3.100 libopus
title=test title
....
}}}
Expected:
Title should alternate between "test title" and "test title 2"
Solution: add metadata parsing in libavformat/oggparseflac.c:
{{{
+static int flac_packet(AVFormatContext *s, int idx)
+{
+ struct ogg *ogg = s->priv_data;
+ struct ogg_stream *os = ogg->streams + idx;
+ int ret;
+
+ if (os->psize > 4 && (*(os->buf + os->pstart) & 0x7F) ==
FLAC_METADATA_TYPE_VORBIS_COMMENT) {
+ AVStream *st = s->streams[idx];
+ av_dict_free(&st->metadata);
+ ret = ff_vorbis_stream_comment(s, st, os->buf + os->pstart + 4,
+ os->psize - 4);
+
+ if (ret < 0) return ret;
+ }
+
+ return 0;
+}
+
+
const struct ogg_codec ff_flac_codec = {
.magic = "\177FLAC",
.magicsize = 5,
.header = flac_header,
+ .packet = flac_packet,
.nb_header = 2,
};
}}}
Patch has been sent but needs an update which will be coming soon.
--
--
Ticket URL: <https://trac.ffmpeg.org/ticket/10364#comment:1>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list