return start + position * o;
}
-static void mlt_geometry_virtual_refresh( mlt_geometry self )
+void mlt_geometry_interpolate( mlt_geometry self )
{
geometry g = self->local;
// Now insert into place
mlt_geometry_insert( self, &item );
}
+ mlt_geometry_interpolate( self );
// Remove the tokeniser
mlt_tokeniser_close( tokens );
g->item->data.f[4] = 1;
}
- // Refresh all geometries
- mlt_geometry_virtual_refresh( self );
-
// TODO: Error checking
return 0;
}
if ( place != NULL && position == place->data.frame )
ret = mlt_geometry_drop( self, place );
- // Refresh all geometries
- mlt_geometry_virtual_refresh( self );
-
return ret;
}
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 )
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 );
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 );
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 )
{
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 );
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;
item.frame = atoi( name );
mlt_geometry_insert( key_frames, &item );
}
+ mlt_geometry_interpolate( key_frames );
}
else
{
boundry.f[3] = 1;
boundry.f[4] = 1;
mlt_geometry_insert(geometry, &boundry);
+ mlt_geometry_interpolate(geometry);
}
mlt_service_unlock( MLT_FILTER_SERVICE( filter ) );
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);
}