+ Bug Fix: Removes a memory leak on last alpha channel
[melted] / src / modules / sdl / consumer_sdl.c
index 2d46db0..5879187 100644 (file)
@@ -246,7 +246,12 @@ int consumer_stop( mlt_consumer parent )
                this->sdl_overlay = NULL;
 
                if ( !mlt_properties_get_int( MLT_CONSUMER_PROPERTIES( parent ), "audio_off" ) )
+               {
+                       pthread_mutex_lock( &this->audio_mutex );
+                       pthread_cond_broadcast( &this->audio_cond );
+                       pthread_mutex_unlock( &this->audio_mutex );
                        SDL_QuitSubSystem( SDL_INIT_AUDIO );
+               }
 
                if ( mlt_properties_get_int( MLT_CONSUMER_PROPERTIES( parent ), "sdl_started" ) == 0 )
                        SDL_Quit( );
@@ -534,6 +539,7 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame )
                        
                        this->rect.x = ( this->window_width - this->rect.w ) / 2;
                        this->rect.y = ( this->window_height - this->rect.h ) / 2;
+                       this->rect.x -= this->rect.x % 2;
 
                        mlt_properties_set_int( this->properties, "rect_x", this->rect.x );
                        mlt_properties_set_int( this->properties, "rect_y", this->rect.y );
@@ -677,6 +683,10 @@ static void *consumer_thread( void *arg )
        // Get the consumer
        mlt_consumer consumer = &this->parent;
 
+       // Convenience functionality
+       int terminate_on_pause = mlt_properties_get_int( MLT_CONSUMER_PROPERTIES( consumer ), "terminate_on_pause" );
+       int terminated = 0;
+
        // Video thread
        pthread_t thread;
 
@@ -690,11 +700,15 @@ static void *consumer_thread( void *arg )
        struct timespec tm = { 0, 100000 };
 
        // Loop until told not to
-       while( this->running )
+       while( !terminated && this->running )
        {
                // Get a frame from the attached producer
                frame = mlt_consumer_rt_frame( consumer );
 
+               // Check for termination
+               if ( terminate_on_pause && frame != NULL )
+                       terminated = mlt_properties_get_double( MLT_FRAME_PROPERTIES( frame ), "_speed" ) == 0.0;
+
                // Ensure that we have a frame
                if ( frame != NULL )
                {
@@ -731,6 +745,8 @@ static void *consumer_thread( void *arg )
                }
        }
 
+       this->running = 0;
+
        // Kill the video thread
        if ( init_video == 0 )
        {