for( i = 0; i < context->nb_streams; i++ )
{
// Get the codec context
- AVCodecContext *codec_context = &context->streams[ i ]->codec;
+ AVCodecContext *codec_context = context->streams[ i ]->codec;
// Determine the type and obtain the first index of each type
switch( codec_context->codec_type )
// These are required by video4linux (defaults)
params->width = 640;
params->height = 480;
- params->frame_rate = 25;
- params->frame_rate_base = 1;
+ params->time_base= (AVRational){1,25};
params->device = file;
params->channels = 2;
params->sample_rate = 48000;
if ( t )
t[0] = 0;
if ( !strcmp( name, "frame_rate" ) )
- params->frame_rate = atoi( value );
+ params->time_base.den = atoi( value );
else if ( !strcmp( name, "frame_rate_base" ) )
- params->frame_rate_base = atoi( value );
+ params->time_base.num = atoi( value );
else if ( !strcmp( name, "sample_rate" ) )
params->sample_rate = atoi( value );
else if ( !strcmp( name, "channels" ) )
find_default_streams( context, &audio_index, &video_index );
if ( context->start_time != AV_NOPTS_VALUE )
- mlt_properties_set_double( properties, "start_time", context->start_time );
+ mlt_properties_set_double( properties, "_start_time", context->start_time );
// Check if we're seekable (something funny about mpeg here :-/)
if ( strcmp( file, "pipe:" ) && strncmp( file, "http://", 6 ) )
- mlt_properties_set_int( properties, "seekable", av_seek_frame( context, -1, mlt_properties_get_double( properties, "start_time" ), AVSEEK_FLAG_BACKWARD ) >= 0 );
+ mlt_properties_set_int( properties, "seekable", av_seek_frame( context, -1, mlt_properties_get_double( properties, "_start_time" ), AVSEEK_FLAG_BACKWARD ) >= 0 );
else
av_bypass = 1;
int index = mlt_properties_get_int( properties, "video_index" );
// Obtain the expected frame numer
- mlt_position expected = mlt_properties_get_position( properties, "video_expected" );
+ mlt_position expected = mlt_properties_get_position( properties, "_video_expected" );
// Calculate the real time code
double real_timecode = producer_time_of_frame( this, position );
AVStream *stream = context->streams[ index ];
// Get codec context
- AVCodecContext *codec_context = &stream->codec;
+ AVCodecContext *codec_context = stream->codec;
// Packet
AVPacket pkt;
int ignore = 0;
// Current time calcs
- double current_time = mlt_properties_get_double( properties, "current_time" );
+ double current_time = mlt_properties_get_double( properties, "_current_time" );
// We may want to use the source fps if available
double source_fps = mlt_properties_get_double( properties, "source_fps" );
else if ( seekable && ( position < expected || position - expected >= 12 ) )
{
// Set to the real timecode
- av_seek_frame( context, -1, mlt_properties_get_double( properties, "start_time" ) + real_timecode * 1000000.0, AVSEEK_FLAG_BACKWARD );
+ av_seek_frame( context, -1, mlt_properties_get_double( properties, "_start_time" ) + real_timecode * 1000000.0, AVSEEK_FLAG_BACKWARD );
// Remove the cached info relating to the previous position
- mlt_properties_set_double( properties, "current_time", real_timecode );
+ mlt_properties_set_double( properties, "_current_time", real_timecode );
mlt_properties_set_data( properties, "av_frame", NULL, 0, NULL, NULL );
av_frame = NULL;
}
// Duplicate the last image if necessary
- if ( av_frame != NULL && ( paused || mlt_properties_get_double( properties, "current_time" ) >= real_timecode ) &&
+ if ( av_frame != NULL && ( paused || mlt_properties_get_double( properties, "_current_time" ) >= real_timecode ) &&
av_bypass == 0 )
{
// Duplicate it
if ( ret >= 0 && pkt.stream_index == index && pkt.size > 0 )
{
// Determine time code of the packet
- if ( pkt.pts != AV_NOPTS_VALUE )
- current_time = ( double )pkt.pts / 1000000.0;
+ if ( pkt.dts != AV_NOPTS_VALUE )
+ current_time = av_q2d( stream->time_base ) * pkt.dts;
else
current_time = real_timecode;
{
double fps = mlt_properties_get_double( properties, "fps" );
current_time = ceil( source_fps * ( double )position / fps ) * ( 1 / source_fps );
- mlt_properties_set_double( properties, "current_time", current_time );
+ mlt_properties_set_double( properties, "_current_time", current_time );
}
else
{
- mlt_properties_set_double( properties, "current_time", current_time );
+ mlt_properties_set_double( properties, "_current_time", current_time );
}
}
}
mlt_properties_get_int( properties, "top_field_first" ) );
// Regardless of speed, we expect to get the next frame (cos we ain't too bright)
- mlt_properties_set_position( properties, "video_expected", position + 1 );
+ mlt_properties_set_position( properties, "_video_expected", position + 1 );
return 0;
}
AVStream *stream = context->streams[ index ];
// Get codec context
- AVCodecContext *codec_context = &stream->codec;
+ AVCodecContext *codec_context = stream->codec;
// Get the codec
AVCodec *codec = mlt_properties_get_data( properties, "video_codec", NULL );
{
double source_fps = 0;
int norm_aspect_ratio = mlt_properties_get_int( properties, "norm_aspect_ratio" );
+ double force_aspect_ratio = mlt_properties_get_double( properties, "force_aspect_ratio" );
+ double aspect_ratio;
// XXX: We won't know the real aspect ratio until an image is decoded
// but we do need it now (to satisfy filter_resize) - take a guess based
// on pal/ntsc
- if ( !norm_aspect_ratio && codec_context->sample_aspect_ratio.num > 0 )
+ if ( force_aspect_ratio > 0.0 )
{
- mlt_properties_set_double( properties, "aspect_ratio", av_q2d( codec_context->sample_aspect_ratio ) );
+ aspect_ratio = force_aspect_ratio;
+ }
+ else if ( !norm_aspect_ratio && codec_context->sample_aspect_ratio.num > 0 )
+ {
+ aspect_ratio = av_q2d( codec_context->sample_aspect_ratio );
}
else
{
int is_pal = mlt_properties_get_double( properties, "fps" ) == 25.0;
- mlt_properties_set_double( properties, "aspect_ratio", is_pal ? 59.0/54.0 : 10.0/11.0 );
+ aspect_ratio = is_pal ? 59.0/54.0 : 10.0/11.0;
}
- //fprintf( stderr, "AVFORMAT: sample aspect %f %dx%d\n", av_q2d( codec_context->sample_aspect_ratio ), codec_context->width, codec_context->height );
-
// Determine the fps
- source_fps = ( double )codec_context->frame_rate / ( codec_context->frame_rate_base == 0 ? 1 : codec_context->frame_rate_base );
+ source_fps = ( double )codec_context->time_base.den / ( codec_context->time_base.num == 0 ? 1 : codec_context->time_base.num );
// We'll use fps if it's available
if ( source_fps > 0 && source_fps < 30 )
mlt_properties_set_double( properties, "source_fps", source_fps );
+ mlt_properties_set_double( properties, "aspect_ratio", aspect_ratio );
// Set the width and height
mlt_properties_set_int( frame_properties, "width", codec_context->width );
mlt_properties_set_int( frame_properties, "height", codec_context->height );
+ mlt_properties_set_double( frame_properties, "aspect_ratio", aspect_ratio );
mlt_frame_push_get_image( frame, producer_get_image );
mlt_properties_set_data( frame_properties, "avformat_producer", this, 0, NULL, NULL );
int seekable = mlt_properties_get_int( properties, "seekable" );
// Obtain the expected frame numer
- mlt_position expected = mlt_properties_get_position( properties, "audio_expected" );
+ mlt_position expected = mlt_properties_get_position( properties, "_audio_expected" );
// Obtain the resample context if it exists (not always needed)
ReSampleContext *resample = mlt_properties_get_data( properties, "audio_resample", NULL );
int16_t *audio_buffer = mlt_properties_get_data( properties, "audio_buffer", NULL );
// Get amount of audio used
- int audio_used = mlt_properties_get_int( properties, "audio_used" );
+ int audio_used = mlt_properties_get_int( properties, "_audio_used" );
// Calculate the real time code
double real_timecode = producer_time_of_frame( this, position );
AVStream *stream = context->streams[ index ];
// Get codec context
- AVCodecContext *codec_context = &stream->codec;
+ AVCodecContext *codec_context = stream->codec;
// Packet
AVPacket pkt;
else if ( position < expected || position - expected >= 12 )
{
// Set to the real timecode
- if ( av_seek_frame( context, -1, mlt_properties_get_double( properties, "start_time" ) + real_timecode * 1000000.0, AVSEEK_FLAG_BACKWARD ) != 0 )
+ if ( av_seek_frame( context, -1, mlt_properties_get_double( properties, "_start_time" ) + real_timecode * 1000000.0, AVSEEK_FLAG_BACKWARD ) != 0 )
paused = 1;
// Clear the usage in the audio buffer
}
// If we're behind, ignore this packet
- float current_pts = (float)pkt.pts / 1000000.0;
+ float current_pts = av_q2d( stream->time_base ) * pkt.pts;
if ( seekable && ( !ignore && current_pts <= ( real_timecode - 0.02 ) ) )
ignore = 1;
}
}
// Store the number of audio samples still available
- mlt_properties_set_int( properties, "audio_used", audio_used );
+ mlt_properties_set_int( properties, "_audio_used", audio_used );
// Release the temporary audio
mlt_pool_release( temp );
// Regardless of speed (other than paused), we expect to get the next frame
if ( !paused )
- mlt_properties_set_position( properties, "audio_expected", position + 1 );
+ mlt_properties_set_position( properties, "_audio_expected", position + 1 );
return 0;
}
AVStream *stream = context->streams[ index ];
// Get codec context
- AVCodecContext *codec_context = &stream->codec;
+ AVCodecContext *codec_context = stream->codec;
// Get the codec
AVCodec *codec = mlt_properties_get_data( properties, "audio_codec", NULL );