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 );
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" ) )
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( );
// 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
#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;
}
#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;
#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;
}
on_fatal_error:
-
+
+ if ( frame )
+ mlt_frame_close( frame );
+
// Write the trailer, if any
if ( frames )
av_write_trailer( oc );