﻿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
