[FFmpeg-devel] [PATCH 2/3] lavf/mkvtimestamp_v2: review implementation to match mkvextract behavior

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Mon Apr 22 19:48:18 EEST 2024


Stefano Sabatini:
> On date Saturday 2024-04-20 18:47:58 +0200, Andreas Rheinhardt wrote:
>> Stefano Sabatini:
> [...]
>>>> 1. This does not match mkvextract behaviour. mkvextract does not force a
>>>> 1ms timebase.
>>>
>>> From your past comment:
>>>> The accuracy of the timestamps output by mkvextract is determined by the
>>>> TimestampScale of the file in question; it is most often 1ms when the
>>>> file has video.
>>>
>>
>> "most often" != "force"
> [...]
> 
>> (I am not certain wrt MKVToolNix handling of fractional millisecond; old
>> versions of mkvextract may really have simply rounded/truncated to
>> milliseconds.)
> 
> It doesn't, at least with version:
> $ mkvextract --version
> mkvextract v65.0.0 ('Too Much') 64-bit
> 

With old I actually meant really old. As old as this muxer.

> So far, mkvextract seems to output DTSs as in the original
> implementation - therefore no need to change implementation, but for
> the "timecode" => "timestamp" issue.
> 

What is the TimestampScale of said file? Given that we are dealing with
a video stream it is highly likely to be 1ms, so that there will be no
difference.

The following is from a 44100Hz with 4608 samples per packet and a
TimestampScale of 22674 (equivalent to a timebase of 22674/1000000000 s).

$ mkvextract fl.mka timestamps_v2 0:fl.txt
Progress: 100%
$ head -n 7 fl.txt
# timestamp format v2
0
104.489795
208.97959
313.469385
417.95918
522.448975

(The following is with the current implementation, but your suggested
patch won't change anything for it.)

$ ./ffmpeg -i fl.mka -map 0:a -c copy -f mkvtimestamp_v2 - 2>/dev/null |
head -7
# timecode format v2
0
104
209
313
418
522

$ ./ffprobe -hide_banner fl.mka -of csv=nk=1:p=0 -select_streams a:0
-show_entries packet=pts 2>/dev/null | head -n 6
0
4608
9216
13824
18433
23041

$ ./ffprobe -hide_banner fl.mka -of csv=nk=1:p=0 -select_streams a:0
-show_entries packet=pts_time 2>/dev/null | head -n 6
0.000000
0.104482
0.208964
0.313445
0.417950
0.522432

(The slight differences here with mkvextract is due to lacing:
mkvextract calculates the timestamps of the non-leading packets in a
lace with the default duration and uses nanosecond precision for this.)

> $ ./ffprobe -hide_banner slow.mkv -of csv=nk=1:p=0 -select_streams v:0 -show_entries packet=pts  | head -n 20 
> [...]
> 0
> 1201
> 1235
> 1268
> 1368
> 1301
> 1335
> 1401
> 1435
> 1535
> 1468
> 1502
> 1602
> 1568
> 1735
> 1668
> 1635
> 1702
> 1768
> 1869
> 
> $ ./ffprobe -hide_banner slow.mkv -of csv=nk=1:p=0 -select_streams v:0 -show_entries packet=dts  | head -n 20 
> N/A
> N/A
> 0
> 1201
> 1235
> 1268
> 1301
> 1335
> 1368
> 1401
> 1435
> 1468
> 1502
> 1535
> 1568
> 1602
> 1635
> 1668
> 1702
> 1735
> 
> $ mkvextract slow.mkv timestamps_v2 0:slow.mkv.out
> Progress: 100%
> $ head -n 21 slow.mkv.out 
> # timestamp format v2
> 0
> 1201
> 1235
> 1268
> 1301
> 1335
> 1368
> 1401
> 1435
> 1468
> 1502
> 1535
> 1568
> 1602
> 1635
> 1668
> 1702
> 1735
> 1768
> 1802



More information about the ffmpeg-devel mailing list