]> git.sesse.net Git - mlt/blobdiff - src/modules/avformat/consumer_avformat.c
Cleanup x264 stats files when "passlogfile" supplied.
[mlt] / src / modules / avformat / consumer_avformat.c
index 6a4982c3b9293b5f6ec309d80c6396b10eb436cf..ceaa12c67095488bb414ee2498cbe4e37388f4e0 100644 (file)
@@ -1178,7 +1178,7 @@ static void *consumer_thread( void *arg )
        int count = 0;
 
        // Allocate the context
-       AVFormatContext *oc = avformat_alloc_context( );
+       AVFormatContext *oc = NULL;
 
        // Streams
        AVStream *video_st = NULL;
@@ -1232,6 +1232,22 @@ static void *consumer_thread( void *arg )
        if ( filename == NULL || !strcmp( filename, "" ) )
                filename = "pipe:";
 
+#if LIBAVUTIL_VERSION_INT >= ((53<<16)+(2<<8)+0)
+       avformat_alloc_output_context2( &oc, fmt, format, filename );
+#else
+       oc = avformat_alloc_context( );
+       oc->oformat = fmt;
+       snprintf( oc->filename, sizeof(oc->filename), "%s", filename );
+
+       if ( oc->oformat && oc->oformat->priv_class && !oc->priv_data && oc->oformat->priv_data_size ) {
+               oc->priv_data = av_mallocz( oc->oformat->priv_data_size );
+               if ( oc->priv_data ) {
+                       *(const AVClass**)oc->priv_data = oc->oformat->priv_class;
+                       av_opt_set_defaults( oc->priv_data );
+               }
+       }
+#endif
+
        // Get the codec ids selected
        audio_codec_id = fmt->audio_codec;
        video_codec_id = fmt->video_codec;
@@ -1310,9 +1326,6 @@ static void *consumer_thread( void *arg )
                }
        }
 
-       oc->oformat = fmt;
-       snprintf( oc->filename, sizeof(oc->filename), "%s", filename );
-
        // Get a frame now, so we can set some AVOptions from properties.
        frame = mlt_consumer_rt_frame( consumer );
 
@@ -2200,6 +2213,18 @@ on_fatal_error:
                free( full );
                free( cwd );
                remove( "x264_2pass.log.temp" );
+
+               // Recent versions of libavcodec/x264 support passlogfile and need cleanup if specified.
+               if ( !mlt_properties_get( properties, "_logfilename" ) &&
+                     mlt_properties_get( properties, "passlogfile" ) )
+               {
+                       file = mlt_properties_get( properties, "passlogfile" );
+                       remove( file );
+                       full = malloc( strlen( file ) + strlen( ".mbtree" ) + 1 );
+                       sprintf( full, "%s.mbtree", file );
+                       remove( full );
+                       free( full );
+               }
        }
 
        while ( ( frame = mlt_deque_pop_back( queue ) ) )