diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am index ed81d9a5b..56dff6cef 100644 --- a/src/lib/Makefile.am +++ b/src/lib/Makefile.am @@ -29,5 +29,6 @@ libcin3_a_SOURCES = \ noinst_HEADERS += \ $(libcin3_a_srcdir)/plugin.h \ $(libcin3_a_srcdir)/error.h \ - $(libcin3_a_srcdir)/time.h + $(libcin3_a_srcdir)/time.h \ + $(libcin3_a_srcdir)/framerate.h diff --git a/src/lib/framerate.h b/src/lib/framerate.h index f7f075f91..ef3561f87 100644 --- a/src/lib/framerate.h +++ b/src/lib/framerate.h @@ -27,7 +27,7 @@ /** * framerates are defined as a rational number - * for example NTSC with 29.97fps is {2997, 100} + * for example NTSC with 30000/1001fps */ struct cinelerra_framerate_struct { @@ -68,7 +68,7 @@ cinelerra_framerate_time_get_time_frame (const CinelerraFramerate framerate, REQUIRE (frame>0); TODO ("if(!time).."); - unsigned long long usec = (frame-1) * (framerate->d * 1000000ULL) / framerate->n; + unsigned long long usec = ((frame-1) * framerate->d * 1000000ULL - (/*magic*/frame>1?1:0)) / framerate->n; time->tv_sec = usec / 1000000; time->tv_usec = usec % 1000000; diff --git a/tests/10timefunctions.tests b/tests/10timefunctions.tests index fe4603e0a..835e1a918 100644 --- a/tests/10timefunctions.tests +++ b/tests/10timefunctions.tests @@ -69,16 +69,6 @@ TEST "time to frame NTSC frame 3 begin" ntscframefromtime 0 66733 <time->frame conversion 2" ntscframecheck 2 <time->frame conversion 3" ntscframecheck 3 <time->frame conversion 4" ntscframecheck 4 <time->frame conversion 5" ntscframecheck 5 <time->frame conversion 6" ntscframecheck 6 <time->frame conversion 7" ntscframecheck 7 <time->frame conversion 8" ntscframecheck 8 <time->frame conversion 9" ntscframecheck 9 <time->frame conversion 100000" ntscframecheck 100000 <time->frame conversion 999999" ntscframecheck 999999 < #include "lib/time.h" -#include "lib/frames.h" +#include "lib/framerate.h" CINELERRA_ERROR_DEFINE(TEST, "test error"); @@ -101,7 +101,7 @@ main (int argc, char** argv) if (!strcmp(argv[1], "ntscframefromtime")) { - cinelerra_framerate ntsc = {2997, 100}; + cinelerra_framerate ntsc = {30000, 1001}; cinelerra_time time; cinelerra_time_init (&time, atol (argv[2]), atol (argv[3])); @@ -111,7 +111,7 @@ main (int argc, char** argv) if (!strcmp(argv[1], "ntscframestart")) { - cinelerra_framerate ntsc = {2997, 100}; + cinelerra_framerate ntsc = {30000, 1001}; cinelerra_time time; cinelerra_framerate_time_get_time_frame (&ntsc, &time, atol (argv[2])); @@ -119,6 +119,28 @@ main (int argc, char** argv) printf ("%lu %lu\n", (long)cinelerra_time_sec(&time), (long)cinelerra_time_usec(&time)); } + if (!strcmp(argv[1], "ntscframecheck")) + { + cinelerra_framerate ntsc = {30000, 1001}; + cinelerra_time time1; + cinelerra_time time2; + cinelerra_framepos frame; + + cinelerra_framepos frame1; + cinelerra_framepos frame2; + + frame = atol (argv[2]); + + + cinelerra_framerate_time_get_time_frame (&ntsc, &time1, frame); + printf("frame %lu ", frame1 = cinelerra_framerate_frame_get_time (&ntsc, &time1)); + + cinelerra_time_init (&time2, 0, 1); + cinelerra_time_sub (&time1, &time2); + printf("%lu\n", frame2 = cinelerra_framerate_frame_get_time (&ntsc, &time1)); + + ENSURE (frame1 == frame2+1); + } return 0; }