X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Favformat%2Fproducer_avformat.c;h=efd520615178120ffae90ffb23f18f1d9704603a;hb=cdf7162ebc07120e92166a0e43eaba21ecca25ba;hp=a9979c17016a741d5e52dd119576bb5ff5a14391;hpb=6ad443b3ffd53b2e8be119df6fb7d3f2da1c4cec;p=melted diff --git a/src/modules/avformat/producer_avformat.c b/src/modules/avformat/producer_avformat.c index a9979c1..efd5206 100644 --- a/src/modules/avformat/producer_avformat.c +++ b/src/modules/avformat/producer_avformat.c @@ -89,7 +89,7 @@ static void find_default_streams( AVFormatContext *context, int *audio_index, in 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 ) @@ -196,8 +196,7 @@ static int producer_open( mlt_producer this, char *file ) // 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; @@ -218,9 +217,9 @@ static int producer_open( mlt_producer this, char *file ) 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" ) ) @@ -277,11 +276,11 @@ static int producer_open( mlt_producer this, char *file ) 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; @@ -438,7 +437,7 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form 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 ); @@ -447,7 +446,7 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form AVStream *stream = context->streams[ index ]; // Get codec context - AVCodecContext *codec_context = &stream->codec; + AVCodecContext *codec_context = stream->codec; // Packet AVPacket pkt; @@ -462,7 +461,7 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form 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" ); @@ -517,10 +516,10 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form 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; @@ -528,7 +527,7 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form } // 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 @@ -565,8 +564,8 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form 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; @@ -609,11 +608,11 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form { 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 ); } } } @@ -623,7 +622,7 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form 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; } @@ -651,7 +650,7 @@ static void producer_set_up_video( mlt_producer this, mlt_frame frame ) 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 ); @@ -694,10 +693,8 @@ static void producer_set_up_video( mlt_producer this, mlt_frame frame ) 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 ) @@ -748,7 +745,7 @@ static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_form 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 ); @@ -757,7 +754,7 @@ static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_form 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 ); @@ -766,7 +763,7 @@ static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_form AVStream *stream = context->streams[ index ]; // Get codec context - AVCodecContext *codec_context = &stream->codec; + AVCodecContext *codec_context = stream->codec; // Packet AVPacket pkt; @@ -818,7 +815,7 @@ static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_form 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 @@ -888,7 +885,7 @@ static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_form } // 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; } @@ -913,7 +910,7 @@ static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_form } // 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 ); @@ -926,7 +923,7 @@ static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_form // 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; } @@ -955,7 +952,7 @@ static void producer_set_up_audio( mlt_producer this, mlt_frame frame ) 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 );