X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmodules%2Favformat%2Fproducer_avformat.c;h=efd520615178120ffae90ffb23f18f1d9704603a;hb=66509fd3206d09ae512886560660ac88d4b9c128;hp=85ee4a5a2b17f0d256932fe4d293fc50f3ef9a34;hpb=112bed9a4d15f4b52835dfc55fdf301f0a39f6d1;p=mlt diff --git a/src/modules/avformat/producer_avformat.c b/src/modules/avformat/producer_avformat.c index 85ee4a5a..efd52061 100644 --- a/src/modules/avformat/producer_avformat.c +++ b/src/modules/avformat/producer_avformat.c @@ -57,7 +57,7 @@ mlt_producer producer_avformat_init( char *file ) 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 ); @@ -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 ) @@ -156,7 +156,7 @@ static int producer_open( mlt_producer this, char *file ) 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" ); @@ -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; @@ -334,7 +333,7 @@ static int producer_open( mlt_producer this, char *file ) 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" ); @@ -420,7 +419,7 @@ static inline void convert_image( AVFrame *frame, uint8_t *buffer, int pix_fmt, 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" ); @@ -429,7 +428,7 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form 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 ); @@ -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; } @@ -634,7 +633,7 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form 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 ); @@ -643,7 +642,7 @@ static void producer_set_up_video( mlt_producer this, mlt_frame frame ) 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 ) { @@ -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 ); @@ -691,13 +690,11 @@ static void producer_set_up_video( mlt_producer this, mlt_frame frame ) 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 ) @@ -727,7 +724,7 @@ static void producer_set_up_video( mlt_producer this, mlt_frame frame ) 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" ); @@ -736,7 +733,7 @@ static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_form 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 ); @@ -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 ); @@ -921,13 +918,12 @@ static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_form else { // Get silence and don't touch the context - frame->get_audio = NULL; mlt_frame_get_audio( frame, buffer, format, frequency, channels, samples ); } // 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; } @@ -938,7 +934,7 @@ static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_form 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 ); @@ -950,13 +946,13 @@ static void producer_set_up_audio( mlt_producer this, mlt_frame frame ) 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 ); @@ -984,7 +980,7 @@ static void producer_set_up_audio( mlt_producer this, mlt_frame frame ) // 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 ); } } @@ -1002,7 +998,7 @@ static int producer_get_frame( mlt_producer this, mlt_frame_ptr frame, int index 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 ); @@ -1011,7 +1007,7 @@ static int producer_get_frame( mlt_producer this, mlt_frame_ptr frame, int index 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 );