• Marton Balint's avatar
    avutil/timestamp: introduce av_ts_make_time_string2 for better precision · 5df901ff
    Marton Balint authored
    av_ts_make_time_string() used "%.6g" format, but this format was losing
    precision even when the timestamp to be printed was not that large. For example
    for 3 hours (10800) seconds, only 1 decimal digit was printed, which made this
    format inaccurate when it was used in e.g. the silencedetect filter. Other
    detection filters printing timestamps had similar issues. Also time base
    parameter of the function was *AVRational instead of AVRational.
    
    Resolve these problems by introducing a new function, av_ts_make_time_string2().
    
    We change the used format to "%.*f", use a precision of 6, except when printing
    values near 0, in which case we calculate the precision dynamically to aim for
    a similar precision in normal form as with %.6g.  No longer using scientific
    representation can make parsing the timestamp easier for the users, we can
    safely do this because the theoretical maximum of INT64_MAX*INT32_MAX still
    fits into the string buffer in normal form.
    
    We somewhat imitate %g by trimming ending zeroes and the potential decimal
    point characters. In order not to trim "inf" as well, we assume that the
    decimal point string does not contain the letter "f". Note that depending on
    printf %f implementation, we might trim "infinity" to "inf".
    
    Thanks for Allan Cady for bringing up this issue.
    Signed-off-by: 's avatarMarton Balint <cus@passwd.hu>
    5df901ff