#11559: Vorbis Comment fields renamed ---------------------------------------+---------------------------------- Reporter: Timon Martins | Type: defect Status: new | Priority: normal Component: avformat | Version: 7.1 Keywords: ogg opus flac | Blocked By: Blocking: | Reproduced by developer: 0 Analyzed by developer: 0 | ---------------------------------------+---------------------------------- Summary of the bug: When writing metadata to an opus file and afterwards reading that same metadata, the field names do not match. Note how it says `description` in the output of the second command, but `comment` in the output of the third.
How to reproduce: {{{ $ ffprobe -show_entries stream_tags little-metadata.opus 2> /dev/null [STREAM] TAG:language=eng TAG:encoder=Lavf61.7.100 [/STREAM] $ ffmpeg -i little-metadata.opus -map 0 -c copy -metadata "description=A good description" more-metadata.opus ffmpeg version 7.1.1 Copyright (c) 2000-2025 the FFmpeg developers built with Apple clang version 15.0.0 (clang-1500.1.0.2.5) configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/7.1.1_2 --enable- shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags='-Wl,-ld_classic' --enable-ffplay --enable-gnutls --enable- gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable- libdav1d --enable-libharfbuzz --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable- libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable- libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable- libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable- libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable- libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-audiotoolbox --enable-neon libavutil 59. 39.100 / 59. 39.100 libavcodec 61. 19.101 / 61. 19.101 libavformat 61. 7.100 / 61. 7.100 libavdevice 61. 3.100 / 61. 3.100 libavfilter 10. 4.100 / 10. 4.100 libswscale 8. 3.100 / 8. 3.100 libswresample 5. 3.100 / 5. 3.100 libpostproc 58. 3.100 / 58. 3.100 Input #0, ogg, from 'little-metadata.opus': Duration: 00:03:31.71, start: 0.007500, bitrate: 119 kb/s Stream #0:0(eng): Audio: opus, 48000 Hz, stereo, fltp Metadata: encoder : Lavf61.7.100 Stream mapping: Stream #0:0 -> #0:0 (copy) Output #0, opus, to 'more-metadata.opus': Metadata: description : A good description encoder : Lavf61.7.100 Stream #0:0(eng): Audio: opus, 48000 Hz, stereo, fltp Metadata: encoder : Lavf61.7.100 description : A good description Press [q] to stop, [?] for help [out#0/opus @ 0x600001c9c240] video:0KiB audio:3068KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: 0.833101% size= 3093KiB time=00:03:31.69 bitrate= 119.7kbits/s speed=7.67e+03x $ ffprobe -show_entries stream_tags more-metadata.opus 2> /dev/null [STREAM] TAG:language=eng TAG:encoder=Lavf61.7.100 TAG:comment=A good description [/STREAM] }}} File info: {{{ $ ffmpeg -v 9 -loglevel 99 -i little-metadata.opus ffmpeg version 7.1.1 Copyright (c) 2000-2025 the FFmpeg developers built with Apple clang version 15.0.0 (clang-1500.1.0.2.5) configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/7.1.1_2 --enable- shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags='-Wl,-ld_classic' --enable-ffplay --enable-gnutls --enable- gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable- libdav1d --enable-libharfbuzz --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable- libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable- libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable- libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable- libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable- libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-audiotoolbox --enable-neon libavutil 59. 39.100 / 59. 39.100 libavcodec 61. 19.101 / 61. 19.101 libavformat 61. 7.100 / 61. 7.100 libavdevice 61. 3.100 / 61. 3.100 libavfilter 10. 4.100 / 10. 4.100 libswscale 8. 3.100 / 8. 3.100 libswresample 5. 3.100 / 5. 3.100 libpostproc 58. 3.100 / 58. 3.100 Splitting the commandline. Reading option '-v' ... matched as option 'v' (set logging level) with argument '9'. Reading option '-loglevel' ... matched as option 'loglevel' (set logging level) with argument '99'. Reading option '-i' ... matched as input url with argument 'little- metadata.opus'. Finished splitting the commandline. Parsing a group of options: global . Applying option v (set logging level) with argument 9. Successfully parsed a group of options. Parsing a group of options: input url little-metadata.opus. Successfully parsed a group of options. Opening an input file: little-metadata.opus. [AVFormatContext @ 0x1566054a0] Opening 'little-metadata.opus' for reading [file @ 0x600000ece400] Setting default whitelist 'file,crypto,data' Probing mp3 score:1 size:2048 Probing ogg score:100 size:2048 [ogg @ 0x1566054a0] Format ogg probed with size=2048 and score=100 [ogg @ 0x1566054a0] ogg_packet: curidx=-1 [ogg @ 0x1566054a0] ogg_packet: idx=0 pstart=0 psize=0 segp=0 nsegs=1 [ogg @ 0x1566054a0] ogg_packet: curidx=-1 [ogg @ 0x1566054a0] ogg_packet: idx=0 pstart=19 psize=0 segp=0 nsegs=1 [ogg @ 0x1566054a0] ogg_packet: curidx=-1 [ogg @ 0x1566054a0] ogg_packet: idx=0 pstart=87 psize=0 segp=0 nsegs=71 [ogg @ 0x1566054a0] found headers [ogg @ 0x1566054a0] ogg_packet: curidx=-1 [ogg @ 0x1566054a0] ogg_packet: idx=0 pstart=0 psize=0 segp=0 nsegs=71 [ogg @ 0x1566054a0] Before avformat_find_stream_info() pos: 9179 bytes read:130843 seeks:3 nb_streams:1 For transform of length 120, inverse, mdct_float, flags: [aligned, out_of_place], found 5 matches: 1: mdct_pfa_15xM_inv_float_c - type: mdct_float, len: [30, ∞], factors[2]: [15, any], flags: [unaligned, out_of_place, inv_only], prio: 304 2: mdct_pfa_5xM_inv_float_c - type: mdct_float, len: [10, ∞], factors[2]: [5, any], flags: [unaligned, out_of_place, inv_only], prio: 144 3: mdct_pfa_3xM_inv_float_c - type: mdct_float, len: [6, ∞], factors[2]: [3, any], flags: [unaligned, out_of_place, inv_only], prio: 112 4: mdct_inv_float_c - type: mdct_float, len: [2, ∞], factors[2]: [2, any], flags: [unaligned, out_of_place, inv_only], prio: 96 5: mdct_naive_inv_float_c - type: mdct_float, len: [2, ∞], factors[2]: [2, any], flags: [unaligned, out_of_place, inv_only], prio: -130976 For transform of length 4, inverse, fft_float, flags: [aligned, inplace, preshuf], found 2 matches: 1: fft4_fwd_float_neon - type: fft_float, len: 4, factor: 2, flags: [aligned, inplace, out_of_place, preshuf], prio: 352 2: fft4_ns_float_c - type: fft_float, len: 4, factor: 2, flags: [unaligned, inplace, out_of_place, preshuf], prio: 96 Transform tree: mdct_pfa_15xM_inv_float_c - type: mdct_float, len: 120, factors[2]: [15, any], flags: [unaligned, out_of_place, inv_only] fft4_fwd_float_neon - type: fft_float, len: 4, factor: 2, flags: [aligned, inplace, out_of_place, preshuf] For transform of length 240, inverse, mdct_float, flags: [aligned, out_of_place], found 5 matches: 1: mdct_pfa_15xM_inv_float_c - type: mdct_float, len: [30, ∞], factors[2]: [15, any], flags: [unaligned, out_of_place, inv_only], prio: 304 2: mdct_pfa_5xM_inv_float_c - type: mdct_float, len: [10, ∞], factors[2]: [5, any], flags: [unaligned, out_of_place, inv_only], prio: 144 3: mdct_pfa_3xM_inv_float_c - type: mdct_float, len: [6, ∞], factors[2]: [3, any], flags: [unaligned, out_of_place, inv_only], prio: 112 4: mdct_inv_float_c - type: mdct_float, len: [2, ∞], factors[2]: [2, any], flags: [unaligned, out_of_place, inv_only], prio: 96 5: mdct_naive_inv_float_c - type: mdct_float, len: [2, ∞], factors[2]: [2, any], flags: [unaligned, out_of_place, inv_only], prio: -130976 For transform of length 8, inverse, fft_float, flags: [aligned, inplace, preshuf], found 3 matches: 1: fft8_ns_float_neon - type: fft_float, len: 8, factor: 2, flags: [aligned, inplace, out_of_place, preshuf], prio: 352 2: fft_pfa_ns_float_c - type: fft_float, len: [6, ∞], factors[2]: [7, 5, 3, 2, any], flags: [unaligned, inplace, out_of_place, preshuf], prio: 112 3: fft8_ns_float_c - type: fft_float, len: 8, factor: 2, flags: [unaligned, inplace, out_of_place, preshuf], prio: 96 Transform tree: mdct_pfa_15xM_inv_float_c - type: mdct_float, len: 240, factors[2]: [15, any], flags: [unaligned, out_of_place, inv_only] fft8_ns_float_neon - type: fft_float, len: 8, factor: 2, flags: [aligned, inplace, out_of_place, preshuf] For transform of length 480, inverse, mdct_float, flags: [aligned, out_of_place], found 5 matches: 1: mdct_pfa_15xM_inv_float_c - type: mdct_float, len: [30, ∞], factors[2]: [15, any], flags: [unaligned, out_of_place, inv_only], prio: 304 2: mdct_pfa_5xM_inv_float_c - type: mdct_float, len: [10, ∞], factors[2]: [5, any], flags: [unaligned, out_of_place, inv_only], prio: 144 3: mdct_pfa_3xM_inv_float_c - type: mdct_float, len: [6, ∞], factors[2]: [3, any], flags: [unaligned, out_of_place, inv_only], prio: 112 4: mdct_inv_float_c - type: mdct_float, len: [2, ∞], factors[2]: [2, any], flags: [unaligned, out_of_place, inv_only], prio: 96 5: mdct_naive_inv_float_c - type: mdct_float, len: [2, ∞], factors[2]: [2, any], flags: [unaligned, out_of_place, inv_only], prio: -130976 For transform of length 16, inverse, fft_float, flags: [aligned, inplace, preshuf], found 3 matches: 1: fft16_ns_float_neon - type: fft_float, len: 16, factor: 2, flags: [aligned, inplace, out_of_place, preshuf], prio: 352 2: fft_pfa_ns_float_c - type: fft_float, len: [6, ∞], factors[2]: [7, 5, 3, 2, any], flags: [unaligned, inplace, out_of_place, preshuf], prio: 112 3: fft16_ns_float_c - type: fft_float, len: 16, factor: 2, flags: [unaligned, inplace, out_of_place, preshuf], prio: 96 Transform tree: mdct_pfa_15xM_inv_float_c - type: mdct_float, len: 480, factors[2]: [15, any], flags: [unaligned, out_of_place, inv_only] fft16_ns_float_neon - type: fft_float, len: 16, factor: 2, flags: [aligned, inplace, out_of_place, preshuf] For transform of length 960, inverse, mdct_float, flags: [aligned, out_of_place], found 5 matches: 1: mdct_pfa_15xM_inv_float_c - type: mdct_float, len: [30, ∞], factors[2]: [15, any], flags: [unaligned, out_of_place, inv_only], prio: 304 2: mdct_pfa_5xM_inv_float_c - type: mdct_float, len: [10, ∞], factors[2]: [5, any], flags: [unaligned, out_of_place, inv_only], prio: 144 3: mdct_pfa_3xM_inv_float_c - type: mdct_float, len: [6, ∞], factors[2]: [3, any], flags: [unaligned, out_of_place, inv_only], prio: 112 4: mdct_inv_float_c - type: mdct_float, len: [2, ∞], factors[2]: [2, any], flags: [unaligned, out_of_place, inv_only], prio: 96 5: mdct_naive_inv_float_c - type: mdct_float, len: [2, ∞], factors[2]: [2, any], flags: [unaligned, out_of_place, inv_only], prio: -130976 For transform of length 32, inverse, fft_float, flags: [aligned, inplace, preshuf], found 3 matches: 1: fft32_ns_float_neon - type: fft_float, len: 32, factor: 2, flags: [aligned, inplace, out_of_place, preshuf], prio: 352 2: fft_pfa_ns_float_c - type: fft_float, len: [6, ∞], factors[2]: [7, 5, 3, 2, any], flags: [unaligned, inplace, out_of_place, preshuf], prio: 112 3: fft32_ns_float_c - type: fft_float, len: 32, factor: 2, flags: [unaligned, inplace, out_of_place, preshuf], prio: 96 Transform tree: mdct_pfa_15xM_inv_float_c - type: mdct_float, len: 960, factors[2]: [15, any], flags: [unaligned, out_of_place, inv_only] fft32_ns_float_neon - type: fft_float, len: 32, factor: 2, flags: [aligned, inplace, out_of_place, preshuf] [ogg @ 0x1566054a0] ogg_packet: curidx=0 [ogg @ 0x1566054a0] ogg_packet: idx=0 pstart=87 psize=0 segp=0 nsegs=71 [opus @ 0x157804080] skip 312 / discard 0 samples due to side data [opus @ 0x157804080] skip 312/960 samples [ogg @ 0x1566054a0] All info found [ogg @ 0x1566054a0] stream 0: start_time: 0.0075 duration: 211.7075 [ogg @ 0x1566054a0] format: start_time: 0.0075 duration: 211.7075 (estimate from stream) bitrate=119 kb/s [ogg @ 0x1566054a0] After avformat_find_stream_info() pos: 9179 bytes read:130843 seeks:3 frames:1 Input #0, ogg, from 'little-metadata.opus': Duration: 00:03:31.71, start: 0.007500, bitrate: 119 kb/s Stream #0:0(eng), 1, 1/48000: Audio: opus, 48000 Hz, stereo, fltp, delay 312 Metadata: encoder : Lavf61.7.100 Successfully opened the file. Correcting start time of Input #0 by 9223372036854768307 us. At least one output file must be specified [AVIOContext @ 0x1567041f0] Statistics: 130843 bytes read, 3 seeks }}} I think I traced down why: This boils down to some field names being changed according to `ff_vorbiscomment_metadata_conv` (`libavformat/vorbiscomment.c`). If I understand the uses in `ogg_write_vorbiscomment` (`libavformat/oggenc.c`) and `ff_vorbis_comment` (`libavformat/oggparsevorbis.c`) correctly, during encoding the field name `comment` becomes `DESCRIPTION` and during decoding `DESCRIPTION` becomes `comment` again. When looking at the code, the same should happen for flac. This would mean that at least in the actual `more-metadata.opus` file the fields have the correct name. Unfortunately I wasn't able to find a flag to disable this nor any documentation about this conversion and would therefore call it at least unintuitive if not misleading. I think the conversion during encoding to be fine, since it converts towards a standard. But I would expect `ffprobe` to show me what is written in a file and this makes it impossible to know the actual field name. -- Ticket URL: <https://trac.ffmpeg.org/ticket/11559> FFmpeg <https://ffmpeg.org> FFmpeg issue tracker
_______________________________________________ FFmpeg-trac mailing list FFmpeg-trac@avcodec.org https://ffmpeg.org/mailman/listinfo/ffmpeg-trac To unsubscribe, visit link above, or email ffmpeg-trac-requ...@ffmpeg.org with subject "unsubscribe".