src/framework/mlt_tractor.c
[melted] / src / framework / mlt_tractor.c
index ce678cf..cfbbc0e 100644 (file)
@@ -28,6 +28,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <ctype.h>
 
 /** Forward references to static methods.
 */
@@ -252,6 +253,8 @@ static void destroy_data_queue( void *arg )
 }
 
 /** Get the next frame.
+
+       TODO: This function needs to be redesigned...
 */
 
 static int producer_get_frame( mlt_producer parent, mlt_frame_ptr frame, int track )
@@ -347,9 +350,8 @@ static int producer_get_frame( mlt_producer parent, mlt_frame_ptr frame, int tra
                                        }
                                        else
                                        {
-                                               void *p = NULL;
-                                               while ( ( p = mlt_deque_pop_front( MLT_FRAME_IMAGE_STACK( temp ) ) ) != NULL )
-                                                       mlt_deque_push_back( MLT_FRAME_IMAGE_STACK( *frame ), p );
+                                               mlt_frame_push_service( *frame, temp );
+                                               mlt_frame_push_service( *frame, producer_get_image );
                                                mlt_properties_set_int( frame_properties, "meta.fx_cut", 1 );
                                        }
 
@@ -362,9 +364,8 @@ static int producer_get_frame( mlt_producer parent, mlt_frame_ptr frame, int tra
                                        }
                                        else
                                        {
-                                               void *p = NULL;
-                                               while ( ( p = mlt_deque_pop_front( MLT_FRAME_AUDIO_STACK( temp ) ) ) != NULL )
-                                                       mlt_deque_push_back( MLT_FRAME_AUDIO_STACK( *frame ), p );
+                                               mlt_frame_push_audio( *frame, temp );
+                                               mlt_frame_push_audio( *frame, producer_get_audio );
                                                mlt_properties_set_int( frame_properties, "meta.fx_cut", 1 );
                                        }
 
@@ -408,10 +409,24 @@ static int producer_get_frame( mlt_producer parent, mlt_frame_ptr frame, int tra
 
                                // Pick up first video and audio frames
                                if ( !done && !mlt_frame_is_test_audio( temp ) && !( mlt_properties_get_int( temp_properties, "hide" ) & 2 ) )
+                               {
+                                       // Order of frame creation is starting to get problematic
+                                       if ( audio != NULL )
+                                       {
+                                               mlt_deque_push_front( MLT_FRAME_AUDIO_STACK( temp ), producer_get_audio );
+                                               mlt_deque_push_front( MLT_FRAME_AUDIO_STACK( temp ), audio );
+                                       }
                                        audio = temp;
+                               }
                                if ( !done && !mlt_frame_is_test_card( temp ) && !( mlt_properties_get_int( temp_properties, "hide" ) & 1 ) )
+                               {
+                                       if ( video != NULL )
+                                       {
+                                               mlt_deque_push_front( MLT_FRAME_IMAGE_STACK( temp ), producer_get_image );
+                                               mlt_deque_push_front( MLT_FRAME_IMAGE_STACK( temp ), video );
+                                       }
                                        video = temp;
-
+                               }
                        }
        
                        // Now stack callbacks