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.
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;
}
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;
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
while ( SDL_PollEvent( &event ) )
{
+ mlt_events_fire( this->properties, "consumer-sdl-event", &event, NULL );
+
switch( event.type )
{
case SDL_VIDEORESIZE:
}
}
- 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 )