X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmodules%2Favformat%2Fproducer_avformat.c;h=582171ea7d13d4072c3e11d5b752d031b1c9cb30;hb=c287a51b7a4c2cc437256c178a5eb2e7775d34fa;hp=0f3a5597e5ca65c0c48beebb637ce94fe4b060b0;hpb=380ba25c38651c7bbbe6bbefe5091e3b8fd9b1b4;p=mlt diff --git a/src/modules/avformat/producer_avformat.c b/src/modules/avformat/producer_avformat.c index 0f3a5597..582171ea 100644 --- a/src/modules/avformat/producer_avformat.c +++ b/src/modules/avformat/producer_avformat.c @@ -33,31 +33,13 @@ #include #include +void avformat_lock( ); +void avformat_unlock( ); + // Forward references. static int producer_open( mlt_producer this, char *file ); static int producer_get_frame( mlt_producer this, mlt_frame_ptr frame, int index ); -// A static flag used to determine if avformat has been initialised -static int avformat_initialised = 0; -static pthread_mutex_t avformat_mutex; - -#if 0 -void *av_malloc( unsigned int size ) -{ - return mlt_pool_alloc( size ); -} - -void *av_realloc( void *ptr, unsigned int size ) -{ - return mlt_pool_realloc( ptr, size ); -} - -void av_free( void *ptr ) -{ - return mlt_pool_release( ptr ); -} -#endif - /** Constructor for libavformat. */ @@ -86,14 +68,6 @@ mlt_producer producer_avformat_init( char *file ) // Register our get_frame implementation this->get_frame = producer_get_frame; - // Initialise avformat if necessary - if ( avformat_initialised == 0 ) - { - avformat_initialised = 1; - pthread_mutex_init( &avformat_mutex, NULL ); - av_register_all( ); - } - // Open the file if ( producer_open( this, file ) != 0 ) { @@ -145,13 +119,13 @@ static void producer_file_close( void *context ) if ( context != NULL ) { // Lock the mutex now - pthread_mutex_lock( &avformat_mutex ); + avformat_lock( ); // Close the file av_close_input_file( context ); // Unlock the mutex now - pthread_mutex_unlock( &avformat_mutex ); + avformat_unlock( ); } } @@ -163,13 +137,13 @@ static void producer_codec_close( void *codec ) if ( codec != NULL ) { // Lock the mutex now - pthread_mutex_lock( &avformat_mutex ); + avformat_lock( ); // Close the file avcodec_close( codec ); // Unlock the mutex now - pthread_mutex_unlock( &avformat_mutex ); + avformat_unlock( ); } } @@ -191,7 +165,7 @@ static int producer_open( mlt_producer this, char *file ) double fps = mlt_properties_get_double( properties, "fps" ); // Lock the mutex now - pthread_mutex_lock( &avformat_mutex ); + avformat_lock( ); // If "MRL", then create AVInputFormat AVInputFormat *format = NULL; @@ -332,7 +306,7 @@ static int producer_open( mlt_producer this, char *file ) } // Unlock the mutex now - pthread_mutex_unlock( &avformat_mutex ); + avformat_unlock( ); return error; } @@ -415,16 +389,14 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form mlt_properties_set_int( frame_properties, "height", *height ); // Lock the mutex now - pthread_mutex_lock( &avformat_mutex ); + avformat_lock( ); // Construct an AVFrame for YUV422 conversion if ( output == NULL ) { - int size = avpicture_get_size( PIX_FMT_YUV422, *width, *height ); - size += *width * 2; + int size = avpicture_get_size( PIX_FMT_YUV422, *width, *height + 1 ); uint8_t *buf = mlt_pool_alloc( size ); output = mlt_pool_alloc( sizeof( AVPicture ) ); - //memset( output, 0, sizeof( AVPicture ) ); avpicture_fill( output, buf, PIX_FMT_YUV422, *width, *height ); mlt_properties_set_data( properties, "video_output_frame", output, 0, ( mlt_destructor )mlt_pool_release, NULL ); mlt_properties_set_data( properties, "video_output_buffer", buf, 0, ( mlt_destructor )mlt_pool_release, NULL ); @@ -604,7 +576,7 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form mlt_properties_set_position( properties, "video_expected", position + 1 ); // Unlock the mutex now - pthread_mutex_unlock( &avformat_mutex ); + avformat_unlock( ); return 0; } @@ -627,7 +599,7 @@ static void producer_set_up_video( mlt_producer this, mlt_frame frame ) mlt_properties frame_properties = mlt_frame_properties( frame ); // Lock the mutex now - pthread_mutex_lock( &avformat_mutex ); + avformat_lock( ); if ( context != NULL && index != -1 ) { @@ -697,7 +669,7 @@ static void producer_set_up_video( mlt_producer this, mlt_frame frame ) } // Unlock the mutex now - pthread_mutex_unlock( &avformat_mutex ); + avformat_unlock( ); } /** Get the audio from a frame. @@ -755,7 +727,7 @@ static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_form int locked = 0; // Lock the mutex now - pthread_mutex_lock( &avformat_mutex ); + avformat_lock( ); // Check for resample and create if necessary if ( resample == NULL && codec_context->channels <= 2 ) @@ -928,7 +900,7 @@ static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_form mlt_properties_set_position( properties, "audio_expected", position + 1 ); // Unlock the mutex now - pthread_mutex_unlock( &avformat_mutex ); + avformat_unlock( ); return 0; } @@ -948,7 +920,7 @@ static void producer_set_up_audio( mlt_producer this, mlt_frame frame ) int index = mlt_properties_get_int( properties, "audio_index" ); // Lock the mutex now - pthread_mutex_lock( &avformat_mutex ); + avformat_lock( ); // Deal with audio context if ( context != NULL && index != -1 ) @@ -994,7 +966,7 @@ static void producer_set_up_audio( mlt_producer this, mlt_frame frame ) } // Unlock the mutex now - pthread_mutex_unlock( &avformat_mutex ); + avformat_unlock( ); } /** Our get frame implementation.