X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Favformat%2Fconsumer_avformat.c;h=fbe91e89e020c8d354fca84e961e0fccac14e85a;hb=4c7f6cfcb34ddde69112a2d877eb4fb6c380091a;hp=d2c6fe137f33ea32be1268c7454d92f9e6f69dfc;hpb=cd230b098f1ebeec1f08049b0112779f01f97daa;p=melted diff --git a/src/modules/avformat/consumer_avformat.c b/src/modules/avformat/consumer_avformat.c index d2c6fe1..fbe91e8 100644 --- a/src/modules/avformat/consumer_avformat.c +++ b/src/modules/avformat/consumer_avformat.c @@ -429,7 +429,6 @@ static AVStream *add_video_stream( mlt_consumer this, AVFormatContext *oc, int c if ( st != NULL ) { char *pix_fmt = mlt_properties_get( properties, "pix_fmt" ); - double ar = mlt_properties_get_double( properties, "display_ratio" ); AVCodecContext *c = st->codec; // Establish defaults from AVOptions @@ -451,11 +450,51 @@ static AVStream *add_video_stream( mlt_consumer this, AVFormatContext *oc, int c // Set options controlled by MLT c->width = mlt_properties_get_int( properties, "width" ); c->height = mlt_properties_get_int( properties, "height" ); - c->sample_aspect_ratio = av_d2q( ar * c->height / c->width , 255); c->time_base.num = mlt_properties_get_int( properties, "frame_rate_den" ); c->time_base.den = mlt_properties_get_int( properties, "frame_rate_num" ); c->pix_fmt = pix_fmt ? avcodec_get_pix_fmt( pix_fmt ) : PIX_FMT_YUV420P; + if ( codec_id == CODEC_ID_DVVIDEO ) + { + // Compensate for FFmpeg's notion of DV aspect ratios, which are + // based upon a width of 704. Since we do not have a normaliser + // that crops (nor is cropping 720 wide ITU-R 601 video always desirable) + // we just coerce the values to facilitate a passive behaviour through + // the rescale normaliser when using equivalent producers and consumers. + // = display_aspect / (width * height) + double ar = mlt_properties_get_double( properties, "aspect_ratio" ); + if ( ar == 8.0/9.0 ) // 4:3 NTSC + { + c->sample_aspect_ratio.num = 10; + c->sample_aspect_ratio.den = 11; + } + else if ( ar == 16.0/15.0 ) // 4:3 PAL + { + c->sample_aspect_ratio.num = 159; + c->sample_aspect_ratio.den = 54; + } + else if ( ar == 32.0/27.0 ) // 16:9 NTSC + { + c->sample_aspect_ratio.num = 40; + c->sample_aspect_ratio.den = 33; + } + else // 16:9 PAL + { + c->sample_aspect_ratio.num = 118; + c->sample_aspect_ratio.den = 81; + } + } + else if ( mlt_properties_get( properties, "aspect" ) ) + { + double ar = mlt_properties_get_double( properties, "aspect" ); + c->sample_aspect_ratio = av_d2q( ar * c->height / c->width , 255); + } + else + { + c->sample_aspect_ratio.num = mlt_properties_get_int( properties, "sample_aspect_num" ); + c->sample_aspect_ratio.den = mlt_properties_get_int( properties, "sample_aspect_den" ); + } + if ( mlt_properties_get_double( properties, "qscale" ) > 0 ) { c->flags |= CODEC_FLAG_QSCALE; @@ -760,13 +799,7 @@ static void *consumer_thread( void *arg ) // Check for audio codec overides if ( acodec != NULL ) { - AVCodec *p = first_avcodec; - while( p != NULL ) - { - if ( !strcmp( p->name, acodec ) && p->type == CODEC_TYPE_AUDIO ) - break; - p = p->next; - } + AVCodec *p = avcodec_find_encoder_by_name( acodec ); if ( p != NULL ) audio_codec_id = p->id; else @@ -776,13 +809,7 @@ static void *consumer_thread( void *arg ) // Check for video codec overides if ( vcodec != NULL ) { - AVCodec *p = first_avcodec; - while( p != NULL ) - { - if ( !strcmp( p->name, vcodec ) && p->type == CODEC_TYPE_VIDEO ) - break; - p = p->next; - } + AVCodec *p = avcodec_find_encoder_by_name( vcodec ); if ( p != NULL ) video_codec_id = p->id; else