X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmodules%2Fsdl%2Fconsumer_sdl.c;h=0a9926e625a3a875f872f6e4a49d121a3c5ea5cf;hb=0f587b2;hp=37fd8c0ce09e2a2e16960117287e2e069acece7f;hpb=ab49b1ce829029e936c5c5d30984b90535b3ed00;p=mlt diff --git a/src/modules/sdl/consumer_sdl.c b/src/modules/sdl/consumer_sdl.c index 37fd8c0c..0a9926e6 100644 --- a/src/modules/sdl/consumer_sdl.c +++ b/src/modules/sdl/consumer_sdl.c @@ -62,7 +62,6 @@ struct consumer_sdl_s int height; int playing; int sdl_flags; - SDL_Surface *sdl_screen; SDL_Overlay *sdl_overlay; SDL_Rect rect; uint8_t *buffer; @@ -87,7 +86,7 @@ static void consumer_sdl_event( mlt_listener listener, mlt_properties owner, mlt mlt_consumer consumer_sdl_init( mlt_profile profile, mlt_service_type type, const char *id, char *arg ) { // Create the consumer object - consumer_sdl this = calloc( sizeof( struct consumer_sdl_s ), 1 ); + consumer_sdl this = calloc( 1, sizeof( struct consumer_sdl_s ) ); // If no malloc'd and consumer init ok if ( this != NULL && mlt_consumer_init( &this->parent, this, profile ) == 0 ) @@ -117,6 +116,7 @@ mlt_consumer consumer_sdl_init( mlt_profile profile, mlt_service_type type, cons // Default scaler (for now we'll use nearest) mlt_properties_set( this->properties, "rescale", "nearest" ); mlt_properties_set( this->properties, "deinterlace_method", "onefield" ); + mlt_properties_set_int( this->properties, "top_field_first", -1 ); // Default buffer for low latency mlt_properties_set_int( this->properties, "buffer", 1 ); @@ -180,12 +180,32 @@ int consumer_start( mlt_consumer parent ) int display_off = video_off | preview_off; int audio_off = mlt_properties_get_int( properties, "audio_off" ); int sdl_started = mlt_properties_get_int( properties, "sdl_started" ); + char *output_display = mlt_properties_get( properties, "output_display" ); + char *window_id = mlt_properties_get( properties, "window_id" ); + char *audio_driver = mlt_properties_get( properties, "audio_driver" ); + char *video_driver = mlt_properties_get( properties, "video_driver" ); + char *audio_device = mlt_properties_get( properties, "audio_device" ); consumer_stop( parent ); this->running = 1; this->joined = 0; + if ( output_display != NULL ) + setenv( "DISPLAY", output_display, 1 ); + + if ( window_id != NULL ) + setenv( "SDL_WINDOWID", window_id, 1 ); + + if ( video_driver != NULL ) + setenv( "SDL_VIDEODRIVER", video_driver, 1 ); + + if ( audio_driver != NULL ) + setenv( "SDL_AUDIODRIVER", audio_driver, 1 ); + + if ( audio_device != NULL ) + setenv( "AUDIODEV", audio_device, 1 ); + if ( ! mlt_properties_get_int( this->properties, "_arg_size" ) ) { if ( mlt_properties_get_int( this->properties, "width" ) > 0 ) @@ -210,12 +230,6 @@ int consumer_start( mlt_consumer parent ) SDL_EnableKeyRepeat( SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL ); SDL_EnableUNICODE( 1 ); } - else if ( display_off == 0 ) - { - pthread_mutex_lock( &mlt_sdl_mutex ); - this->sdl_screen = SDL_GetVideoSurface( ); - pthread_mutex_unlock( &mlt_sdl_mutex ); - } if ( audio_off == 0 ) SDL_InitSubSystem( SDL_INIT_AUDIO ); @@ -233,7 +247,8 @@ int consumer_start( mlt_consumer parent ) this->window_height = this->height; } - if ( this->sdl_screen == NULL && display_off == 0 ) + pthread_mutex_lock( &mlt_sdl_mutex ); + if ( !SDL_GetVideoSurface() && display_off == 0 ) { if ( mlt_properties_get_int( this->properties, "fullscreen" ) ) { @@ -246,10 +261,9 @@ int consumer_start( mlt_consumer parent ) this->sdl_flags |= SDL_FULLSCREEN; SDL_ShowCursor( SDL_DISABLE ); } - pthread_mutex_lock( &mlt_sdl_mutex ); - this->sdl_screen = SDL_SetVideoMode( this->window_width, this->window_height, 0, this->sdl_flags ); - pthread_mutex_unlock( &mlt_sdl_mutex ); + SDL_SetVideoMode( this->window_width, this->window_height, 0, this->sdl_flags ); } + pthread_mutex_unlock( &mlt_sdl_mutex ); pthread_create( &this->thread, NULL, consumer_thread, this ); } @@ -291,8 +305,6 @@ int consumer_stop( mlt_consumer parent ) SDL_Quit( ); pthread_mutex_unlock( &mlt_sdl_mutex ); } - - this->sdl_screen = NULL; } return 0; @@ -493,7 +505,7 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame ) void *pool = mlt_cocoa_autorelease_init(); // Handle events - if ( this->sdl_screen != NULL ) + if ( SDL_GetVideoSurface() ) { SDL_Event event; @@ -542,7 +554,7 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame ) this->sdl_overlay = NULL; } - if ( this->running && ( this->sdl_screen == NULL || changed ) ) + if ( this->running && ( !SDL_GetVideoSurface() || changed ) ) { // Force an overlay recreation if ( this->sdl_overlay != NULL ) @@ -551,14 +563,16 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame ) // open SDL window with video overlay, if possible pthread_mutex_lock( &mlt_sdl_mutex ); - this->sdl_screen = SDL_SetVideoMode( this->window_width, this->window_height, this->bpp, this->sdl_flags ); - 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 ); + consumer_get_dimensions( &this->window_width, &this->window_height ); + SDL_Surface *screen = SDL_SetVideoMode( this->window_width, this->window_height, this->bpp, this->sdl_flags ); pthread_mutex_unlock( &mlt_sdl_mutex ); - uint32_t color = mlt_properties_get_int( this->properties, "window_background" ); - SDL_FillRect( this->sdl_screen, NULL, color >> 8 ); - SDL_Flip( this->sdl_screen ); + if ( screen ) + { + uint32_t color = mlt_properties_get_int( this->properties, "window_background" ); + SDL_FillRect( screen, NULL, color >> 8 ); + SDL_Flip( screen ); + } } if ( this->running ) @@ -617,16 +631,16 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame ) mlt_properties_set_int( this->properties, "rect_w", this->rect.w ); mlt_properties_set_int( this->properties, "rect_h", this->rect.h ); - SDL_SetClipRect( this->sdl_screen, &this->rect ); + SDL_SetClipRect( SDL_GetVideoSurface(), &this->rect ); } - if ( this->running && this->sdl_screen != NULL && this->sdl_overlay == NULL ) + if ( this->running && SDL_GetVideoSurface() && this->sdl_overlay == NULL ) { - SDL_SetClipRect( this->sdl_screen, &this->rect ); - this->sdl_overlay = SDL_CreateYUVOverlay( width, height, SDL_YUY2_OVERLAY, this->sdl_screen ); + SDL_SetClipRect( SDL_GetVideoSurface(), &this->rect ); + this->sdl_overlay = SDL_CreateYUVOverlay( width, height, SDL_YUY2_OVERLAY, SDL_GetVideoSurface() ); } - if ( this->running && this->sdl_screen != NULL && this->sdl_overlay != NULL ) + if ( this->running && SDL_GetVideoSurface() && this->sdl_overlay != NULL ) { this->buffer = this->sdl_overlay->pixels[ 0 ]; if ( SDL_LockYUVOverlay( this->sdl_overlay ) >= 0 ) @@ -634,7 +648,7 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame ) if ( image != NULL ) memcpy( this->buffer, image, width * height * 2 ); SDL_UnlockYUVOverlay( this->sdl_overlay ); - SDL_DisplayYUVOverlay( this->sdl_overlay, &this->sdl_screen->clip_rect ); + SDL_DisplayYUVOverlay( this->sdl_overlay, &SDL_GetVideoSurface()->clip_rect ); } } @@ -818,7 +832,7 @@ static void *consumer_thread( void *arg ) } else if ( terminated ) { - if ( mlt_deque_count( this->queue ) == 0 ) + if ( init_video || mlt_deque_count( this->queue ) == 0 ) break; else nanosleep( &tm, NULL ); @@ -848,7 +862,6 @@ static void *consumer_thread( void *arg ) while( mlt_deque_count( this->queue ) ) mlt_frame_close( mlt_deque_pop_back( this->queue ) ); - this->sdl_screen = NULL; this->audio_avail = 0; return NULL;