src/framework/mlt_geometry.c
[melted] / src / framework / mlt_geometry.c
index 2bfbe77..87a9623 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * mlt_geometry.h -- provides the geometry API
+ * mlt_geometry.c -- provides the geometry API
  * Copyright (C) 2004-2005 Ushodaya Enterprises Limited
  * Author: Charles Yates <charles.yates@pandora.be>
  *
@@ -98,9 +98,9 @@ static void mlt_geometry_virtual_refresh( mlt_geometry this )
                                        geometry_item prev = current->prev;
                                        geometry_item next = current->next;
 
-                                       float prev_value = 0;
-                                       float next_value = 0;
-                                       float value = 0;
+                                       double prev_value = 0;
+                                       double next_value = 0;
+                                       double value = 0;
 
                                        while( prev != NULL && !prev->data.f[ i ] ) prev = prev->prev;
                                        while( next != NULL && !next->data.f[ i ] ) next = next->next;
@@ -281,7 +281,7 @@ void mlt_geometry_set_length( mlt_geometry this, int length )
        // Get the local/private structure
        geometry self = this->local;
 
-       // return the length
+       // set the length
        self->length = length;
 }
 
@@ -442,6 +442,7 @@ int mlt_geometry_fetch( mlt_geometry this, mlt_geometry_item item, float positio
        else
        {
                memset( item, 0, sizeof( struct mlt_geometry_item_s ) );
+               item->frame = position;
                item->mix = 100;
        }
 
@@ -574,6 +575,7 @@ int mlt_geometry_prev_key( mlt_geometry this, mlt_geometry_item item, int positi
 
 char *mlt_geometry_serialise_cut( mlt_geometry this, int in, int out )
 {
+       geometry self = this->local;
        struct mlt_geometry_item_s item;
        char *ret = malloc( 1000 );
        int used = 0;
@@ -602,6 +604,14 @@ char *mlt_geometry_serialise_cut( mlt_geometry this, int in, int out )
                                if ( mlt_geometry_fetch( this, &item, item.frame ) )
                                        break;
 
+                               // If the first key is larger than the current position
+                               // then do nothing here
+                               if ( self->item->data.frame > item.frame )
+                               {
+                                       item.frame ++;
+                                       continue;
+                               }
+
                                // To ensure correct seeding, ensure all values are fixed
                                item.f[0] = 1;
                                item.f[1] = 1;