]> git.sesse.net Git - mlt/blobdiff - src/framework/mlt_geometry.c
Add mlt_geometry_interpolate.
[mlt] / src / framework / mlt_geometry.c
index 89230b038023dd3fd8eaa0fba6a6dbbd77b1fdad..65bb78020550c0fa9cd7d6778844abbd63a6c18a 100644 (file)
@@ -75,7 +75,7 @@ static inline double linearstep( double start, double end, double position, int
        return start + position * o;
 }
 
-static void mlt_geometry_virtual_refresh( mlt_geometry self )
+void mlt_geometry_interpolate( mlt_geometry self )
 {
        geometry g = self->local;
 
@@ -191,7 +191,8 @@ static int mlt_geometry_drop( mlt_geometry self, geometry_item item )
 static void mlt_geometry_clean( mlt_geometry self )
 {
        geometry g = self->local;
-       free( g->data );
+       if ( g->data )
+               free( g->data );
        g->data = NULL;
        while( g->item )
                mlt_geometry_drop( self, g->item );
@@ -243,6 +244,7 @@ int mlt_geometry_parse( mlt_geometry self, char *data, int length, int nw, int n
                // Now insert into place
                mlt_geometry_insert( self, &item );
        }
+       mlt_geometry_interpolate( self );
 
        // Remove the tokeniser
        mlt_tokeniser_close( tokens );
@@ -504,9 +506,6 @@ int mlt_geometry_insert( mlt_geometry self, mlt_geometry_item item )
                g->item->data.f[4] = 1;
        }
 
-       // Refresh all geometries
-       mlt_geometry_virtual_refresh( self );
-
        // TODO: Error checking
        return 0;
 }
@@ -528,9 +527,6 @@ int mlt_geometry_remove( mlt_geometry self, int position )
        if ( place != NULL && position == place->data.frame )
                ret = mlt_geometry_drop( self, place );
 
-       // Refresh all geometries
-       mlt_geometry_virtual_refresh( self );
-
        return ret;
 }
 
@@ -570,6 +566,9 @@ int mlt_geometry_prev_key( mlt_geometry self, mlt_geometry_item item, int positi
        return place == NULL;
 }
 
+#define ISINT(x) ( (x) == (int64_t) (x) )
+#define PICKFMT(x) ( ISINT(x) ? "%.0f" : "%f" )
+
 char *mlt_geometry_serialise_cut( mlt_geometry self, int in, int out )
 {
        geometry g = self->local;
@@ -635,21 +634,26 @@ char *mlt_geometry_serialise_cut( mlt_geometry self, int in, int out )
                        if ( item.frame - in != 0 )
                                sprintf( temp, "%d=", item.frame - in );
 
-                       if ( item.f[0] ) 
-                               sprintf( temp + strlen( temp ), "%.0f", item.x );
-                       strcat( temp, "/" );
-                       if ( item.f[1] ) 
-                               sprintf( temp + strlen( temp ), "%.0f", item.y );
-                       strcat( temp, ":" );
-                       if ( item.f[2] ) 
-                               sprintf( temp + strlen( temp ), "%.0f", item.w );
-                       strcat( temp, "x" );
-                       if ( item.f[3] ) 
-                               sprintf( temp + strlen( temp ), "%.0f", item.h );
-                       if ( item.f[4] ) 
-                               sprintf( temp + strlen( temp ), ":%.0f", item.mix );
-
-                       if ( used + strlen( temp ) > size )
+                       if ( item.f[0] )
+                               sprintf( temp + strlen( temp ), PICKFMT( item.x ), item.x );
+                       if ( item.f[1] ) {
+                               strcat( temp, "/" );
+                               sprintf( temp + strlen( temp ), PICKFMT( item.y ), item.y );
+                       }
+                       if ( item.f[2] ) {
+                               strcat( temp, ":" );
+                               sprintf( temp + strlen( temp ), PICKFMT( item.w ), item.w );
+                       }
+                       if ( item.f[3] ) {
+                               strcat( temp, "x" );
+                               sprintf( temp + strlen( temp ), PICKFMT( item.h ), item.h );
+                       }
+                       if ( item.f[4] ) {
+                               strcat( temp, ":" );
+                               sprintf( temp + strlen( temp ), PICKFMT( item.mix ), item.mix );
+                       }
+
+                       if ( used + strlen( temp ) + 2 > size ) // +2 for ';' and NULL
                        {
                                size += 1000;
                                ret = realloc( ret, size );
@@ -680,7 +684,8 @@ char *mlt_geometry_serialise( mlt_geometry self )
        char *ret = mlt_geometry_serialise_cut( self, 0, g->length );
        if ( ret )
        {
-               free( g->data );
+               if ( g->data )
+                       free( g->data );
                g->data = ret;
        }
        return ret;