]> git.sesse.net Git - mlt/blobdiff - src/modules/avformat/consumer_avformat.c
Fix compile error on Windows.
[mlt] / src / modules / avformat / consumer_avformat.c
index ceaa12c67095488bb414ee2498cbe4e37388f4e0..8776de886f43e90288b7725cf082865f1456a6fa 100644 (file)
@@ -196,6 +196,27 @@ mlt_consumer consumer_avformat_init( mlt_profile profile, char *arg )
        return consumer;
 }
 
+static void recompute_aspect_ratio( mlt_properties properties )
+{
+       double ar = mlt_properties_get_double( properties, "aspect" );
+       AVRational rational = av_d2q( ar, 255 );
+       int width = mlt_properties_get_int( properties, "width" );
+       int height = mlt_properties_get_int( properties, "height" );
+
+       // Update the profile and properties as well since this is an alias
+       // for mlt properties that correspond to profile settings
+       mlt_properties_set_int( properties, "display_aspect_num", rational.num );
+       mlt_properties_set_int( properties, "display_aspect_den", rational.den );
+
+       // Now compute the sample aspect ratio
+       rational = av_d2q( ar * height / FFMAX(width, 1), 255 );
+
+       // Update the profile and properties as well since this is an alias
+       // for mlt properties that correspond to profile settings
+       mlt_properties_set_int( properties, "sample_aspect_num", rational.num );
+       mlt_properties_set_int( properties, "sample_aspect_den", rational.den );
+}
+
 static void property_changed( mlt_properties owner, mlt_consumer self, char *name )
 {
        mlt_properties properties = MLT_CONSUMER_PROPERTIES( self );
@@ -223,27 +244,12 @@ static void property_changed( mlt_properties owner, mlt_consumer self, char *nam
                height = ( height / 2 ) * 2;
                mlt_properties_set_int( properties, "width", width );
                mlt_properties_set_int( properties, "height", height );
+               recompute_aspect_ratio( properties );
        }
        // "-aspect" on ffmpeg command line is display aspect ratio
-       else if ( !strcmp( name, "aspect" ) )
+       else if ( !strcmp( name, "aspect" ) || !strcmp( name, "width" ) || !strcmp( name, "height" ) )
        {
-               double ar = mlt_properties_get_double( properties, "aspect" );
-               AVRational rational = av_d2q( ar, 255 );
-               int width = mlt_properties_get_int( properties, "width" );
-               int height = mlt_properties_get_int( properties, "height" );
-
-               // Update the profile and properties as well since this is an alias
-               // for mlt properties that correspond to profile settings
-               mlt_properties_set_int( properties, "display_aspect_num", rational.num );
-               mlt_properties_set_int( properties, "display_aspect_den", rational.den );
-
-               // Now compute the sample aspect ratio
-               rational = av_d2q( ar * height / FFMAX(width, 1), 255 );
-
-               // Update the profile and properties as well since this is an alias
-               // for mlt properties that correspond to profile settings
-               mlt_properties_set_int( properties, "sample_aspect_num", rational.num );
-               mlt_properties_set_int( properties, "sample_aspect_den", rational.den );
+               recompute_aspect_ratio( properties );
        }
        // Handle the ffmpeg command line "-r" property for frame rate
        else if ( !strcmp( name, "r" ) )
@@ -1232,7 +1238,7 @@ static void *consumer_thread( void *arg )
        if ( filename == NULL || !strcmp( filename, "" ) )
                filename = "pipe:";
 
-#if LIBAVUTIL_VERSION_INT >= ((53<<16)+(2<<8)+0)
+#if defined(FFUDIV) && LIBAVUTIL_VERSION_INT >= ((53<<16)+(2<<8)+0)
        avformat_alloc_output_context2( &oc, fmt, format, filename );
 #else
        oc = avformat_alloc_context( );
@@ -1468,10 +1474,15 @@ static void *consumer_thread( void *arg )
                // Write the stream header.
                if ( mlt_properties_get_int( properties, "running" ) )
 #if LIBAVFORMAT_VERSION_INT >= ((53<<16)+(2<<8)+0)
-                       avformat_write_header( oc, NULL );
+                       if ( avformat_write_header( oc, NULL ) < 0 )
 #else
-                       av_write_header( oc );
+                       if ( av_write_header( oc ) < 0 )
 #endif
+                       {
+                               mlt_log_error( MLT_CONSUMER_SERVICE( consumer ), "Could not write header '%s'\n", filename );
+                               mlt_events_fire( properties, "consumer-fatal-error", NULL );
+                               goto on_fatal_error;
+                       }
        }
 #if LIBAVFORMAT_VERSION_INT < ((53<<16)+(2<<8)+0)
        else
@@ -1628,9 +1639,11 @@ static void *consumer_thread( void *arg )
 #endif
 #if LIBAVCODEC_VERSION_MAJOR >= 54
                                                        audio_avframe->nb_samples = FFMAX( samples, audio_input_nb_samples );
+#if LIBAVCODEC_VERSION_MAJOR >= 55
                                                        if ( audio_codec_id == AV_CODEC_ID_VORBIS )
                                                                audio_avframe->pts = synth_audio_pts;
                                                        synth_audio_pts += audio_avframe->nb_samples;
+#endif
                                                        avcodec_fill_audio_frame( audio_avframe, codec->channels, codec->sample_fmt,
                                                                (const uint8_t*) p, AUDIO_ENCODE_BUFFER_SIZE, 0 );
                                                        int got_packet = 0;
@@ -1718,9 +1731,11 @@ static void *consumer_thread( void *arg )
                                                        }
 #if LIBAVCODEC_VERSION_MAJOR >= 54
                                                        audio_avframe->nb_samples = FFMAX( samples, audio_input_nb_samples );
+#if LIBAVCODEC_VERSION_MAJOR >= 55
                                                        if ( audio_codec_id == AV_CODEC_ID_VORBIS )
                                                                audio_avframe->pts = synth_audio_pts;
                                                        synth_audio_pts += audio_avframe->nb_samples;
+#endif
                                                        avcodec_fill_audio_frame( audio_avframe, codec->channels, codec->sample_fmt,
                                                                (const uint8_t*) audio_buf_2, AUDIO_ENCODE_BUFFER_SIZE, 0 );
                                                        int got_packet = 0;
@@ -2029,9 +2044,11 @@ static void *consumer_thread( void *arg )
 #if LIBAVCODEC_VERSION_MAJOR >= 54
                                pkt.size = audio_outbuf_size;
                                audio_avframe->nb_samples = FFMAX( samples / channels, audio_input_nb_samples );
+#if LIBAVCODEC_VERSION_MAJOR >= 55
                                if ( audio_codec_id == AV_CODEC_ID_VORBIS )
                                        audio_avframe->pts = synth_audio_pts;
                                synth_audio_pts += audio_avframe->nb_samples;
+#endif
                                avcodec_fill_audio_frame( audio_avframe, c->channels, c->sample_fmt,
                                        (const uint8_t*) p, AUDIO_ENCODE_BUFFER_SIZE, 0 );
                                int got_packet = 0;
@@ -2144,7 +2161,10 @@ static void *consumer_thread( void *arg )
        }
 
 on_fatal_error:
-       
+
+       if ( frame )
+               mlt_frame_close( frame );
+
        // Write the trailer, if any
        if ( frames )
                av_write_trailer( oc );