slight mods to factory (for future module reporting); pool purge function; consumer...
[melted] / src / framework / mlt_consumer.c
index 86bed30..2837c4c 100644 (file)
@@ -268,13 +268,23 @@ static void *consumer_read_ahead_thread( void *arg )
        int skipped = 0;
        int64_t time_wait = 0;
        int64_t time_frame = 0;
-       int64_t time_image = 0;
+       int64_t time_process = 0;
+       int skip_next = 0;
 
        // Get the first frame
        frame = mlt_consumer_get_frame( this );
 
        // Get the image of the first frame
-       mlt_frame_get_image( frame, &image, &this->format, &width, &height, 0 );
+       if ( !video_off )
+               mlt_frame_get_image( frame, &image, &this->format, &width, &height, 0 );
+
+       if ( !audio_off )
+       {
+               samples = mlt_sample_calculator( fps, frequency, counter++ );
+               mlt_frame_get_audio( frame, &pcm, &afmt, &frequency, &channels, &samples );
+               frame->get_audio = NULL;
+       }
+
        mlt_properties_set_int( mlt_frame_properties( frame ), "rendered", 1 );
 
        // Get the starting time (can ignore the times above)
@@ -284,14 +294,13 @@ static void *consumer_read_ahead_thread( void *arg )
        while ( this->ahead )
        {
                // Put the current frame into the queue
-               time_difference( &ante );
                pthread_mutex_lock( &this->mutex );
                while( this->ahead && mlt_deque_count( this->queue ) >= buffer )
                        pthread_cond_wait( &this->cond, &this->mutex );
                mlt_deque_push_back( this->queue, frame );
                pthread_cond_broadcast( &this->cond );
                pthread_mutex_unlock( &this->mutex );
-               time_wait = time_difference( &ante );
+               time_wait += time_difference( &ante );
 
                // Get the next frame
                frame = mlt_consumer_get_frame( this );
@@ -305,12 +314,14 @@ static void *consumer_read_ahead_thread( void *arg )
                {
                        skipped = 0;
                        time_frame = 0;
-                       time_image = 0;
+                       time_process = 0;
+                       time_wait = 0;
                        count = 1;
+                       skip_next = 0;
                }
 
                // Get the image
-               if ( ( time_frame + time_image ) / count < 40000 )
+               if ( !skip_next )
                {
                        // Get the image, mark as rendered and time it
                        if ( !video_off )
@@ -324,14 +335,16 @@ static void *consumer_read_ahead_thread( void *arg )
                {
                        // Increment the number of sequentially skipped frames
                        skipped ++;
+                       skip_next = 0;
 
                        // If we've reached an unacceptable level, reset everything
                        if ( skipped > 10 )
                        {
                                skipped = 0;
                                time_frame = 0;
-                               time_image = 0;
-                               count = 0;
+                               time_process = 0;
+                               time_wait = 0;
+                               count = 1;
                        }
                }
 
@@ -344,7 +357,11 @@ static void *consumer_read_ahead_thread( void *arg )
                }
 
                // Increment the time take for this frame
-               time_image += time_difference( &ante );
+               time_process += time_difference( &ante );
+
+               // Determine if the next frame should be skipped
+               if ( mlt_deque_count( this->queue ) <= 5 && ( ( time_wait + time_frame + time_process ) / count ) > 40000 )
+                       skip_next = 1;
        }
 
        // Remove the last frame