X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Fcore%2Fproducer_framebuffer.c;h=1f6a487a54fdabb093b10f14875adec4e90b2259;hb=f5166fd9533abe00f46dc8742cc23ecae9fb19fb;hp=b3cbf019b33d5a6280b20cf9fcb1743c77b9affa;hpb=0b6d1073cc02530ef10e8880c855b042b41d0bf3;p=melted diff --git a/src/modules/core/producer_framebuffer.c b/src/modules/core/producer_framebuffer.c index b3cbf01..1f6a487 100644 --- a/src/modules/core/producer_framebuffer.c +++ b/src/modules/core/producer_framebuffer.c @@ -115,27 +115,38 @@ static int framebuffer_get_frame( mlt_producer this, mlt_frame_ptr frame, int in // get properties int strobe = mlt_properties_get_int( MLT_PRODUCER_PROPERTIES (this), "strobe"); - double prod_speed = mlt_properties_get_double( properties, "_speed"); - double prod_end_speed = mlt_properties_get_double( properties, "end_speed"); - - // calculate actual speed and position - double actual_speed = prod_speed + ((double)mlt_producer_position( this ) / (double)mlt_producer_get_length(this)) * (prod_end_speed - prod_speed); - double actual_position = actual_speed * (double)mlt_producer_position( this ); - if (mlt_properties_get_int( properties, "reverse")) actual_position = mlt_producer_get_length(this) - actual_position; + double freeze = mlt_properties_get_double( MLT_PRODUCER_PROPERTIES (this), "freeze"); + int freeze_after = mlt_properties_get_int( MLT_PRODUCER_PROPERTIES (this), "freeze_after"); + int freeze_before = mlt_properties_get_int( MLT_PRODUCER_PROPERTIES (this), "freeze_before"); mlt_position need_first; - - if (strobe == 1) - { - need_first = floor( actual_position ); - } - else - { - // Strobe effect wanted, calculate frame position - need_first = floor( actual_position ); - need_first -= need_first%strobe; + if (!freeze || freeze_after || freeze_before) { + double prod_speed = mlt_properties_get_double( properties, "_speed"); + double prod_end_speed = mlt_properties_get_double( properties, "end_speed"); + + // calculate actual speed and position + double actual_speed = prod_speed + ((double)mlt_producer_position( this ) / (double)mlt_producer_get_length(this)) * (prod_end_speed - prod_speed); + double actual_position = actual_speed * (double)mlt_producer_position( this ); + if (mlt_properties_get_int( properties, "reverse")) actual_position = mlt_producer_get_length(this) - actual_position; + + if (strobe < 2) + { + need_first = floor( actual_position ); + } + else + { + // Strobe effect wanted, calculate frame position + need_first = floor( actual_position ); + need_first -= need_first%strobe; + } + if (freeze) + { + if (freeze_after && need_first > freeze) need_first = freeze; + else if (freeze_before && need_first < freeze) need_first = freeze; + } } + else need_first = freeze; if( need_first != first_position ) { @@ -176,7 +187,7 @@ static int framebuffer_get_frame( mlt_producer this, mlt_frame_ptr frame, int in mlt_producer producer_framebuffer_init( char *arg ) { mlt_producer this = mlt_producer_new( ); - fprintf( stderr, " + + ++ USING FRAMEBUFF %s\n", arg); + // Wrap fezzik mlt_producer real_producer; @@ -193,6 +204,10 @@ mlt_producer producer_framebuffer_init( char *arg ) x is the number of frames that will be ignored. * You can play the movie backwards by adding reverse=1 + + * You can freeze the clip at a determined position by adding freeze=frame_pos + add freeze_after=1 to freeze only paste position or freeze_before to freeze before it + **/ double speed;