Ugly temporary hack for aspect ratio
[melted] / src / modules / sdl / consumer_sdl.c
index 06171b9..dfce3d1 100644 (file)
@@ -72,6 +72,7 @@ static int consumer_is_stopped( mlt_consumer parent );
 static void consumer_close( mlt_consumer parent );
 static void *consumer_thread( void * );
 static int consumer_get_dimensions( int *width, int *height );
+static void consumer_sdl_event( mlt_listener listener, mlt_properties owner, mlt_service this, void **args );
 
 /** This is what will be called by the factory - anything can be passed in
        via the argument, but keep it simple.
@@ -121,6 +122,9 @@ mlt_consumer consumer_sdl_init( char *arg )
 
                // Get sample aspect ratio
                this->aspect_ratio = mlt_properties_get_double( this->properties, "aspect_ratio" );
+
+               // Ensure we don't join on a non-running object
+               this->joined = 1;
                
                // Default display aspect ratio
                this->display_aspect = 4.0 / 3.0;
@@ -159,6 +163,9 @@ mlt_consumer consumer_sdl_init( char *arg )
                parent->stop = consumer_stop;
                parent->is_stopped = consumer_is_stopped;
 
+               // Register specific events
+               mlt_events_register( this->properties, "consumer-sdl-event", ( mlt_transmitter )consumer_sdl_event );
+
                // Return the consumer produced
                return parent;
        }
@@ -170,6 +177,12 @@ mlt_consumer consumer_sdl_init( char *arg )
        return NULL;
 }
 
+static void consumer_sdl_event( mlt_listener listener, mlt_properties owner, mlt_service this, void **args )
+{
+       if ( listener != NULL )
+               listener( owner, this, ( SDL_Event * )args[ 0 ] );
+}
+
 int consumer_start( mlt_consumer parent )
 {
        consumer_sdl this = parent->child;
@@ -178,6 +191,8 @@ int consumer_start( mlt_consumer parent )
        {
                pthread_attr_t thread_attributes;
                
+               consumer_stop( parent );
+
                this->running = 1;
                this->joined = 0;
 
@@ -377,6 +392,7 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame )
        if ( mlt_properties_get_int( properties, "video_off" ) == 0 )
        {
                // Get the image, width and height
+               mlt_events_fire( properties, "consumer-frame-show", frame, NULL );
                mlt_frame_get_image( frame, &image, &vfmt, &width, &height, 0 );
                
                // Handle events
@@ -388,6 +404,8 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame )
        
                        while ( SDL_PollEvent( &event ) )
                        {
+                               mlt_events_fire( this->properties, "consumer-sdl-event", &event, NULL );
+
                                switch( event.type )
                                {
                                        case SDL_VIDEORESIZE:
@@ -414,12 +432,16 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame )
                        }
                }
        
-               if ( width != this->width || height != this->height || this->last_frame_aspect != mlt_frame_get_aspect_ratio( frame ) )
+               if ( width != this->width || height != this->height || 
+                        ( int )( this->last_frame_aspect * 1000 ) != ( int )( mlt_frame_get_aspect_ratio( frame ) * 1000 ) )
                {
-                       this->width = width;
-                       this->height = height;
-                       this->last_frame_aspect = mlt_frame_get_aspect_ratio( frame );
-                       changed = 1;
+                       if ( mlt_frame_get_aspect_ratio( frame ) != 1.0 || this->last_frame_aspect == 0.0 )
+                       {
+                               this->width = width;
+                               this->height = height;
+                               this->last_frame_aspect = mlt_frame_get_aspect_ratio( frame );
+                               changed = 1;
+                       }
                }
 
                if ( this->sdl_screen == NULL || changed )