[FFmpeg-devel] [PATCH] matroskadec: Improve TTA duration calculation

Paul B Mahol onemda at gmail.com
Fri Aug 16 12:24:16 CEST 2013


On 8/15/13, James Almer <jamrial at gmail.com> wrote:
> 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 at gmail.com>
> ---
>  libavformat/matroskadec.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
> index d52877c..e4b11a2 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->ctx->duration,
> track->audio.out_samplerate, AV_TIME_BASE));

Isn't time base variable thing that can be changed by muxer?

Perhaps this could be used when muxing tta files to make sure
last packet can always decode.

>          } 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;
> --
> 1.8.1.5
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>


More information about the ffmpeg-devel mailing list