summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2013-08-17 14:48:33 -0300
committerMichael Niedermayer <michaelni@gmx.at>2013-08-18 02:34:39 +0200
commitaf248fa1174200acb537a6ab1198bb2fed38e884 (patch)
tree182a0d6bccc641a2058d49229959cd8988e8157f /libavformat
parent02eb15a6c1b421c4b15f80630faf3f53957a5909 (diff)
matroskadec: Improve TTA duration calculation
Calculate the duration as accurately as possible to improve decoding of samples where the last frame is smaller than the rest. Example: Take lossless-audio/luckynight-partial.tak from the FATE suit and convert it to TTA muxed into matroska: ffmpeg -i $(SAMPLES)/lossless-audio/luckynight-partial.tak -c:a tta lucky.mka The framemd5 output for lucky.mka without this patch: 0, 0, 0, 46080, 184320, 7c3751ddd571d2903c3cf0ab4b3e3d0a 0, 46080, 46080, 46080, 184320, 6b70c782ba1da3f933fde2daa4f96b73 0, 92160, 92160, 46080, 184320, dcf70d89c54b9a4f0b302d4ec4fb302d 0, 138240, 138240, 46080, 184320, 48713ca38b388d2ea4abf5b86ed1226f 0, 184320, 184320, 46080, 184320, 12188a23648e7ebfb07cd6fe9197b2ea 0, 230400, 230400, 46080, 184320, 49653ab8186a5d4a044ed284671a26e0 0, 276480, 276480, 46080, 184320, 5e82c6a7fe58c7ea612c03a0a2927dd4 0, 322560, 322560, 46080, 184320, 83dc449dbd9eab5f2e8ad2b4403d6a21 0, 368640, 368640, 46080, 184320, bdd6b92c23d30978d4e802d305b0fc49 With this patch: 0, 0, 0, 46080, 184320, 7c3751ddd571d2903c3cf0ab4b3e3d0a 0, 46080, 46080, 46080, 184320, 6b70c782ba1da3f933fde2daa4f96b73 0, 92160, 92160, 46080, 184320, dcf70d89c54b9a4f0b302d4ec4fb302d 0, 138240, 138240, 46080, 184320, 48713ca38b388d2ea4abf5b86ed1226f 0, 184320, 184320, 46080, 184320, 12188a23648e7ebfb07cd6fe9197b2ea 0, 230400, 230400, 46080, 184320, 49653ab8186a5d4a044ed284671a26e0 0, 276480, 276480, 46080, 184320, 5e82c6a7fe58c7ea612c03a0a2927dd4 0, 322560, 322560, 46080, 184320, 83dc449dbd9eab5f2e8ad2b4403d6a21 0, 368640, 368640, 46080, 184320, bdd6b92c23d30978d4e802d305b0fc49 0, 414720, 414720, 4230, 16920, b50b440c5bbcecb8e9fbece643447593 The duration without this patch was calculated as 418950000000, which is bigger than uint32_t and as such stored as 2338172288. With this patch the duration is correctly calculated as 418950. Signed-off-by: James Almer <jamrial@gmail.com> Approved-by: Paul B Mahol <onemda@gmail.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/matroskadec.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index d52877ced1..b78553ea08 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -1738,7 +1738,7 @@ static int matroska_read_header(AVFormatContext *s)
avio_wl16(&b, track->audio.channels);
avio_wl16(&b, track->audio.bitdepth);
avio_wl32(&b, track->audio.out_samplerate);
- avio_wl32(&b, matroska->ctx->duration * track->audio.out_samplerate);
+ avio_wl32(&b, av_rescale((matroska->duration * matroska->time_scale), track->audio.out_samplerate, AV_TIME_BASE * 1000));
} else if (codec_id == AV_CODEC_ID_RV10 || codec_id == AV_CODEC_ID_RV20 ||
codec_id == AV_CODEC_ID_RV30 || codec_id == AV_CODEC_ID_RV40) {
extradata_offset = 26;