[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