﻿id,summary,reporter,owner,description,type,status,priority,component,version,resolution,keywords,cc,blockedby,blocking,reproduced,analyzed
10365,Order of metadata in mkv changes on its own,yumu,,"Summary of the bug:
The order of metadata changes on its own each time mkv is processed.
I think it's a mkv (matroska) problem because it didn't reproduce for avi, mov, mp4, ogg containers.

I don't think metadata should be reordered unintentionally.

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.
",defect,new,normal,avformat,git-master,,mkv matroska metadata order,,,,0,0
