[vdr] Frames per second PAL vs. NTSC

Artur Skawina lis_-t.20_0.7 at poczta.multimo.pl
Mon Jan 5 13:49:39 CET 2009


Klaus Schmidinger wrote:
> On 05.01.2009 13:31, Artur Skawina wrote:
>> Klaus Schmidinger wrote:
>>> Detecting the frame rate is done by looking at the PTS values, so
>>> it is independent of the actual broadcast system.
>>>
>>> Using this code for converting frame numbers into hh:mm:ss.ff...
>>>
>>> --------------------------------------------------------
>>> #include <math.h>
>>> #include <stdio.h>
>>>
>>> int main(void)
>>> {
>>>   double FramesPerSecond = double(90000) / 3003;
>>>   //FramesPerSecond = 25;
>>>   for (int Index = 0; Index < 10000; Index++) {
>>>       double Seconds;
>>>       int f = round(modf(Index / FramesPerSecond, &Seconds) * FramesPerSecond) + 1;
>>>       int s = int(Seconds);
>>>       int m = s / 60 % 60;
>>>       int h = s / 3600;
>>>       s %= 60;
>>>       printf("%3d ", Index);
>>>       printf("%15.9f ", Index / FramesPerSecond);
>>>       printf("%d:%02d:%02d.%02d", h, m, s, f);
>>>       if (f > 30) printf(" *");
>>>       printf("\n");
>>>       }
>>> }
>>> --------------------------------------------------------
>>>
>>> ... sometimes results in a 31st frame:
>>>
>>> 9978   332.932600000 0:05:32.29
>>> 9979   332.965966667 0:05:32.30
>>> 9980   332.999333333 0:05:32.31 *
>>> 9981   333.032700000 0:05:33.02
>>> 9982   333.066066667 0:05:33.03
>>>
>>>
>>> Any ideas how to fix this?
>> eg
>>
>> - int f = round(modf(Index / FramesPerSecond, &Seconds) * FramesPerSecond) + 1;
>> + int f = round(modf(Index / FramesPerSecond, &Seconds) * FramesPerSecond + 0.5 );
>>
>> note that some 'seconds' will contain only 29 frames. (see index 510 in the original
>> and 1019 in the fixed version)
> 
> I'm afraid this isn't feasible. The '+1' is done to make the first frame
> (at Index 0) have number '1'. With your change it would be numbered '0'.
> 
> Klaus

no, try it :)

and you can also drop the round call:

- int f = round(modf(Index / FramesPerSecond, &Seconds) * FramesPerSecond) + 1;
+ int f = modf((Index + 0.5) / FramesPerSecond, &Seconds) * FramesPerSecond + 1;

which will move the 'missing' frames to the same locations as in the original.


artur



More information about the vdr mailing list