[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