]> git.sesse.net Git - mlt/commitdiff
Add mlt_geometry_interpolate.
authorDan Dennedy <dan@dennedy.org>
Tue, 16 Aug 2011 05:28:45 +0000 (22:28 -0700)
committerDan Dennedy <dan@dennedy.org>
Tue, 16 Aug 2011 05:28:45 +0000 (22:28 -0700)
This removes re-interpolation on each call to mlt_geometry_insert() to
make bulk invocations of that call faster. This also makes
mlt_geometry_parse() faster.
Also, this includes a fix to mlt_geometry_serialise() for a buffer
overflow memory corruption.

src/framework/mlt_geometry.c
src/framework/mlt_geometry.h
src/mlt++/MltGeometry.cpp
src/mlt++/MltGeometry.h
src/modules/core/transition_composite.c
src/modules/gtk2/producer_pango.c
src/modules/motion_est/filter_autotrack_rectangle.c

index 6c28ceb9c7fb80ae36f5c168c8016eb03c65f4b4..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;
 
@@ -244,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 );
@@ -505,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;
 }
@@ -529,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;
 }
 
@@ -571,7 +566,7 @@ int mlt_geometry_prev_key( mlt_geometry self, mlt_geometry_item item, int positi
        return place == NULL;
 }
 
-#define ISINT(x) ( (x) == (int) (x) )
+#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 )
@@ -658,7 +653,7 @@ char *mlt_geometry_serialise_cut( mlt_geometry self, int in, int out )
                                sprintf( temp + strlen( temp ), PICKFMT( item.mix ), item.mix );
                        }
 
-                       if ( used + strlen( temp ) > size )
+                       if ( used + strlen( temp ) + 2 > size ) // +2 for ';' and NULL
                        {
                                size += 1000;
                                ret = realloc( ret, size );
index 81201846d23e10fbae3c775c19ff51e4bc0af815..e753c67b84008e3de3e7143e2b523e32b45dbd05 100644 (file)
@@ -60,6 +60,8 @@ extern int mlt_geometry_fetch( mlt_geometry self, mlt_geometry_item item, float
 extern int mlt_geometry_insert( mlt_geometry self, mlt_geometry_item item );
 /* Remove the key at the specified position */
 extern int mlt_geometry_remove( mlt_geometry self, int position );
+/* Typically, re-interpolate after a series of insertions or removals. */
+extern void mlt_geometry_interpolate( mlt_geometry self );
 /* Get the key at the position or the next following */
 extern int mlt_geometry_next_key( mlt_geometry self, mlt_geometry_item item, int position );
 extern int mlt_geometry_prev_key( mlt_geometry self, mlt_geometry_item item, int position );
index d0333fe40fa628bce9d3f03326f426e598d8813f..7755bd86e38423f63dd648459d071aa1b8d957ab 100644 (file)
@@ -66,6 +66,11 @@ int Geometry::remove( int position )
        return mlt_geometry_remove( geometry, position );
 }
 
+void Geometry::interpolate( )
+{
+       mlt_geometry_interpolate( geometry );
+}
+
 // Get the key at the position or the next following
 int Geometry::next_key( GeometryItem &item, int position )
 {
index 7c90bd323bea9e921dead1214e8d7daa9ad4e4d6..de788208e1d585ea63d5e5f9582d08f503c6d8ac 100644 (file)
@@ -65,6 +65,7 @@ namespace Mlt
                        int insert( GeometryItem *item );
                        // Remove the key at the specified position
                        int remove( int position );
+                       void interpolate( );
                        // Get the key at the position or the next following
                        int next_key( GeometryItem &item, int position );
                        int next_key( GeometryItem *item, int position );
index 43e6e9820362512fb56c141a8599ced305d5b3a8..1f5b6fa226fd0e3fdf8d783a06113d69b10562ad 100644 (file)
@@ -156,6 +156,7 @@ static mlt_geometry transition_parse_keys( mlt_transition this, int normalised_w
                item.frame = -1;
                if ( mlt_geometry_parse_item( geometry, &item, mlt_properties_get( properties, "end" ) ) == 0 )
                        mlt_geometry_insert( geometry, &item );
+               mlt_geometry_interpolate( geometry );
        }
        
        return geometry;
index 5b6c38044f22d957d8a7b09ef0349445b990b337..0988715dcd539f24cac8d410fc607fb003d01725 100644 (file)
@@ -174,6 +174,7 @@ mlt_producer producer_pango_init( const char *filename )
                                item.frame = atoi( name );
                                mlt_geometry_insert( key_frames, &item );
                        }
+                       mlt_geometry_interpolate( key_frames );
                }
                else
                {
index b5b0022f448d4c805601449523471ed66017a02c..fc5e69becb2fa155aeafb81fbef00fc3cc91c782 100644 (file)
@@ -171,6 +171,7 @@ static int filter_get_image( mlt_frame frame, uint8_t **image, mlt_image_format
                boundry.f[3] = 1;
                boundry.f[4] = 1;
                mlt_geometry_insert(geometry, &boundry);
+               mlt_geometry_interpolate(geometry);
        }
 
        mlt_service_unlock( MLT_FILTER_SERVICE( filter ) );
@@ -234,6 +235,7 @@ static int attach_boundry_to_frame( mlt_frame frame, uint8_t **image, mlt_image_
                item.mix = 100;
 
                mlt_geometry_insert( geom, &item );
+               mlt_geometry_interpolate( geom );
                mlt_properties_set_data( filter_properties, "filter_geometry", geom, 0, (mlt_destructor)mlt_geometry_close, (mlt_serialiser)mlt_geometry_serialise );
                geometry = mlt_properties_get_data(filter_properties, "filter_geometry", NULL);
        }