[FFmpeg-cvslog] r19773 - in trunk/libavformat: seek.c seek.h

Michael Niedermayer michaelni
Fri Sep 18 02:04:08 CEST 2009


On Thu, Sep 17, 2009 at 07:33:37PM +0200, Ivan Schreter wrote:
> Hi,
>
> Michael Niedermayer wrote:
>> On Tue, Sep 15, 2009 at 02:55:30AM +0300, Uoti Urpala wrote:
>>   
>>> On Tue, 2009-09-15 at 00:22 +0200, Michael Niedermayer wrote:
>>>     
>>>> On Sun, Sep 13, 2009 at 09:30:31PM +0200, Ivan Schreter wrote:
>>>>       
>>>>> Attached is a patch that fixes it for timestamp comparison by using 
>>>>> comparison routine from NUT spec. A bit more expensive, but so what... 
>>>>> I hope it is more to your liking. OK so or any further comments?
>>>>>         
>>> What range of values is the comparison supposed to work for? The code
>>> uses 64-bit types for timestamps, but OTOH the comparison uses this
>>> function:
>>>
>>> + * Convert timestamp to different timebase.
>>> + *
>>> + * This function converts the timestamp in such a way that no numerical 
>>> overflow
>>> + * can happen. Effectively, it computes ts * tb_to / tb_from.
>>> + *
>>> + * @param ts      timestamp to convert (non-negative)
>>> + * @param tb_from source time base
>>> + * @param tb_to   destination time base
>>> + * @return timestamp in destination time base
>>> + */
>>> +static int convert_ts(uint64_t ts, AVRational tb_from, AVRational tb_to)
>>> +{
>>> +    // this algorithm is copied from NUT spec and works only for 
>>> non-negative numbers
>>> +    uint64_t ln = (uint64_t) tb_from.num * (uint64_t) tb_to.den;
>>> +    uint64_t d1 = tb_from.den;
>>> +    uint64_t d2 = tb_to.num;
>>> +    return (ln / d1 * ts + ln % d1 * ts / d1) / d2;
>>> +}
>>> [...]
>>> and it
>>> wouldn't work with a larger return type (the return statement is of the
>>> form "something/d2", so it cannot possibly correctly return anything
>>> bigger than UINT64_MAX / d2 - or about 32 bits if d2 is assumed to have
>>> full 32 bit range).
>>>     
>>
>> yes, it works only with files of about 100 years duration
>> and actually av_rescale_rnd() should be used that should work with the 
>> whole
>> 32/32*64bit range and lead to simpler code, avoiding code duplication and 
>> so on ...
>>   
>
> Uhm, I don't quite understand what you mean. Do you mean to use (public) 
> av_rescale_rnd() instead of (private) timestamp conversion code?

yes


> The code 
> in av_rescale_rnd() is potentially much slower, but works with signed 
> integers, so it would simplify the comparison code...

potentially?


>
> OTOH, the timestamp conversion code (the one stolen from NUT spec) might be 
> interesting for everyone so it possibly could be introduced to 
> mathematics.h or somewhere related...
>
> BTW, I simply assumed the formula given in NUT spec is correct, I didn't do 
> mathematic proof of that. So I hope it is correct :-)

the code works, but it seems a little typo sliped through so that 2 variables
where exchanged

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

If you really think that XML is the answer, then you definitly missunderstood
the question -- Attila Kinali
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-cvslog/attachments/20090918/63ba70e3/attachment.pgp>



More information about the ffmpeg-cvslog mailing list