From 7abf52c63a1ad0acd2c3b2e490c768e112480e63 Mon Sep 17 00:00:00 2001 From: lilo_booter Date: Mon, 29 Aug 2005 14:20:40 +0000 Subject: [PATCH] src/modules/sdl/consumer_sdl.c src/modules/sdl/consumer_sdl_preview.c src/modules/sdl/consumer_sdl_still.c + Corrections to preview mode switching git-svn-id: https://mlt.svn.sourceforge.net/svnroot/mlt/trunk/mlt@818 d19143bc-622f-0410-bfdd-b5b2a6649095 --- src/modules/sdl/consumer_sdl.c | 32 +++-------- src/modules/sdl/consumer_sdl_preview.c | 95 ++++++++++++++++--------------- src/modules/sdl/consumer_sdl_still.c | 14 +--- 3 files changed, 61 insertions(+), 80 deletions(-) diff --git a/src/modules/sdl/consumer_sdl.c b/src/modules/sdl/consumer_sdl.c index 46a6e16..844a055 100644 --- a/src/modules/sdl/consumer_sdl.c +++ b/src/modules/sdl/consumer_sdl.c @@ -195,11 +195,7 @@ int consumer_start( mlt_consumer parent ) else { if ( SDL_GetVideoSurface( ) != NULL ) - { this->sdl_screen = SDL_GetVideoSurface( ); - consumer_get_dimensions( &this->window_width, &this->window_height ); - mlt_properties_set_int( this->properties, "changed", 0 ); - } } if ( !mlt_properties_get_int( MLT_CONSUMER_PROPERTIES( parent ), "audio_off" ) ) @@ -411,7 +407,9 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame ) { SDL_Event event; + sdl_lock_display( ); changed = consumer_get_dimensions( &this->window_width, &this->window_height ); + sdl_unlock_display( ); while ( SDL_PollEvent( &event ) ) { @@ -443,6 +441,8 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame ) } } + sdl_lock_display(); + if ( width != this->width || height != this->height ) { if ( this->sdl_overlay != NULL ) @@ -458,21 +458,9 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame ) this->sdl_overlay = NULL; // open SDL window with video overlay, if possible - sdl_lock_display(); this->sdl_screen = SDL_SetVideoMode( this->window_width, this->window_height, this->bpp, this->sdl_flags ); - sdl_unlock_display(); if ( consumer_get_dimensions( &this->window_width, &this->window_height ) ) this->sdl_screen = SDL_SetVideoMode( this->window_width, this->window_height, this->bpp, this->sdl_flags ); - //SDL_Flip( this->sdl_screen ); - mlt_properties_set_int( properties, "changed", 0 ); - } - else if ( mlt_properties_get_int( properties, "changed" ) ) - { - sdl_lock_display(); - this->sdl_screen = SDL_SetVideoMode( this->window_width, this->window_height, this->bpp, this->sdl_flags ); - SDL_SetClipRect( this->sdl_screen, &this->rect ); - sdl_unlock_display(); - mlt_properties_set_int( properties, "changed", 0 ); } if ( this->running ) @@ -536,16 +524,12 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame ) if ( this->running && this->sdl_screen != NULL && this->sdl_overlay == NULL ) { SDL_SetClipRect( this->sdl_screen, &this->rect ); - SDL_Flip( this->sdl_screen ); - sdl_lock_display(); this->sdl_overlay = SDL_CreateYUVOverlay( width, height, SDL_YUY2_OVERLAY, this->sdl_screen ); - sdl_unlock_display(); } if ( this->running && this->sdl_screen != NULL && this->sdl_overlay != NULL ) { this->buffer = this->sdl_overlay->pixels[ 0 ]; - sdl_lock_display(); if ( SDL_LockYUVOverlay( this->sdl_overlay ) >= 0 ) { if ( image != NULL ) @@ -553,8 +537,9 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame ) SDL_UnlockYUVOverlay( this->sdl_overlay ); SDL_DisplayYUVOverlay( this->sdl_overlay, &this->sdl_screen->clip_rect ); } - sdl_unlock_display(); } + + sdl_unlock_display(); } return 0; @@ -729,7 +714,6 @@ static void *consumer_thread( void *arg ) mlt_frame_close( mlt_deque_pop_back( this->queue ) ); this->sdl_screen = NULL; - this->sdl_overlay = NULL; this->audio_avail = 0; return NULL; @@ -746,7 +730,7 @@ static int consumer_get_dimensions( int *width, int *height ) SDL_VERSION( &wm.version ); // Lock the display - sdl_lock_display(); + //sdl_lock_display(); #ifndef __DARWIN__ // Get the wm structure @@ -776,7 +760,7 @@ static int consumer_get_dimensions( int *width, int *height ) #endif // Unlock the display - sdl_unlock_display(); + //sdl_unlock_display(); return changed; } diff --git a/src/modules/sdl/consumer_sdl_preview.c b/src/modules/sdl/consumer_sdl_preview.c index 3de41db..fb96d6a 100644 --- a/src/modules/sdl/consumer_sdl_preview.c +++ b/src/modules/sdl/consumer_sdl_preview.c @@ -135,9 +135,14 @@ static int consumer_start( mlt_consumer parent ) if ( !this->running ) { + // properties mlt_properties properties = MLT_CONSUMER_PROPERTIES( parent ); + mlt_properties play = MLT_CONSUMER_PROPERTIES( this->play ); + mlt_properties still = MLT_CONSUMER_PROPERTIES( this->still ); + char *window_id = mlt_properties_get( properties, "window_id" ); char *audio_driver = mlt_properties_get( properties, "audio_driver" ); + int progressive = mlt_properties_get_int( properties, "progressive" ) | mlt_properties_get_int( properties, "deinterlace" ); consumer_stop( parent ); @@ -160,7 +165,47 @@ static int consumer_start( mlt_consumer parent ) SDL_EnableKeyRepeat( SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL ); SDL_EnableUNICODE( 1 ); - //mlt_consumer_start( this->still ); + // Pass properties down + mlt_properties_set_data( play, "transport_producer", mlt_properties_get_data( properties, "transport_producer", NULL ), 0, NULL, NULL ); + 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_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_double( play, "aspect_ratio", mlt_properties_get_double( properties, "aspect_ratio" ) ); + mlt_properties_set_double( still, "aspect_ratio", mlt_properties_get_double( properties, "aspect_ratio" ) ); + mlt_properties_set_double( play, "display_ratio", mlt_properties_get_double( properties, "display_ratio" ) ); + mlt_properties_set_double( still, "display_ratio", mlt_properties_get_double( properties, "display_ratio" ) ); + + mlt_properties_set_int( play, "progressive", progressive ); + mlt_properties_set_int( still, "progressive", progressive ); + mlt_properties_set( play, "deinterlace_method", mlt_properties_get( properties, "deinterlace_method" ) ); + mlt_properties_set( still, "deinterlace_method", mlt_properties_get( properties, "deinterlace_method" ) ); + + mlt_properties_pass( play, properties, "play." ); + mlt_properties_pass( still, properties, "still." ); + + mlt_properties_set_data( play, "app_lock", mlt_properties_get_data( properties, "app_lock", NULL ), 0, NULL, NULL ); + mlt_properties_set_data( still, "app_lock", mlt_properties_get_data( properties, "app_lock", NULL ), 0, NULL, NULL ); + mlt_properties_set_data( play, "app_unlock", mlt_properties_get_data( properties, "app_unlock", NULL ), 0, NULL, NULL ); + mlt_properties_set_data( still, "app_unlock", mlt_properties_get_data( properties, "app_unlock", NULL ), 0, NULL, NULL ); + + mlt_properties_set_int( play, "put_mode", 1 ); + mlt_properties_set_int( still, "put_mode", 1 ); + + // Start the still producer just to initialise the gui + mlt_consumer_start( this->still ); + this->active = this->still; + + // Inform child consumers that we control the sdl + mlt_properties_set_int( play, "sdl_started", 1 ); + mlt_properties_set_int( still, "sdl_started", 1 ); pthread_create( &this->thread, NULL, consumer_thread, this ); } @@ -214,56 +259,14 @@ static void *consumer_thread( void *arg ) // Get the consumer mlt_consumer consumer = &this->parent; + // Get the properties + mlt_properties properties = MLT_CONSUMER_PROPERTIES( consumer ); + // internal intialization int first = 1; mlt_frame frame = NULL; int last_position = -1; - // properties - mlt_properties properties = MLT_CONSUMER_PROPERTIES( consumer ); - mlt_properties play = MLT_CONSUMER_PROPERTIES( this->play ); - mlt_properties still = MLT_CONSUMER_PROPERTIES( this->still ); - - int progressive = mlt_properties_get_int( properties, "progressive" ) | mlt_properties_get_int( properties, "deinterlace" ); - - // Inform child consumers that we control the sdl - mlt_properties_set_int( play, "sdl_started", 1 ); - mlt_properties_set_int( still, "sdl_started", 1 ); - - // Pass properties down - mlt_properties_set_data( play, "transport_producer", mlt_properties_get_data( properties, "transport_producer", NULL ), 0, NULL, NULL ); - 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_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_double( play, "aspect_ratio", mlt_properties_get_double( properties, "aspect_ratio" ) ); - mlt_properties_set_double( still, "aspect_ratio", mlt_properties_get_double( properties, "aspect_ratio" ) ); - mlt_properties_set_double( play, "display_ratio", mlt_properties_get_double( properties, "display_ratio" ) ); - mlt_properties_set_double( still, "display_ratio", mlt_properties_get_double( properties, "display_ratio" ) ); - - mlt_properties_set_int( play, "progressive", progressive ); - mlt_properties_set_int( still, "progressive", progressive ); - mlt_properties_set( play, "deinterlace_method", mlt_properties_get( properties, "deinterlace_method" ) ); - mlt_properties_set( still, "deinterlace_method", mlt_properties_get( properties, "deinterlace_method" ) ); - - mlt_properties_pass( play, MLT_CONSUMER_PROPERTIES( consumer ), "play." ); - mlt_properties_pass( still, MLT_CONSUMER_PROPERTIES( consumer ), "still." ); - - mlt_properties_set_data( play, "app_lock", mlt_properties_get_data( properties, "app_lock", NULL ), 0, NULL, NULL ); - mlt_properties_set_data( still, "app_lock", mlt_properties_get_data( properties, "app_lock", NULL ), 0, NULL, NULL ); - mlt_properties_set_data( play, "app_unlock", mlt_properties_get_data( properties, "app_unlock", NULL ), 0, NULL, NULL ); - mlt_properties_set_data( still, "app_unlock", mlt_properties_get_data( properties, "app_unlock", NULL ), 0, NULL, NULL ); - - mlt_properties_set_int( play, "put_mode", 1 ); - mlt_properties_set_int( still, "put_mode", 1 ); - this->refresh_count = 0; // Loop until told not to diff --git a/src/modules/sdl/consumer_sdl_still.c b/src/modules/sdl/consumer_sdl_still.c index b5fc4f3..c55d0e2 100644 --- a/src/modules/sdl/consumer_sdl_still.c +++ b/src/modules/sdl/consumer_sdl_still.c @@ -117,9 +117,7 @@ mlt_consumer consumer_sdl_still_init( char *arg ) this->window_height = this->height; // Set the sdl flags - //this->sdl_flags = SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_HWACCEL | SDL_RESIZABLE | SDL_DOUBLEBUF; - // Experimental settings - this->sdl_flags = SDL_RESIZABLE | SDL_DOUBLEBUF; + this->sdl_flags = SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_HWACCEL | SDL_RESIZABLE | SDL_DOUBLEBUF; // Allow thread to be started/stopped parent->start = consumer_start; @@ -188,16 +186,15 @@ static int consumer_start( mlt_consumer parent ) } else { - mlt_properties_set_int( MLT_CONSUMER_PROPERTIES( parent ), "changed", 2 ); if ( SDL_GetVideoSurface( ) != NULL ) { this->sdl_screen = SDL_GetVideoSurface( ); consumer_get_dimensions( &this->window_width, &this->window_height ); - mlt_properties_set_int( MLT_CONSUMER_PROPERTIES( parent ), "changed", 0 ); } } - this->sdl_screen = SDL_SetVideoMode( this->window_width, this->window_height, 0, this->sdl_flags ); + if ( this->sdl_screen != NULL ) + this->sdl_screen = SDL_SetVideoMode( this->window_width, this->window_height, 0, this->sdl_flags ); pthread_create( &this->thread, NULL, consumer_thread, this ); } @@ -422,20 +419,17 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame ) } } - if ( this->sdl_screen == NULL || changed || mlt_properties_get_int( properties, "changed" ) == 2 ) + if ( this->sdl_screen == NULL || changed ) { // open SDL window this->sdl_screen = SDL_SetVideoMode( this->window_width, this->window_height, 0, this->sdl_flags ); if ( consumer_get_dimensions( &this->window_width, &this->window_height ) ) this->sdl_screen = SDL_SetVideoMode( this->window_width, this->window_height, 0, this->sdl_flags ); - changed = 1; - mlt_properties_set_int( properties, "changed", 0 ); } else { changed = 1; - mlt_properties_set_int( properties, "changed", 0 ); } if ( changed == 0 && -- 1.7.4.4