mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
avformat/matroskaenc: Actually apply timestamp offset for Opus
Matroska generally requires timestamps to be nonnegative, but there is an exception: Data that corresponds to encoder delay and is not supposed to be output anyway can have a negative timestamp. This is achieved by using the CodecDelay header field: The demuxer has to subtract this value from the raw (nonnegative) timestamps of the corresponding track. Therefore the muxer has to add this value first to write this raw timestamp. Support for writing CodecDelay has been added in FFmpeg commitd92b1b1bab
and in Libav commita1aa37dd0b
. The former simply wrote the header field and did not apply any timestamp offsets, leading to desynchronisation (if one uses multiple tracks). The latter applied it at two places, but not at the one where it actually matters, namely in mkv_write_block(), leading to the same desynchronisation as with the former commit. It furthermore used the wrong stream timebase to convert the delay to the stream's timebase, as the conversion used the timebase from before avpriv_set_pts_info(). When the latter was merged in82e4f39883
, it was only done in a deactivated state that still did not offset the timestamps when muxing due to "assertion failures and av sync errors".a1aa37dd0b
made it definitely more likely to run into assertion failures (namely if the relative block timestamp doesn't fit into an int16_t). Yet all of the above issues have been fixed (in commits962d631573
,5d3953a5dc
and4ebeab15b0
. This commit therefore enables applying CodecDelay, fixing ticket #7182. There is just one slight regression from this: If one has input with encoder delay where the first timestamp is negative, but the pts of the part of the data that is actually intended to be output is nonnegative, then the timestamps will currently by default be shifted to make them nonnegative before they reach the muxer; the muxer will then ensure that the shifted timestamps are retained. Before this commit, the muxer did not ensure this; instead the timestamps that the demuxer will output were shifted and if the first timestamp of the actually intended output was zero before shifting, then this unintentional shift just cancels the shift performed before the packet reached the muxer. (But notice that this only applies if all the tracks use the same CodecDelay, or the relative sync between tracks will be impaired.) This happens in the matroska-opus-remux and matroska-ogg-opus-remux FATE tests. Future commits will forward the information that the Matroska muxer has a limited capability to handle negative timestamps so that the shifting in libavformat can take advantage of it. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
parent
be0a2515ab
commit
eb325324aa
@ -1836,11 +1836,11 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv,
|
||||
av_log(s, AV_LOG_ERROR, "Initial padding is invalid\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
// track->ts_offset = av_rescale_q(par->initial_padding,
|
||||
// (AVRational){ 1, par->sample_rate },
|
||||
// st->time_base);
|
||||
|
||||
put_ebml_uint(pb, MATROSKA_ID_CODECDELAY, codecdelay);
|
||||
|
||||
track->ts_offset = av_rescale_q(par->initial_padding,
|
||||
(AVRational){ 1, par->sample_rate },
|
||||
st->time_base);
|
||||
}
|
||||
if (par->codec_id == AV_CODEC_ID_OPUS)
|
||||
put_ebml_uint(pb, MATROSKA_ID_SEEKPREROLL, OPUS_SEEK_PREROLL);
|
||||
|
@ -1,4 +1,4 @@
|
||||
a3f98769fe55bc5234cf75fb1949749a *tests/data/fate/matroska-ogg-opus-remux.matroska
|
||||
47b6b69c2ffdf5729557e90c72d241e9 *tests/data/fate/matroska-ogg-opus-remux.matroska
|
||||
10200 tests/data/fate/matroska-ogg-opus-remux.matroska
|
||||
#extradata 0: 19, 0x399c0471
|
||||
#tb 0: 1/1000
|
||||
@ -6,54 +6,54 @@ a3f98769fe55bc5234cf75fb1949749a *tests/data/fate/matroska-ogg-opus-remux.matros
|
||||
#codec_id 0: opus
|
||||
#sample_rate 0: 48000
|
||||
#channel_layout_name 0: stereo
|
||||
0, -7, -7, 20, 402, 0x89b1c40f
|
||||
0, 13, 13, 20, 216, 0x7bf97146
|
||||
0, 33, 33, 20, 215, 0x6cb86d8b
|
||||
0, 53, 53, 20, 218, 0x9cfd691c
|
||||
0, 73, 73, 20, 218, 0xd7fe6a94
|
||||
0, 93, 93, 20, 194, 0x35735de6
|
||||
0, 113, 113, 20, 216, 0x3ee6705a
|
||||
0, 133, 133, 20, 218, 0x67eb6cb1
|
||||
0, 153, 153, 20, 218, 0x32d0700d
|
||||
0, 173, 173, 20, 219, 0xcb7f6c60
|
||||
0, 193, 193, 20, 218, 0x9c866b33
|
||||
0, 213, 213, 20, 217, 0xfe3e6a53
|
||||
0, 233, 233, 20, 218, 0x13586833
|
||||
0, 253, 253, 20, 222, 0xbcb2669e
|
||||
0, 273, 273, 20, 218, 0x8dfc6e33
|
||||
0, 293, 293, 20, 217, 0xf5957051
|
||||
0, 313, 313, 20, 210, 0xed126e6b
|
||||
0, 333, 333, 20, 216, 0xbf947249
|
||||
0, 353, 353, 20, 203, 0x6c7e680a
|
||||
0, 373, 373, 20, 209, 0xf78f6af4
|
||||
0, 393, 393, 20, 217, 0xd60c684d
|
||||
0, 413, 413, 20, 218, 0x89056a7a
|
||||
0, 433, 433, 20, 219, 0x0bc674ad
|
||||
0, 453, 453, 20, 217, 0xb1d86d1a
|
||||
0, 473, 473, 20, 220, 0x433d685a
|
||||
0, 493, 493, 20, 364, 0x0c88be84
|
||||
0, 513, 513, 20, 221, 0x804a733d
|
||||
0, 533, 533, 20, 215, 0x6e9d6e9b
|
||||
0, 553, 553, 20, 215, 0x63016a83
|
||||
0, 573, 573, 20, 218, 0xf9a46fbe
|
||||
0, 593, 593, 20, 216, 0xa0d66c08
|
||||
0, 613, 613, 20, 216, 0xa2ca6d0a
|
||||
0, 633, 633, 20, 216, 0xf50e6f1d
|
||||
0, 653, 653, 20, 215, 0x6aaa70b6
|
||||
0, 673, 673, 20, 219, 0x7ceb6ba0
|
||||
0, 693, 693, 20, 220, 0x398d6ca9
|
||||
0, 713, 713, 20, 218, 0x7bd06ed5
|
||||
0, 733, 733, 20, 219, 0xe2906c62
|
||||
0, 753, 753, 20, 217, 0xcf316ba1
|
||||
0, 773, 773, 20, 217, 0x470b6eea
|
||||
0, 793, 793, 20, 359, 0x36c2a18a, S=1, 10
|
||||
0, 0, 0, 20, 402, 0x89b1c40f
|
||||
0, 20, 20, 20, 216, 0x7bf97146
|
||||
0, 40, 40, 20, 215, 0x6cb86d8b
|
||||
0, 60, 60, 20, 218, 0x9cfd691c
|
||||
0, 80, 80, 20, 218, 0xd7fe6a94
|
||||
0, 100, 100, 20, 194, 0x35735de6
|
||||
0, 120, 120, 20, 216, 0x3ee6705a
|
||||
0, 140, 140, 20, 218, 0x67eb6cb1
|
||||
0, 160, 160, 20, 218, 0x32d0700d
|
||||
0, 180, 180, 20, 219, 0xcb7f6c60
|
||||
0, 200, 200, 20, 218, 0x9c866b33
|
||||
0, 220, 220, 20, 217, 0xfe3e6a53
|
||||
0, 240, 240, 20, 218, 0x13586833
|
||||
0, 260, 260, 20, 222, 0xbcb2669e
|
||||
0, 280, 280, 20, 218, 0x8dfc6e33
|
||||
0, 300, 300, 20, 217, 0xf5957051
|
||||
0, 320, 320, 20, 210, 0xed126e6b
|
||||
0, 340, 340, 20, 216, 0xbf947249
|
||||
0, 360, 360, 20, 203, 0x6c7e680a
|
||||
0, 380, 380, 20, 209, 0xf78f6af4
|
||||
0, 400, 400, 20, 217, 0xd60c684d
|
||||
0, 420, 420, 20, 218, 0x89056a7a
|
||||
0, 440, 440, 20, 219, 0x0bc674ad
|
||||
0, 460, 460, 20, 217, 0xb1d86d1a
|
||||
0, 480, 480, 20, 220, 0x433d685a
|
||||
0, 500, 500, 20, 364, 0x0c88be84
|
||||
0, 520, 520, 20, 221, 0x804a733d
|
||||
0, 540, 540, 20, 215, 0x6e9d6e9b
|
||||
0, 560, 560, 20, 215, 0x63016a83
|
||||
0, 580, 580, 20, 218, 0xf9a46fbe
|
||||
0, 600, 600, 20, 216, 0xa0d66c08
|
||||
0, 620, 620, 20, 216, 0xa2ca6d0a
|
||||
0, 640, 640, 20, 216, 0xf50e6f1d
|
||||
0, 660, 660, 20, 215, 0x6aaa70b6
|
||||
0, 680, 680, 20, 219, 0x7ceb6ba0
|
||||
0, 700, 700, 20, 220, 0x398d6ca9
|
||||
0, 720, 720, 20, 218, 0x7bd06ed5
|
||||
0, 740, 740, 20, 219, 0xe2906c62
|
||||
0, 760, 760, 20, 217, 0xcf316ba1
|
||||
0, 780, 780, 20, 217, 0x470b6eea
|
||||
0, 800, 800, 20, 359, 0x36c2a18a, S=1, 10
|
||||
[PACKET]
|
||||
codec_type=audio
|
||||
stream_index=0
|
||||
pts=-7
|
||||
pts_time=-0.007000
|
||||
dts=-7
|
||||
dts_time=-0.007000
|
||||
pts=0
|
||||
pts_time=0.000000
|
||||
dts=0
|
||||
dts_time=0.000000
|
||||
duration=20
|
||||
duration_time=0.020000
|
||||
size=402
|
||||
@ -63,10 +63,10 @@ flags=K_
|
||||
[PACKET]
|
||||
codec_type=audio
|
||||
stream_index=0
|
||||
pts=13
|
||||
pts_time=0.013000
|
||||
dts=13
|
||||
dts_time=0.013000
|
||||
pts=20
|
||||
pts_time=0.020000
|
||||
dts=20
|
||||
dts_time=0.020000
|
||||
duration=20
|
||||
duration_time=0.020000
|
||||
size=216
|
||||
@ -76,10 +76,10 @@ flags=K_
|
||||
[PACKET]
|
||||
codec_type=audio
|
||||
stream_index=0
|
||||
pts=33
|
||||
pts_time=0.033000
|
||||
dts=33
|
||||
dts_time=0.033000
|
||||
pts=40
|
||||
pts_time=0.040000
|
||||
dts=40
|
||||
dts_time=0.040000
|
||||
duration=20
|
||||
duration_time=0.020000
|
||||
size=215
|
||||
|
@ -1,4 +1,4 @@
|
||||
551e45142f0989b281e837a3a86f0218 *tests/data/fate/matroska-opus-remux.matroska
|
||||
2ab987ba7bad94b27fae427cdff57723 *tests/data/fate/matroska-opus-remux.matroska
|
||||
9355 tests/data/fate/matroska-opus-remux.matroska
|
||||
#extradata 0: 19, 0x3a04048f
|
||||
#tb 0: 1/1000
|
||||
@ -6,65 +6,65 @@
|
||||
#codec_id 0: opus
|
||||
#sample_rate 0: 48000
|
||||
#channel_layout_name 0: mono
|
||||
0, -7, -7, 20, 320, 0x58b9a88d
|
||||
0, 14, 14, 20, 159, 0x6c9c4b4c
|
||||
0, 34, 34, 20, 148, 0x0caf4b5d
|
||||
0, 54, 54, 20, 139, 0xc5624226
|
||||
0, 74, 74, 20, 146, 0x633c4937
|
||||
0, 94, 94, 20, 153, 0x3d0b4f93
|
||||
0, 114, 114, 20, 158, 0xe5c55641
|
||||
0, 134, 134, 20, 156, 0xf2fd50ef
|
||||
0, 154, 154, 20, 158, 0x93b15410
|
||||
0, 174, 174, 20, 157, 0xb6f74f5f
|
||||
0, 194, 194, 20, 159, 0x9aff4957
|
||||
0, 214, 214, 20, 153, 0xfc5f4aba
|
||||
0, 234, 234, 20, 158, 0x01e44f70
|
||||
0, 254, 254, 20, 153, 0x227149cf
|
||||
0, 274, 274, 20, 155, 0x312f4cf6
|
||||
0, 294, 294, 20, 155, 0xafc54bae
|
||||
0, 314, 314, 20, 151, 0x7b4252b3
|
||||
0, 334, 334, 20, 155, 0x29074a75
|
||||
0, 354, 354, 20, 149, 0x82c44bcd
|
||||
0, 374, 374, 20, 150, 0x55c24eb5
|
||||
0, 394, 394, 20, 156, 0xf71d4f33
|
||||
0, 414, 414, 20, 153, 0x9b6c4ae5
|
||||
0, 434, 434, 20, 156, 0x75954e51
|
||||
0, 454, 454, 20, 155, 0x28ff4ff3
|
||||
0, 474, 474, 20, 153, 0xc4424969
|
||||
0, 494, 494, 20, 154, 0xfbf94cc8
|
||||
0, 514, 514, 20, 155, 0x52c549af
|
||||
0, 534, 534, 20, 150, 0x6f1e4b7a
|
||||
0, 554, 554, 20, 158, 0xabb45566
|
||||
0, 574, 574, 20, 157, 0xe61d4a99
|
||||
0, 594, 594, 20, 159, 0xf45d4fac
|
||||
0, 614, 614, 20, 159, 0xcd0553a5
|
||||
0, 634, 634, 20, 156, 0xdb244e63
|
||||
0, 654, 654, 20, 154, 0x78654c52
|
||||
0, 674, 674, 20, 154, 0x9f804cc8
|
||||
0, 694, 694, 20, 150, 0x1fdf4c80
|
||||
0, 714, 714, 20, 155, 0x1adc4f89
|
||||
0, 734, 734, 20, 155, 0x4b53511c
|
||||
0, 754, 754, 20, 151, 0x8ff2546d
|
||||
0, 774, 774, 20, 158, 0xb7e34f1b
|
||||
0, 794, 794, 20, 154, 0x4d98474b
|
||||
0, 814, 814, 20, 154, 0x14924ea8
|
||||
0, 834, 834, 20, 153, 0x8d4752bf
|
||||
0, 854, 854, 20, 149, 0x74785066
|
||||
0, 874, 874, 20, 151, 0x36c94a4c
|
||||
0, 894, 894, 20, 155, 0x82904f3b
|
||||
0, 914, 914, 20, 154, 0xd76b4a45
|
||||
0, 934, 934, 20, 159, 0x9fec548d
|
||||
0, 954, 954, 20, 154, 0x9a084dcd
|
||||
0, 974, 974, 20, 155, 0x90a54ac8
|
||||
0, 994, 994, 20, 324, 0x8e34a2f5
|
||||
0, 1014, 1014, 20, 268, 0x10f37203, S=1, 10
|
||||
0, 0, 0, 20, 320, 0x58b9a88d
|
||||
0, 21, 21, 20, 159, 0x6c9c4b4c
|
||||
0, 41, 41, 20, 148, 0x0caf4b5d
|
||||
0, 61, 61, 20, 139, 0xc5624226
|
||||
0, 81, 81, 20, 146, 0x633c4937
|
||||
0, 101, 101, 20, 153, 0x3d0b4f93
|
||||
0, 121, 121, 20, 158, 0xe5c55641
|
||||
0, 141, 141, 20, 156, 0xf2fd50ef
|
||||
0, 161, 161, 20, 158, 0x93b15410
|
||||
0, 181, 181, 20, 157, 0xb6f74f5f
|
||||
0, 201, 201, 20, 159, 0x9aff4957
|
||||
0, 221, 221, 20, 153, 0xfc5f4aba
|
||||
0, 241, 241, 20, 158, 0x01e44f70
|
||||
0, 261, 261, 20, 153, 0x227149cf
|
||||
0, 281, 281, 20, 155, 0x312f4cf6
|
||||
0, 301, 301, 20, 155, 0xafc54bae
|
||||
0, 321, 321, 20, 151, 0x7b4252b3
|
||||
0, 341, 341, 20, 155, 0x29074a75
|
||||
0, 361, 361, 20, 149, 0x82c44bcd
|
||||
0, 381, 381, 20, 150, 0x55c24eb5
|
||||
0, 401, 401, 20, 156, 0xf71d4f33
|
||||
0, 421, 421, 20, 153, 0x9b6c4ae5
|
||||
0, 441, 441, 20, 156, 0x75954e51
|
||||
0, 461, 461, 20, 155, 0x28ff4ff3
|
||||
0, 481, 481, 20, 153, 0xc4424969
|
||||
0, 501, 501, 20, 154, 0xfbf94cc8
|
||||
0, 521, 521, 20, 155, 0x52c549af
|
||||
0, 541, 541, 20, 150, 0x6f1e4b7a
|
||||
0, 561, 561, 20, 158, 0xabb45566
|
||||
0, 581, 581, 20, 157, 0xe61d4a99
|
||||
0, 601, 601, 20, 159, 0xf45d4fac
|
||||
0, 621, 621, 20, 159, 0xcd0553a5
|
||||
0, 641, 641, 20, 156, 0xdb244e63
|
||||
0, 661, 661, 20, 154, 0x78654c52
|
||||
0, 681, 681, 20, 154, 0x9f804cc8
|
||||
0, 701, 701, 20, 150, 0x1fdf4c80
|
||||
0, 721, 721, 20, 155, 0x1adc4f89
|
||||
0, 741, 741, 20, 155, 0x4b53511c
|
||||
0, 761, 761, 20, 151, 0x8ff2546d
|
||||
0, 781, 781, 20, 158, 0xb7e34f1b
|
||||
0, 801, 801, 20, 154, 0x4d98474b
|
||||
0, 821, 821, 20, 154, 0x14924ea8
|
||||
0, 841, 841, 20, 153, 0x8d4752bf
|
||||
0, 861, 861, 20, 149, 0x74785066
|
||||
0, 881, 881, 20, 151, 0x36c94a4c
|
||||
0, 901, 901, 20, 155, 0x82904f3b
|
||||
0, 921, 921, 20, 154, 0xd76b4a45
|
||||
0, 941, 941, 20, 159, 0x9fec548d
|
||||
0, 961, 961, 20, 154, 0x9a084dcd
|
||||
0, 981, 981, 20, 155, 0x90a54ac8
|
||||
0, 1001, 1001, 20, 324, 0x8e34a2f5
|
||||
0, 1021, 1021, 20, 268, 0x10f37203, S=1, 10
|
||||
[PACKET]
|
||||
codec_type=audio
|
||||
stream_index=0
|
||||
pts=-7
|
||||
pts_time=-0.007000
|
||||
dts=-7
|
||||
dts_time=-0.007000
|
||||
pts=0
|
||||
pts_time=0.000000
|
||||
dts=0
|
||||
dts_time=0.000000
|
||||
duration=20
|
||||
duration_time=0.020000
|
||||
size=320
|
||||
@ -74,10 +74,10 @@ flags=K_
|
||||
[PACKET]
|
||||
codec_type=audio
|
||||
stream_index=0
|
||||
pts=14
|
||||
pts_time=0.014000
|
||||
dts=14
|
||||
dts_time=0.014000
|
||||
pts=21
|
||||
pts_time=0.021000
|
||||
dts=21
|
||||
dts_time=0.021000
|
||||
duration=20
|
||||
duration_time=0.020000
|
||||
size=159
|
||||
@ -87,10 +87,10 @@ flags=K_
|
||||
[PACKET]
|
||||
codec_type=audio
|
||||
stream_index=0
|
||||
pts=34
|
||||
pts_time=0.034000
|
||||
dts=34
|
||||
dts_time=0.034000
|
||||
pts=41
|
||||
pts_time=0.041000
|
||||
dts=41
|
||||
dts_time=0.041000
|
||||
duration=20
|
||||
duration_time=0.020000
|
||||
size=148
|
||||
|
Loading…
Reference in New Issue
Block a user