From: j-b-m Date: Sat, 18 Nov 2006 14:52:44 +0000 (+0000) Subject: Fix header + add freeze feature X-Git-Url: http://research.m1stereo.tv/gitweb?a=commitdiff_plain;h=c03d5f51c714b57c599d1aa29c5acdd605cb4705;p=melted Fix header + add freeze feature git-svn-id: https://mlt.svn.sourceforge.net/svnroot/mlt/trunk/mlt@939 d19143bc-622f-0410-bfdd-b5b2a6649095 --- diff --git a/src/modules/core/producer_framebuffer.c b/src/modules/core/producer_framebuffer.c index b3cbf01..1ecf901 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 ) { @@ -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; diff --git a/src/modules/core/producer_framebuffer.h b/src/modules/core/producer_framebuffer.h index 0425b9a..d6e2ff0 100644 --- a/src/modules/core/producer_framebuffer.h +++ b/src/modules/core/producer_framebuffer.h @@ -1,7 +1,6 @@ /* - * producer_colour.h -- raster image loader based upon gdk-pixbuf - * Copyright (C) 2003-2004 Ushodaya Enterprises Limited - * Author: Dan Dennedy + * producer_framebuffer.h -- slowmotion and reverse playing + * Copyright (C) 2006 Jean-Baptiste Mardelle * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by