Ugly temporary hack for aspect ratio
[melted] / src / modules / sdl / consumer_sdl.c
index 39b8894..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.
@@ -162,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;
        }
@@ -173,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;
@@ -382,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
@@ -393,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:
@@ -419,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 )