=[SPAM?]= [Matroska-devel] Timestamp precision in matroska files]
pfk at fuchs.offl.uni-jena.de
Fri Jan 9 23:28:59 CET 2004
translation to English and an additional remark.
When you want address sample precise, you need a time base with the
preciion of the reciproce of the sample frequency. You don't need a
saveguard factor of 2 as Mr. Wiesner suggested, but you need precise
Otherwise you need a indefinite precision for the timebase (or a integral
You must also be careful with floating point because of rounding differences
depending on the order of the operations. Note that a*b/c != a/c*b.
In the case of an intergral sample rate (48000 Hz, not 44055.97376127834
Hz), you can use the following code (to avoid 96 bit int arithmetic).
WhichSample ( UINT64 timeticks, // 0...2^64-1
UINT32 timetickspersecond, // 1, 300, 1000, 1200, 48000, 192000, 10^6, 10^9
UINT32 samplefreq ) // 8000, 32000, 44100, 48000, 96000, 192000
if ( timetickspersecond == 0 )
return ERROR ;
if ( samplefreq > timetickspersecond )
fprintf ( stderr, "Inprecise\n" );
UINT32 seconds = timeticks / timetickspersecond ;
UINT32 remaining = timeticks % timetickspersecond ;
UINT64 ret ;
ret = (UINT64) remaining * samplefreq / timetickspersecond ;
ret += (UINT64) seconds * samplefreq ;
return ret ;
This code rounds down. I suggest to use this rounding control. Other
possiblities are round up, rounding to nearest integer (rounding up 0.5) or
rounding to nearest integer (rounding 0.5 to nearest even integral number).
Note that the last two are nearly identical, but they still gave different
results for some input.
More information about the Matroska-devel