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 _______________________________________________ vdr mailing list vdr@xxxxxxxxxxx http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr