X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Fsdl%2Fconsumer_sdl.c;h=6e8e12d8bd0bbbbb495948f941fed3dcb8624727;hb=7cef152403bfa0ea30e4a3e102fe33bc75e508ab;hp=dfce3d1ad10a3268192f6726af71f65e3c1a427d;hpb=4c96cb2b639338d6308dd473983b9b4cbb9e27c9;p=melted diff --git a/src/modules/sdl/consumer_sdl.c b/src/modules/sdl/consumer_sdl.c index dfce3d1..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; @@ -433,15 +418,14 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame ) } if ( width != this->width || height != this->height || - ( int )( this->last_frame_aspect * 1000 ) != ( int )( mlt_frame_get_aspect_ratio( frame ) * 1000 ) ) + ( ( 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 ) ) ) + { - 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; - } + this->width = width; + this->height = height; + this->last_frame_aspect = mlt_frame_get_aspect_ratio( frame ); + changed = 1; } if ( this->sdl_screen == NULL || changed ) @@ -502,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 ); @@ -511,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 ); @@ -526,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 ); } @@ -653,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 ) + { + 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 { - fprintf( stderr, "Failed to initialize SDL: %s\n", SDL_GetError() ); - return NULL; + 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 ) @@ -716,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 ) );