more sdl/consumer tuning and demo updates
[melted] / src / modules / avformat / producer_avformat.c
index 67a66df..2e39825 100644 (file)
@@ -41,6 +41,21 @@ static int producer_get_frame( mlt_producer this, mlt_frame_ptr frame, int index
 static int avformat_initialised = 0;
 static pthread_mutex_t avformat_mutex;
 
+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 );
+}
+
 /** Constructor for libavformat.
 */
 
@@ -72,8 +87,8 @@ mlt_producer producer_avformat_init( char *file )
                        // Initialise avformat if necessary
                        if ( avformat_initialised == 0 )
                        {
-                               pthread_mutex_init( &avformat_mutex, NULL );
                                avformat_initialised = 1;
+                               pthread_mutex_init( &avformat_mutex, NULL );
                                av_register_all( );
                        }
 
@@ -558,34 +573,8 @@ static void producer_set_up_video( mlt_producer this, mlt_frame frame )
                        // If we don't have a codec and we can't initialise it, we can't do much more...
                        if ( codec != NULL && avcodec_open( codec_context, codec ) >= 0 )
                        {
-                               double aspect_ratio = 0;
-                               double source_fps = 0;
-
-                               // Set aspect ratio
-                               if ( codec_context->sample_aspect_ratio.num == 0 ) 
-                                       aspect_ratio = 0;
-                               else
-                                       aspect_ratio = av_q2d( codec_context->sample_aspect_ratio ) * codec_context->width / codec_context->height;
-
-                               // XXX: This assumes square pixels!
-                       if (aspect_ratio <= 0.0)
-                                       aspect_ratio = ( double )codec_context->width / ( double )codec_context->height;
-
-                               mlt_properties_set_double( properties, "aspect_ratio", aspect_ratio );
-                               fprintf( stderr, "AVFORMAT: sample aspect %f computed display aspect %f\n", av_q2d( codec_context->sample_aspect_ratio ), aspect_ratio );
-
-                               // Determine the fps
-                               source_fps = ( double )codec_context->frame_rate / codec_context->frame_rate_base;
-
-                               // We'll use fps if it's available
-                               if ( source_fps > 0 && source_fps < 30 )
-                                       mlt_properties_set_double( properties, "source_fps", source_fps );
-
                                // Now store the codec with its destructor
                                mlt_properties_set_data( properties, "video_codec", codec_context, 0, producer_codec_close, NULL );
-
-                               // Set to the real timecode
-                               av_seek_frame( context, -1, 0 );
                        }
                        else
                        {
@@ -597,6 +586,27 @@ static void producer_set_up_video( mlt_producer this, mlt_frame frame )
                // No codec, no show...
                if ( codec != NULL )
                {
+                       double aspect_ratio = 1;
+                       double source_fps = 0;
+
+                       // Set aspect ratio
+                       if ( codec_context->sample_aspect_ratio.num > 0 )
+                               aspect_ratio = av_q2d( codec_context->sample_aspect_ratio );
+
+                       mlt_properties_set_double( properties, "aspect_ratio", aspect_ratio );
+                       //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;
+
+                       // We'll use fps if it's available
+                       if ( source_fps > 0 && source_fps < 30 )
+                               mlt_properties_set_double( properties, "source_fps", source_fps );
+                       
+                       // Set the width and height
+                       mlt_properties_set_int( frame_properties, "width", codec_context->width );
+                       mlt_properties_set_int( frame_properties, "height", codec_context->height );
+
                        mlt_frame_push_get_image( frame, producer_get_image );
                        mlt_properties_set_data( frame_properties, "avformat_producer", this, 0, NULL, NULL );
                }