X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Fsdl%2Fconsumer_sdl.c;h=dfce3d1ad10a3268192f6726af71f65e3c1a427d;hb=4c96cb2b639338d6308dd473983b9b4cbb9e27c9;hp=eee6cdd79088168c59a1b7d13e58c0791c10d108;hpb=24629fe02afcef099e19a78d838ec941d3616ab7;p=melted diff --git a/src/modules/sdl/consumer_sdl.c b/src/modules/sdl/consumer_sdl.c index eee6cdd..dfce3d1 100644 --- a/src/modules/sdl/consumer_sdl.c +++ b/src/modules/sdl/consumer_sdl.c @@ -40,6 +40,7 @@ struct consumer_sdl_s mlt_properties properties; mlt_deque queue; pthread_t thread; + int joined; int running; uint8_t audio_buffer[ 4096 * 10 ]; int audio_avail; @@ -71,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. @@ -120,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; @@ -131,7 +136,7 @@ mlt_consumer consumer_sdl_init( char *arg ) this->height = mlt_properties_get_int( this->properties, "height" ); // Default window size - this->window_width = ( float )this->height * this->display_aspect + 0.5; + this->window_width = ( float )this->height * this->display_aspect; this->window_height = this->height; } else @@ -158,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; } @@ -169,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; @@ -177,7 +191,10 @@ int consumer_start( mlt_consumer parent ) { pthread_attr_t thread_attributes; + consumer_stop( parent ); + this->running = 1; + this->joined = 0; // Allow the user to force resizing to window size if ( mlt_properties_get_int( this->properties, "resize" ) ) @@ -189,7 +206,7 @@ int consumer_start( mlt_consumer parent ) // Inherit the scheduling priority pthread_attr_init( &thread_attributes ); pthread_attr_setinheritsched( &thread_attributes, PTHREAD_INHERIT_SCHED ); - + pthread_create( &this->thread, &thread_attributes, consumer_thread, this ); } @@ -201,7 +218,7 @@ int consumer_stop( mlt_consumer parent ) // Get the actual object consumer_sdl this = parent->child; - if ( this->running ) + if ( this->joined == 0 ) { // Kill the thread and clean up this->running = 0; @@ -211,6 +228,7 @@ int consumer_stop( mlt_consumer parent ) pthread_mutex_unlock( &this->audio_mutex ); pthread_join( this->thread, NULL ); + this->joined = 1; } return 0; @@ -374,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 @@ -385,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: @@ -411,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 ) @@ -447,7 +472,7 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame ) if ( this->rect.w > this->window_width ) { this->rect.w = this->window_width; - this->rect.h = this_aspect / frame_aspect * this->window_height + 0.5; + this->rect.h = this_aspect / frame_aspect * this->window_height; } } } @@ -462,16 +487,21 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame ) else if ( this->window_height * this->display_aspect > this->window_width ) { this->rect.w = this->window_width; - this->rect.h = this->window_width / this->display_aspect + 0.5; + this->rect.h = this->window_width / this->display_aspect; } else { - this->rect.w = this->window_height * this->display_aspect + 0.5; + this->rect.w = this->window_height * this->display_aspect; this->rect.h = this->window_height; } this->rect.x = ( this->window_width - this->rect.w ) / 2; this->rect.y = ( this->window_height - this->rect.h ) / 2; + + mlt_properties_set_int( this->properties, "rect_x", this->rect.x ); + mlt_properties_set_int( this->properties, "rect_y", this->rect.y ); + mlt_properties_set_int( this->properties, "rect_w", this->rect.w ); + mlt_properties_set_int( this->properties, "rect_h", this->rect.h ); // Force an overlay recreation if ( this->sdl_overlay != NULL ) @@ -595,6 +625,8 @@ static void *video_thread( void *arg ) mlt_frame_close( next ); } + mlt_consumer_stopped( &this->parent ); + return NULL; }