[vdr] Frames per second PAL vs. NTSC

Klaus Schmidinger Klaus.Schmidinger at cadsoft.de
Mon Jan 5 13:55:31 CET 2009


On 05.01.2009 13:49, Artur Skawina wrote:
> 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 :)

I did - but I just replaced 1 with 0.5 and totally missed that you have also
changed the bracketing - sorry.

> 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.

This looks good!

Thanks.
Klaus



More information about the vdr mailing list