// 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" );
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 )
{
}
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 )
{
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 );
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 );
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
int sdl_flags;
SDL_Surface *sdl_screen;
SDL_Overlay *sdl_overlay;
+ SDL_Rect rect;
uint8_t *buffer;
};
// 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" );
}
// 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;
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 )
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;
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;
}
}
}
// 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 )
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 ];
SDL_DisplayYUVOverlay( this->sdl_overlay, &this->sdl_screen->clip_rect );
}
}
+
}
return 0;