X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Fsdl%2Fconsumer_sdl_preview.c;h=84a2c307c90b72335abec95a156a286d505bba98;hb=e727806e894128be3004502eee4d41537fb31c7d;hp=1bcd173f619a866aaf09195c4a35b015cb75c7a8;hpb=7cef152403bfa0ea30e4a3e102fe33bc75e508ab;p=melted diff --git a/src/modules/sdl/consumer_sdl_preview.c b/src/modules/sdl/consumer_sdl_preview.c index 1bcd173..84a2c30 100644 --- a/src/modules/sdl/consumer_sdl_preview.c +++ b/src/modules/sdl/consumer_sdl_preview.c @@ -61,9 +61,26 @@ mlt_consumer consumer_sdl_preview_init( char *arg ) { // Get the parent consumer object mlt_consumer parent = &this->parent; + + // Get the properties + mlt_properties properties = mlt_consumer_properties( parent ); + + // Get the width and height + int width = mlt_properties_get_int( properties, "width" ); + int height = mlt_properties_get_int( properties, "height" ); + + // Process actual param + if ( arg == NULL || sscanf( arg, "%dx%d", &width, &height ) == 2 ) + { + mlt_properties_set_int( properties, "width", width ); + mlt_properties_set_int( properties, "height", height ); + } + + // Create child consumers this->play = mlt_factory_consumer( "sdl", arg ); this->still = mlt_factory_consumer( "sdl_still", arg ); mlt_properties_set( mlt_consumer_properties( parent ), "real_time", "0" ); + mlt_properties_set( mlt_consumer_properties( parent ), "rescale", "nearest" ); parent->close = consumer_close; parent->start = consumer_start; parent->stop = consumer_stop; @@ -71,6 +88,8 @@ mlt_consumer consumer_sdl_preview_init( char *arg ) this->joined = 1; mlt_events_listen( mlt_consumer_properties( this->play ), this, "consumer-frame-show", ( mlt_listener )consumer_frame_show_cb ); mlt_events_listen( mlt_consumer_properties( this->still ), this, "consumer-frame-show", ( mlt_listener )consumer_frame_show_cb ); + mlt_events_listen( mlt_consumer_properties( this->play ), this, "consumer-sdl-event", ( mlt_listener )consumer_sdl_event_cb ); + mlt_events_listen( mlt_consumer_properties( this->still ), this, "consumer-sdl-event", ( mlt_listener )consumer_sdl_event_cb ); return parent; } free( this ); @@ -120,11 +139,20 @@ static int consumer_stop( mlt_consumer parent ) if ( this->joined == 0 ) { + mlt_properties properties = mlt_consumer_properties( parent ); + int app_locked = mlt_properties_get_int( properties, "app_locked" ); + void ( *lock )( void ) = mlt_properties_get_data( properties, "app_lock", NULL ); + void ( *unlock )( void ) = mlt_properties_get_data( properties, "app_unlock", NULL ); + + if ( app_locked && unlock ) unlock( ); + // Kill the thread and clean up this->running = 0; pthread_join( this->thread, NULL ); this->joined = 1; + + if ( app_locked && lock ) lock( ); } return 0; @@ -171,12 +199,17 @@ static void *consumer_thread( void *arg ) mlt_properties_set_data( still, "transport_producer", mlt_properties_get_data( properties, "transport_producer", NULL ), 0, NULL, NULL ); mlt_properties_set_data( play, "transport_callback", mlt_properties_get_data( properties, "transport_callback", NULL ), 0, NULL, NULL ); mlt_properties_set_data( still, "transport_callback", mlt_properties_get_data( properties, "transport_callback", NULL ), 0, NULL, NULL ); + mlt_properties_set_int( play, "resize", mlt_properties_get_int( properties, "resize" ) ); + mlt_properties_set_int( still, "resize", mlt_properties_get_int( properties, "resize" ) ); mlt_properties_set( play, "rescale", mlt_properties_get( properties, "rescale" ) ); mlt_properties_set( still, "rescale", mlt_properties_get( properties, "rescale" ) ); - mlt_properties_set( play, "width", mlt_properties_get( properties, "width" ) ); - mlt_properties_set( still, "width", mlt_properties_get( properties, "width" ) ); - mlt_properties_set( play, "height", mlt_properties_get( properties, "height" ) ); - mlt_properties_set( still, "height", mlt_properties_get( properties, "height" ) ); + mlt_properties_set_int( play, "width", mlt_properties_get_int( properties, "width" ) ); + mlt_properties_set_int( still, "width", mlt_properties_get_int( properties, "width" ) ); + mlt_properties_set_int( play, "height", mlt_properties_get_int( properties, "height" ) ); + mlt_properties_set_int( still, "height", mlt_properties_get_int( properties, "height" ) ); + + mlt_properties_set_int( play, "progressive", 1 ); + mlt_properties_set_int( still, "progressive", 1 ); mlt_properties_pass( play, mlt_consumer_properties( consumer ), "play." ); mlt_properties_pass( still, mlt_consumer_properties( consumer ), "still." ); @@ -204,46 +237,53 @@ static void *consumer_thread( void *arg ) // Determine which speed to use double use_speed = first ? speed : this->last_speed; - // Get changed requests to the preview + // Get changed requests to the preview (focus changes) int changed = mlt_properties_get_int( properties, "changed" ); + + // Get refresh request for the current frame (effect changes in still mode) + int refresh = mlt_properties_get_int( properties, "refresh" ); + + // Decrement refresh and clear changed + mlt_properties_set_int( properties, "refresh", refresh > 0 ? refresh - 1 : 0 ); mlt_properties_set_int( properties, "changed", 0 ); + // Set the changed property on this frame for the benefit of still + mlt_properties_set_int( mlt_frame_properties( frame ), "refresh", refresh ); + // Make sure the recipient knows that this frame isn't really rendered mlt_properties_set_int( mlt_frame_properties( frame ), "rendered", 0 ); + // If we're not the first frame and both consumers are stopped, then stop ourselves if ( !first && mlt_consumer_is_stopped( this->play ) && mlt_consumer_is_stopped( this->still ) ) { this->running = 0; mlt_frame_close( frame ); } + // Allow a little grace time before switching consumers on speed changes else if ( this->ignore_change -- > 0 && this->active != NULL && !mlt_consumer_is_stopped( this->active ) ) { mlt_consumer_put_frame( this->active, frame ); - if ( this->active == this->still ) - mlt_properties_set_int( still, "changed", changed ); + mlt_properties_set_int( still, "changed", changed ); } + // If we aren't playing normally, then use the still else if ( use_speed != 1 ) { if ( !mlt_consumer_is_stopped( this->play ) ) - { mlt_consumer_stop( this->play ); - } if ( mlt_consumer_is_stopped( this->still ) ) { this->last_speed = use_speed; this->active = this->still; - this->ignore_change = 5; mlt_consumer_start( this->still ); } mlt_properties_set_int( still, "changed", changed ); mlt_consumer_put_frame( this->still, frame ); } + // Otherwise use the normal player else { if ( !mlt_consumer_is_stopped( this->still ) ) - { mlt_consumer_stop( this->still ); - } if ( mlt_consumer_is_stopped( this->play ) ) { this->last_speed = use_speed; @@ -251,8 +291,21 @@ static void *consumer_thread( void *arg ) this->ignore_change = 25; mlt_consumer_start( this->play ); } + mlt_properties_set_int( still, "changed", changed ); mlt_consumer_put_frame( this->play, frame ); } + + // Copy the rectangle info from the active consumer + if ( this->running ) + { + mlt_properties active = mlt_consumer_properties( this->active ); + mlt_properties_set_int( properties, "rect_x", mlt_properties_get_int( active, "rect_x" ) ); + mlt_properties_set_int( properties, "rect_y", mlt_properties_get_int( active, "rect_y" ) ); + mlt_properties_set_int( properties, "rect_w", mlt_properties_get_int( active, "rect_w" ) ); + mlt_properties_set_int( properties, "rect_h", mlt_properties_get_int( active, "rect_h" ) ); + } + + // We are definitely not waiting on the first frame any more first = 0; } }