transition_region.c: bugfix regression with in built circle region
[melted] / src / modules / avformat / producer_avformat.c
index 1dfb5a9..3763bdb 100644 (file)
@@ -25,6 +25,7 @@
 
 // ffmpeg Header files
 #include <avformat.h>
+#include <opt.h>
 #ifdef SWSCALE
 #  include <swscale.h>
 #endif
@@ -714,10 +715,7 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form
 
                // Construct an AVFrame for YUV422 conversion
                if ( av_frame == NULL )
-               {
                        av_frame = avcodec_alloc_frame( );
-                       mlt_properties_set_data( properties, "av_frame", av_frame, 0, av_free, NULL );
-               }
 
                while( ret >= 0 && !got_picture )
                {
@@ -774,6 +772,7 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form
                                        mlt_properties_set_int( properties, "top_field_first", av_frame->top_field_first );
                                        mlt_properties_set_int( properties, "_current_position", int_position );
                                        mlt_properties_set_int( properties, "_got_picture", 1 );
+                                       mlt_properties_set_data( properties, "av_frame", av_frame, 0, av_free, NULL );
                                }
                                else
                                {
@@ -799,6 +798,26 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form
        return 0;
 }
 
+/** Process properties as AVOptions and apply to AV context obj
+*/
+
+static void apply_properties( void *obj, mlt_properties properties, int flags )
+{
+       int i;
+       int count = mlt_properties_count( properties ); 
+       for ( i = 0; i < count; i++ )
+       {
+               const char *opt_name = mlt_properties_get_name( properties, i );
+               const AVOption *opt = av_find_opt( obj, opt_name, NULL, flags, flags );
+               if ( opt != NULL )
+#if LIBAVCODEC_VERSION_INT >= ((51<<16)+(59<<8)+0)
+                       av_set_string2( obj, opt_name, mlt_properties_get( properties, opt_name), 0 );
+#else
+                       av_set_string( obj, opt_name, mlt_properties_get( properties, opt_name) );
+#endif
+       }
+}
+
 /** Set up video handling.
 */
 
@@ -822,6 +841,9 @@ static void producer_set_up_video( mlt_producer this, mlt_frame frame )
                context = mlt_properties_get_data( properties, "video_context", NULL );
                mlt_properties_set_data( properties, "dummy_context", NULL, 0, NULL, NULL );
                mlt_events_unblock( properties, this );
+
+               // Process properties as AVOptions
+               apply_properties( context, properties, AV_OPT_FLAG_DECODING_PARAM );
        }
 
        // Exception handling for video_index
@@ -896,6 +918,9 @@ static void producer_set_up_video( mlt_producer this, mlt_frame frame )
                                index = -1;
                        }
                        avformat_unlock( );
+
+                       // Process properties as AVOptions
+                       apply_properties( codec_context, properties, AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM );
                }
 
                // No codec, no show...
@@ -999,7 +1024,7 @@ static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_form
        int paused = 0;
 
        // Check for resample and create if necessary
-       if ( resample == NULL && ( *frequency != codec_context->sample_rate || codec_context->channels <= 2 ) )
+       if ( resample == NULL && codec_context->channels <= 2 )
        {
                // Create the resampler
                resample = audio_resample_init( *channels, codec_context->channels, *frequency, codec_context->sample_rate );
@@ -1038,10 +1063,10 @@ static int producer_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_form
        if ( decode_buffer == NULL )
        {
                // Allocate the audio buffer
-               decode_buffer = mlt_pool_alloc( AVCODEC_MAX_AUDIO_FRAME_SIZE * sizeof( int16_t ) );
+               decode_buffer = av_malloc( AVCODEC_MAX_AUDIO_FRAME_SIZE * sizeof( int16_t ) );
 
                // And store it on properties for reuse
-               mlt_properties_set_data( properties, "decode_buffer", decode_buffer, 0, ( mlt_destructor )mlt_pool_release, NULL );
+               mlt_properties_set_data( properties, "decode_buffer", decode_buffer, 0, ( mlt_destructor )av_free, NULL );
        }
 
 #if (LIBAVCODEC_VERSION_INT >= ((51<<16)+(71<<8)+0))
@@ -1295,6 +1320,9 @@ static void producer_set_up_audio( mlt_producer this, mlt_frame frame )
                                index = -1;
                        }
                        avformat_unlock( );
+
+                       // Process properties as AVOptions
+                       apply_properties( codec_context, properties, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM );
                }
 
                // No codec, no show...