if ( mlt_producer_init( this, NULL ) == 0 )
{
// Get the properties
- mlt_properties properties = mlt_producer_properties( this );
+ mlt_properties properties = MLT_PRODUCER_PROPERTIES( this );
// Set the resource property (required for all producers)
mlt_properties_set( properties, "resource", file );
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 )
AVFormatContext *context = NULL;
// Get the properties
- mlt_properties properties = mlt_producer_properties( this );
+ mlt_properties properties = MLT_PRODUCER_PROPERTIES( this );
// We will treat everything with the producer fps
double fps = mlt_properties_get_double( properties, "fps" );
// 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" ) )
static double producer_time_of_frame( mlt_producer this, mlt_position position )
{
// Get the properties
- mlt_properties properties = mlt_producer_properties( this );
+ mlt_properties properties = MLT_PRODUCER_PROPERTIES( this );
// Obtain the fps
double fps = mlt_properties_get_double( properties, "fps" );
static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_format *format, int *width, int *height, int writable )
{
// Get the properties from the frame
- mlt_properties frame_properties = mlt_frame_properties( frame );
+ mlt_properties frame_properties = MLT_FRAME_PROPERTIES( frame );
// Obtain the frame number of this frame
mlt_position position = mlt_properties_get_position( frame_properties, "avformat_position" );
mlt_producer this = mlt_properties_get_data( frame_properties, "avformat_producer", NULL );
// Get the producer properties
- mlt_properties properties = mlt_producer_properties( this );
+ mlt_properties properties = MLT_PRODUCER_PROPERTIES( this );
// Fetch the video_context
AVFormatContext *context = mlt_properties_get_data( properties, "video_context", NULL );
AVStream *stream = context->streams[ index ];
// Get codec context
- AVCodecContext *codec_context = &stream->codec;
+ AVCodecContext *codec_context = stream->codec;
// Packet
AVPacket pkt;
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;
static void producer_set_up_video( mlt_producer this, mlt_frame frame )
{
// Get the properties
- mlt_properties properties = mlt_producer_properties( this );
+ mlt_properties properties = MLT_PRODUCER_PROPERTIES( this );
// Fetch the video_context
AVFormatContext *context = mlt_properties_get_data( properties, "video_context", NULL );
int index = mlt_properties_get_int( properties, "video_index" );
// Get the frame properties
- mlt_properties frame_properties = mlt_frame_properties( frame );
+ mlt_properties frame_properties = MLT_FRAME_PROPERTIES( frame );
if ( context != NULL && index != -1 )
{
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 );
else
{
int is_pal = mlt_properties_get_double( properties, "fps" ) == 25.0;
- mlt_properties_set_double( properties, "aspect_ratio", is_pal ? 128.0/117.0 : 72.0/79.0 );
+ mlt_properties_set_double( properties, "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 )
static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_format *format, int *frequency, int *channels, int *samples )
{
// Get the properties from the frame
- mlt_properties frame_properties = mlt_frame_properties( frame );
+ mlt_properties frame_properties = MLT_FRAME_PROPERTIES( frame );
// Obtain the frame number of this frame
mlt_position position = mlt_properties_get_position( frame_properties, "avformat_position" );
mlt_producer this = mlt_properties_get_data( frame_properties, "avformat_producer", NULL );
// Get the producer properties
- mlt_properties properties = mlt_producer_properties( this );
+ mlt_properties properties = MLT_PRODUCER_PROPERTIES( this );
// Fetch the audio_context
AVFormatContext *context = mlt_properties_get_data( properties, "audio_context", NULL );
AVStream *stream = context->streams[ index ];
// Get codec context
- AVCodecContext *codec_context = &stream->codec;
+ AVCodecContext *codec_context = stream->codec;
// Packet
AVPacket pkt;
}
// 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;
}
else
{
// Get silence and don't touch the context
- frame->get_audio = NULL;
mlt_frame_get_audio( frame, buffer, format, frequency, channels, samples );
}
static void producer_set_up_audio( mlt_producer this, mlt_frame frame )
{
// Get the properties
- mlt_properties properties = mlt_producer_properties( this );
+ mlt_properties properties = MLT_PRODUCER_PROPERTIES( this );
// Fetch the audio_context
AVFormatContext *context = mlt_properties_get_data( properties, "audio_context", NULL );
if ( context != NULL && index != -1 )
{
// Get the frame properties
- mlt_properties frame_properties = mlt_frame_properties( frame );
+ mlt_properties frame_properties = MLT_FRAME_PROPERTIES( frame );
// Get the audio stream
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 );
// No codec, no show...
if ( codec != NULL )
{
- frame->get_audio = producer_get_audio;
+ mlt_frame_push_audio( frame, producer_get_audio );
mlt_properties_set_data( frame_properties, "avformat_producer", this, 0, NULL, NULL );
}
}
mlt_frame_set_position( *frame, mlt_producer_position( this ) );
// Set the position of this producer
- mlt_properties_set_position( mlt_frame_properties( *frame ), "avformat_position", mlt_producer_frame( this ) );
+ mlt_properties_set_position( MLT_FRAME_PROPERTIES( *frame ), "avformat_position", mlt_producer_frame( this ) );
// Set up the video
producer_set_up_video( this, *frame );
producer_set_up_audio( this, *frame );
// Set the aspect_ratio
- mlt_properties_set_double( mlt_frame_properties( *frame ), "aspect_ratio", mlt_properties_get_double( mlt_producer_properties( this ), "aspect_ratio" ) );
+ mlt_properties_set_double( MLT_FRAME_PROPERTIES( *frame ), "aspect_ratio", mlt_properties_get_double( MLT_PRODUCER_PROPERTIES( this ), "aspect_ratio" ) );
// Calculate the next timecode
mlt_producer_prepare_next( this );