From: lilo_booter Date: Sat, 1 May 2004 15:16:56 +0000 (+0000) Subject: Clean up and border preservation X-Git-Url: http://research.m1stereo.tv/gitweb?a=commitdiff_plain;h=d1c633c50972e892605cb2015bd8ab9a3dc4508c;p=melted Clean up and border preservation git-svn-id: https://mlt.svn.sourceforge.net/svnroot/mlt/trunk/mlt@297 d19143bc-622f-0410-bfdd-b5b2a6649095 --- diff --git a/src/framework/mlt_consumer.c b/src/framework/mlt_consumer.c index ef2760e..981a58d 100644 --- a/src/framework/mlt_consumer.c +++ b/src/framework/mlt_consumer.c @@ -234,8 +234,6 @@ static void *consumer_read_ahead_thread( void *arg ) // Get the properties of the consumer mlt_properties properties = mlt_consumer_properties( this ); - char *service = mlt_properties_get( properties, "mlt_service" ); - // Get the width and height int width = mlt_properties_get_int( properties, "width" ); int height = mlt_properties_get_int( properties, "height" ); @@ -293,12 +291,9 @@ static void *consumer_read_ahead_thread( void *arg ) skipped = 0; time_frame = 0; time_image = 0; - time_wait = 0; count = 1; } - //fprintf( stderr, "%s: %d %d %lld %lld\n", service, mlt_deque_count( this->queue ), buffer, ( time_frame + time_image ) / count, ( time_wait / count ) ); - // Get the image if ( ( time_frame + time_image ) / count < 40000 ) { @@ -312,13 +307,9 @@ static void *consumer_read_ahead_thread( void *arg ) } else { - fprintf( stderr, "Dropped a frame for %s\n", service ); - // Increment the number of sequentially skipped frames skipped ++; - time_wait = 0; - // If we've reached an unacceptable level, reset everything if ( skipped > 10 ) { diff --git a/src/modules/avformat/producer_avformat.c b/src/modules/avformat/producer_avformat.c index e0c246d..e50f2c1 100644 --- a/src/modules/avformat/producer_avformat.c +++ b/src/modules/avformat/producer_avformat.c @@ -267,12 +267,15 @@ static int producer_open( mlt_producer this, char *file ) mlt_properties_set_position( properties, "length", frames - 1 ); } - // Check if we're seekable - mlt_properties_set_int( properties, "seekable", av_seek_frame( context, -1, 0 ) == 0 ); - // Find default audio and video streams find_default_streams( context, &audio_index, &video_index ); + // Check if we're seekable (something funny about mpeg here :-/) + if ( strstr( file, ".mpg" ) == NULL && strstr( file, ".mpeg" ) == NULL ) + mlt_properties_set_int( properties, "seekable", av_seek_frame( context, -1, context->start_time ) >= 0 ); + else + mlt_properties_set_int( properties, "seekable", 1 ); + // Store selected audio and video indexes on properties mlt_properties_set_int( properties, "audio_index", audio_index ); mlt_properties_set_int( properties, "video_index", video_index ); @@ -421,7 +424,7 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form else { // Set to the real timecode - av_seek_frame( context, -1, real_timecode * 1000000.0 ); + av_seek_frame( context, -1, context->start_time + real_timecode * 1000000.0 ); // Remove the cached info relating to the previous position mlt_properties_set_double( properties, "current_time", real_timecode ); @@ -780,7 +783,7 @@ static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_form else { // Set to the real timecode - if ( !seekable || av_seek_frame( context, -1, real_timecode * 1000000.0 ) != 0 ) + if ( !seekable || av_seek_frame( context, -1, context->start_time + real_timecode * 1000000.0 ) != 0 ) paused = 1; // Clear the usage in the audio buffer diff --git a/src/modules/sdl/consumer_sdl.c b/src/modules/sdl/consumer_sdl.c index b2dcd90..fa1ee01 100644 --- a/src/modules/sdl/consumer_sdl.c +++ b/src/modules/sdl/consumer_sdl.c @@ -55,6 +55,7 @@ struct consumer_sdl_s int sdl_flags; SDL_Surface *sdl_screen; SDL_Overlay *sdl_overlay; + SDL_Rect rect; uint8_t *buffer; }; @@ -109,6 +110,9 @@ mlt_consumer consumer_sdl_init( char *arg ) // Default progressive true mlt_properties_set_int( this->properties, "progressive", 0 ); + // Default audio buffer + mlt_properties_set_int( this->properties, "audio_buffer", 1024 ); + // Get sample aspect ratio this->aspect_ratio = mlt_properties_get_double( this->properties, "aspect_ratio" ); @@ -142,7 +146,7 @@ mlt_consumer consumer_sdl_init( char *arg ) } // Set the sdl flags - this->sdl_flags = SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_HWACCEL | SDL_RESIZABLE; + this->sdl_flags = SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_HWACCEL | SDL_RESIZABLE | SDL_DOUBLEBUF; // Allow thread to be started/stopped parent->start = consumer_start; @@ -303,13 +307,15 @@ static int consumer_play_audio( consumer_sdl this, mlt_frame frame, int init_aud SDL_AudioSpec request; SDL_AudioSpec got; + int audio_buffer = mlt_properties_get_int( properties, "audio_buffer" ); + // specify audio format memset( &request, 0, sizeof( SDL_AudioSpec ) ); this->playing = 0; request.freq = frequency; request.format = AUDIO_S16; request.channels = channels; - request.samples = 1024; + request.samples = audio_buffer; request.callback = sdl_fill_audio; request.userdata = (void *)this; if ( SDL_OpenAudio( &request, &got ) != 0 ) @@ -406,8 +412,6 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame ) if ( this->sdl_screen == NULL || changed ) { - SDL_Rect rect; - // Determine frame's display aspect ratio float frame_aspect = mlt_frame_get_aspect_ratio( frame ) * this->width / this->height; @@ -423,18 +427,18 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame ) if ( ( (int)( this_aspect * 1000 ) == (int)( this->display_aspect * 1000 ) ) && ( (int)( mlt_frame_get_aspect_ratio( frame ) * 1000 ) == (int)( this->aspect_ratio * 1000 ) ) ) { - rect.w = this->window_width; - rect.h = this->window_height; + this->rect.w = this->window_width; + this->rect.h = this->window_height; } else { // Use hardware scaler to normalise display aspect ratio - rect.w = frame_aspect / this_aspect * this->window_width + 0.5; - rect.h = this->window_height; - if ( rect.w > this->window_width ) + this->rect.w = frame_aspect / this_aspect * this->window_width + 0.5; + this->rect.h = this->window_height; + if ( this->rect.w > this->window_width ) { - rect.w = this->window_width; - rect.h = this_aspect / frame_aspect * this->window_height + 0.5; + this->rect.w = this->window_width; + this->rect.h = this_aspect / frame_aspect * this->window_height + 0.5; } } } @@ -442,23 +446,23 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame ) // not corresponding exactly with image resolution. else if ( (int)( this_aspect * 1000 ) == (int)( this->display_aspect * 1000 ) ) { - rect.w = this->window_width; - rect.h = this->window_height; + this->rect.w = this->window_width; + this->rect.h = this->window_height; } // Use hardware scaler to normalise sample aspect ratio else if ( this->window_height * frame_aspect > this->window_width ) { - rect.w = this->window_width; - rect.h = this->window_width / frame_aspect + 0.5; + this->rect.w = this->window_width; + this->rect.h = this->window_width / frame_aspect + 0.5; } else { - rect.w = this->window_height * frame_aspect + 0.5; - rect.h = this->window_height; + this->rect.w = this->window_height * frame_aspect + 0.5; + this->rect.h = this->window_height; } - rect.x = ( this->window_width - rect.w ) / 2; - rect.y = ( this->window_height - rect.h ) / 2; + this->rect.x = ( this->window_width - this->rect.w ) / 2; + this->rect.y = ( this->window_height - this->rect.h ) / 2; // Force an overlay recreation if ( this->sdl_overlay != NULL ) @@ -469,13 +473,23 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame ) if ( this->sdl_screen != NULL ) { - SDL_SetClipRect( this->sdl_screen, &rect ); + SDL_SetClipRect( this->sdl_screen, &this->rect ); sdl_lock_display(); this->sdl_overlay = SDL_CreateYUVOverlay( this->width, this->height, SDL_YUY2_OVERLAY, this->sdl_screen ); sdl_unlock_display(); } } + if ( mlt_properties_get_int( properties, "changed" ) ) + { + 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 ); + } + if ( this->sdl_screen != NULL && this->sdl_overlay != NULL ) { this->buffer = this->sdl_overlay->pixels[ 0 ]; @@ -487,6 +501,7 @@ static int consumer_play_video( consumer_sdl this, mlt_frame frame ) SDL_DisplayYUVOverlay( this->sdl_overlay, &this->sdl_screen->clip_rect ); } } + } return 0;