producer_avformat.c: close the file at the end of object creation, then re-open the...
[melted] / src / modules / avformat / producer_avformat.c
index 5103798..c188b27 100644 (file)
@@ -74,6 +74,11 @@ mlt_producer producer_avformat_init( mlt_profile profile, char *file )
                                mlt_producer_close( this );
                                this = NULL;
                        }
+
+                       // Close the file to release resources for large playlists - reopen later as needed
+                       mlt_properties_set_data( properties, "dummy_context", NULL, 0, NULL, NULL );
+                       mlt_properties_set_data( properties, "audio_context", NULL, 0, NULL, NULL );
+                       mlt_properties_set_data( properties, "video_context", NULL, 0, NULL, NULL );
                }
        }
 
@@ -673,6 +678,16 @@ static void producer_set_up_video( mlt_producer this, mlt_frame frame )
 
        // Fetch the video_context
        AVFormatContext *context = mlt_properties_get_data( properties, "video_context", NULL );
+       if ( !context )
+       {
+               // Reopen the file
+               mlt_events_block( properties, this );
+               producer_open( this, mlt_service_profile( MLT_PRODUCER_SERVICE(this) ),
+                       mlt_properties_get( properties, "resource" ) );
+               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 );
+       }
 
        // Get the video_index
        int index = mlt_properties_get_int( properties, "video_index" );
@@ -1041,16 +1056,6 @@ static void producer_set_up_audio( mlt_producer this, mlt_frame frame )
                // Initialise the codec if necessary
                if ( codec == NULL )
                {
-                       // Initialise multi-threading 
-                       int thread_count = mlt_properties_get_int( properties, "threads" );
-                       if ( thread_count == 0 && getenv( "MLT_AVFORMAT_THREADS" ) )
-                               thread_count = atoi( getenv( "MLT_AVFORMAT_THREADS" ) );
-                       if ( thread_count > 1 )
-                       {
-                               avcodec_thread_init( codec_context, thread_count );
-                               codec_context->thread_count = thread_count;
-                       }
-
                        // Find the codec
                        codec = avcodec_find_decoder( codec_context->codec_id );