X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Fsdl%2Fconsumer_sdl.c;h=6e8e12d8bd0bbbbb495948f941fed3dcb8624727;hb=7cef152403bfa0ea30e4a3e102fe33bc75e508ab;hp=d1625802d78935032089d9fc77cd5920af5c58ef;hpb=55f4b82288ba162eeeedf63bbb99455cccd04b8d;p=melted diff --git a/src/modules/sdl/consumer_sdl.c b/src/modules/sdl/consumer_sdl.c index d162580..6e8e12d 100644 --- a/src/modules/sdl/consumer_sdl.c +++ b/src/modules/sdl/consumer_sdl.c @@ -134,27 +134,12 @@ mlt_consumer consumer_sdl_init( char *arg ) { this->width = mlt_properties_get_int( this->properties, "width" ); this->height = mlt_properties_get_int( this->properties, "height" ); - - // Default window size - this->window_width = ( float )this->height * this->display_aspect; - this->window_height = this->height; - } - else - { - if ( (int)( ( float )this->width / this->height * 1000 ) != - (int)( this->display_aspect * 1000 ) ) - { - // Override these - this->display_aspect = ( float )this->width / this->height; - this->aspect_ratio = 1.0; - mlt_properties_set_double( this->properties, "aspect_ratio", this->aspect_ratio ); - } - - // Set window size - this->window_width = this->width; - this->window_height = this->height; } + // Default window size + this->window_width = ( float )this->height * this->display_aspect; + this->window_height = this->height; + // Set the sdl flags this->sdl_flags = SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_HWACCEL | SDL_RESIZABLE | SDL_DOUBLEBUF; @@ -432,7 +417,10 @@ 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 ) && + ( mlt_frame_get_aspect_ratio( frame ) != 1.0 || this->last_frame_aspect == 0.0 ) ) ) + { this->width = width; this->height = height; @@ -498,7 +486,7 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame ) 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 ) SDL_FreeYUVOverlay( this->sdl_overlay ); @@ -507,7 +495,11 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame ) sdl_lock_display(); this->sdl_screen = SDL_SetVideoMode( this->window_width, this->window_height, 0, 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, 0, this->sdl_flags ); + SDL_Flip( this->sdl_screen ); + mlt_properties_set_int( properties, "changed", 0 ); + if ( this->sdl_screen != NULL ) { SDL_SetClipRect( this->sdl_screen, &this->rect ); @@ -522,7 +514,6 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame ) sdl_lock_display(); this->sdl_screen = SDL_SetVideoMode( this->window_width, this->window_height, 0, this->sdl_flags ); SDL_SetClipRect( this->sdl_screen, &this->rect ); - SDL_Flip( this->sdl_screen ); sdl_unlock_display(); mlt_properties_set_int( properties, "changed", 0 ); } @@ -649,14 +640,25 @@ static void *consumer_thread( void *arg ) int64_t playtime = 0; struct timespec tm = { 0, 100000 }; - if ( SDL_Init( SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_NOPARACHUTE ) < 0 ) + if ( mlt_properties_get_int( mlt_consumer_properties( consumer ), "sdl_started" ) == 0 ) { - fprintf( stderr, "Failed to initialize SDL: %s\n", SDL_GetError() ); - return NULL; + if ( SDL_Init( SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE ) < 0 ) + { + fprintf( stderr, "Failed to initialize SDL: %s\n", SDL_GetError() ); + return NULL; + } + + SDL_EnableKeyRepeat( SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL ); + SDL_EnableUNICODE( 1 ); + } + else + { + if ( SDL_GetVideoSurface( ) != NULL ) + consumer_get_dimensions( &this->window_width, &this->window_height ); + mlt_properties_set_int( mlt_consumer_properties( consumer ), "changed", 1 ); } - SDL_EnableKeyRepeat( SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL ); - SDL_EnableUNICODE( 1 ); + SDL_InitSubSystem( SDL_INIT_AUDIO ); // Loop until told not to while( this->running ) @@ -712,7 +714,11 @@ static void *consumer_thread( void *arg ) // internal cleanup if ( this->sdl_overlay != NULL ) SDL_FreeYUVOverlay( this->sdl_overlay ); - SDL_Quit( ); + + SDL_QuitSubSystem( SDL_INIT_AUDIO ); + + if ( mlt_properties_get_int( mlt_consumer_properties( consumer ), "sdl_started" ) == 0 ) + SDL_Quit( ); while( mlt_deque_count( this->queue ) ) mlt_frame_close( mlt_deque_pop_back( this->queue ) );