[FFmpeg-trac] #10365(avformat:new): Order of metadata in mkv changes on its own

FFmpeg trac at avcodec.org
Mon May 15 14:12:03 EEST 2023


#10365: Order of metadata in mkv changes on its own
-------------------------------------+-------------------------------------
             Reporter:  yumu         |                     Type:  defect
               Status:  new          |                 Priority:  normal
            Component:  avformat     |                  Version:  git-
             Keywords:  mkv          |  master
  matroska metadata order            |               Blocked By:
             Blocking:               |  Reproduced by developer:  0
Analyzed by developer:  0            |
-------------------------------------+-------------------------------------
 Summary of the bug:
 The order of metadata changes on its own each time mkv is processed.

 How to reproduce:
 1. Create a mkv with some metadata. (or an existing one)
 {{{
 ffmpeg -f lavfi -i smptehdbars=d=2 -f lavfi -i sine=d=2 -metadata
 artist=ARTIST -metadata comment=COMMENT -metadata date=20230101 ".mkv"
 }}}
 2. Copy
 {{{
 > ffmpeg -i ".mkv" -c copy "copied.mkv"
 ffmpeg version N-110589-g30c71ef98e-20230514 Copyright (c) 2000-2023 the
 FFmpeg developers
   built with gcc 12.2.0 (crosstool-NG 1.25.0.152_89671bf)
   configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static
 --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64
 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug
 --disable-w32threads --enable-pthreads --enable-iconv --enable-libxml2
 --enable-zlib --enable-libfreetype --enable-libfribidi --enable-gmp
 --enable-lzma --enable-fontconfig --enable-libvorbis --enable-opencl
 --disable-libpulse --enable-libvmaf --disable-libxcb --disable-xlib
 --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth
 --enable-chromaprint --enable-libdav1d --enable-libdavs2 --disable-libfdk-
 aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme
 --enable-libkvazaar --enable-libass --enable-libbluray --enable-libjxl
 --enable-libmp3lame --enable-libopus --enable-librist --enable-libssh
 --enable-libtheora --enable-libvpx --enable-libwebp --enable-lv2
 --disable-libmfx --enable-libvpl --enable-openal --enable-libopencore-
 amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg
 --enable-libopenmpt --enable-librav1e --enable-librubberband --enable-
 schannel --enable-sdl2 --enable-libsoxr --enable-libsrt --enable-libsvtav1
 --enable-libtwolame --enable-libuavs3d --disable-libdrm --disable-vaapi
 --enable-libvidstab --enable-vulkan --enable-libshaderc --enable-
 libplacebo --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-
 libxvid --enable-libzimg --enable-libzvbi --extra-
 cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-ldflags=-pthread
 --extra-ldexeflags= --extra-libs=-lgomp --extra-version=20230514
   libavutil      58.  7.100 / 58.  7.100
   libavcodec     60. 11.100 / 60. 11.100
   libavformat    60.  5.100 / 60.  5.100
   libavdevice    60.  2.100 / 60.  2.100
   libavfilter     9.  8.100 /  9.  8.100
   libswscale      7.  2.100 /  7.  2.100
   libswresample   4. 11.100 /  4. 11.100
   libpostproc    57.  2.100 / 57.  2.100
 Input #0, matroska,webm, from '.mkv':
   Metadata:
     DATE            : 20230101
     ARTIST          : ARTIST
     COMMENT         : COMMENT
     ENCODER         : Lavf60.5.100
   Duration: 00:00:02.00, start: 0.000000, bitrate: 43 kb/s
   Stream #0:0: Video: h264 (High), yuv420p(tv, bt709/unknown/unknown,
 progressive), 320x240 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 1k tbn
     Metadata:
       ENCODER         : Lavc60.11.100 libx264
       DURATION        : 00:00:02.003000000
   Stream #0:1: Audio: vorbis, 44100 Hz, mono, fltp
     Metadata:
       ENCODER         : Lavc60.11.100 libvorbis
       DURATION        : 00:00:02.003000000
 Output #0, matroska, to 'copied.mkv':
   Metadata:
     DATE            : 20230101
     ARTIST          : ARTIST
     COMMENT         : COMMENT
     encoder         : Lavf60.5.100
   Stream #0:0: Video: h264 (High) (H264 / 0x34363248), yuv420p(tv,
 bt709/unknown/unknown, progressive), 320x240 [SAR 1:1 DAR 4:3], q=2-31, 25
 fps, 25 tbr, 1k tbn
     Metadata:
       ENCODER         : Lavc60.11.100 libx264
       DURATION        : 00:00:02.003000000
   Stream #0:1: Audio: vorbis (oV[0][0] / 0x566F), 44100 Hz, mono, fltp
     Metadata:
       ENCODER         : Lavc60.11.100 libvorbis
       DURATION        : 00:00:02.003000000
 Stream mapping:
   Stream #0:0 -> #0:0 (copy)
   Stream #0:1 -> #0:1 (copy)
 Press [q] to stop, [?] for help
 [out#0/matroska @ 000001efc70c2f00] video:2kB audio:3kB subtitle:0kB other
 streams:0kB global headers:3kB muxing overhead: 85.019422%
 frame=   50 fps=0.0 q=-1.0 Lsize=      11kB time=00:00:01.99 bitrate=
 44.0kbits/s speed= 663x
 }}}

 Then the order of the metadata changes.

 For some reason, it does not change in the output of step 2, but you can
 see it in the output of ffprobe.
 in the output of ffprobe, the COMMENT tag is moved to the top, but in
 binary, the DATE tag is moved to the top and the order is from
 ARTIST,COMMENT,DATE,ENCODER to DATE,ARTIST,COMMENT,ENCODER.
 Why ffprobe's output is not in binary order is a mystery.
 {{{
 > ffprobe ".mkv"
 ffprobe version N-110589-g30c71ef98e-20230514 Copyright (c) 2007-2023 the
 FFmpeg developers
   built with gcc 12.2.0 (crosstool-NG 1.25.0.152_89671bf)
   configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static
 --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64
 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug
 --disable-w32threads --enable-pthreads --enable-iconv --enable-libxml2
 --enable-zlib --enable-libfreetype --enable-libfribidi --enable-gmp
 --enable-lzma --enable-fontconfig --enable-libvorbis --enable-opencl
 --disable-libpulse --enable-libvmaf --disable-libxcb --disable-xlib
 --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth
 --enable-chromaprint --enable-libdav1d --enable-libdavs2 --disable-libfdk-
 aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme
 --enable-libkvazaar --enable-libass --enable-libbluray --enable-libjxl
 --enable-libmp3lame --enable-libopus --enable-librist --enable-libssh
 --enable-libtheora --enable-libvpx --enable-libwebp --enable-lv2
 --disable-libmfx --enable-libvpl --enable-openal --enable-libopencore-
 amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg
 --enable-libopenmpt --enable-librav1e --enable-librubberband --enable-
 schannel --enable-sdl2 --enable-libsoxr --enable-libsrt --enable-libsvtav1
 --enable-libtwolame --enable-libuavs3d --disable-libdrm --disable-vaapi
 --enable-libvidstab --enable-vulkan --enable-libshaderc --enable-
 libplacebo --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-
 libxvid --enable-libzimg --enable-libzvbi --extra-
 cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-ldflags=-pthread
 --extra-ldexeflags= --extra-libs=-lgomp --extra-version=20230514
   libavutil      58.  7.100 / 58.  7.100
   libavcodec     60. 11.100 / 60. 11.100
   libavformat    60.  5.100 / 60.  5.100
   libavdevice    60.  2.100 / 60.  2.100
   libavfilter     9.  8.100 /  9.  8.100
   libswscale      7.  2.100 /  7.  2.100
   libswresample   4. 11.100 /  4. 11.100
   libpostproc    57.  2.100 / 57.  2.100
 Input #0, matroska,webm, from '.mkv':
   Metadata:
     DATE            : 20230101
     ARTIST          : ARTIST
     COMMENT         : COMMENT
     ENCODER         : Lavf60.5.100
   Duration: 00:00:02.00, start: 0.000000, bitrate: 43 kb/s
   Stream #0:0: Video: h264 (High), yuv420p(tv, bt709/unknown/unknown,
 progressive), 320x240 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 1k tbn
     Metadata:
       ENCODER         : Lavc60.11.100 libx264
       DURATION        : 00:00:02.003000000
   Stream #0:1: Audio: vorbis, 44100 Hz, mono, fltp
     Metadata:
       ENCODER         : Lavc60.11.100 libvorbis
       DURATION        : 00:00:02.003000000
 }}}

 {{{
 > ffprobe "copied.mkv"
 ffprobe version N-110589-g30c71ef98e-20230514 Copyright (c) 2007-2023 the
 FFmpeg developers
   built with gcc 12.2.0 (crosstool-NG 1.25.0.152_89671bf)
   configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static
 --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64
 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug
 --disable-w32threads --enable-pthreads --enable-iconv --enable-libxml2
 --enable-zlib --enable-libfreetype --enable-libfribidi --enable-gmp
 --enable-lzma --enable-fontconfig --enable-libvorbis --enable-opencl
 --disable-libpulse --enable-libvmaf --disable-libxcb --disable-xlib
 --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth
 --enable-chromaprint --enable-libdav1d --enable-libdavs2 --disable-libfdk-
 aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme
 --enable-libkvazaar --enable-libass --enable-libbluray --enable-libjxl
 --enable-libmp3lame --enable-libopus --enable-librist --enable-libssh
 --enable-libtheora --enable-libvpx --enable-libwebp --enable-lv2
 --disable-libmfx --enable-libvpl --enable-openal --enable-libopencore-
 amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg
 --enable-libopenmpt --enable-librav1e --enable-librubberband --enable-
 schannel --enable-sdl2 --enable-libsoxr --enable-libsrt --enable-libsvtav1
 --enable-libtwolame --enable-libuavs3d --disable-libdrm --disable-vaapi
 --enable-libvidstab --enable-vulkan --enable-libshaderc --enable-
 libplacebo --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-
 libxvid --enable-libzimg --enable-libzvbi --extra-
 cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-ldflags=-pthread
 --extra-ldexeflags= --extra-libs=-lgomp --extra-version=20230514
   libavutil      58.  7.100 / 58.  7.100
   libavcodec     60. 11.100 / 60. 11.100
   libavformat    60.  5.100 / 60.  5.100
   libavdevice    60.  2.100 / 60.  2.100
   libavfilter     9.  8.100 /  9.  8.100
   libswscale      7.  2.100 /  7.  2.100
   libswresample   4. 11.100 /  4. 11.100
   libpostproc    57.  2.100 / 57.  2.100
 Input #0, matroska,webm, from 'copied.mkv':
   Metadata:
     COMMENT         : COMMENT
     DATE            : 20230101
     ARTIST          : ARTIST
     ENCODER         : Lavf60.5.100
   Duration: 00:00:02.01, start: 0.000000, bitrate: 43 kb/s
   Stream #0:0: Video: h264 (High), yuv420p(tv, bt709/unknown/unknown,
 progressive), 320x240 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 1k tbn
     Metadata:
       ENCODER         : Lavc60.11.100 libx264
       DURATION        : 00:00:02.003000000
   Stream #0:1: Audio: vorbis, 44100 Hz, mono, fltp
     Metadata:
       ENCODER         : Lavc60.11.100 libvorbis
       DURATION        : 00:00:02.013000000
 }}}

 Copying copied.mkv again will change the order of the metadata.
 {{{
 > ffmpeg -i "copied.mkv" -c copy "copied2.mkv"
 ...
 > ffprobe -hide_banner "copied2.mkv"
 Input #0, matroska,webm, from 'copied2.mkv':
   Metadata:
     ARTIST          : ARTIST
     COMMENT         : COMMENT
     DATE            : 20230101
     ENCODER         : Lavf60.5.100
   Duration: 00:00:02.01, start: 0.000000, bitrate: 43 kb/s
   Stream #0:0: Video: h264 (High), yuv420p(tv, bt709/unknown/unknown,
 progressive), 320x240 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 1k tbn
     Metadata:
       ENCODER         : Lavc60.11.100 libx264
       DURATION        : 00:00:02.003000000
   Stream #0:1: Audio: vorbis, 44100 Hz, mono, fltp
     Metadata:
       ENCODER         : Lavc60.11.100 libvorbis
       DURATION        : 00:00:02.013000000
 }}}

 My ffmpeg is the Windows version downloaded from https://github.com/BtbN
 /FFmpeg-Builds/releases.

 I just want to change another place, but I don't want the metadata order
 to change on its own as well.
-- 
Ticket URL: <https://trac.ffmpeg.org/ticket/10365>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker


More information about the FFmpeg-trac mailing list