aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBaptiste Coudurier <baptiste.coudurier@gmail.com>2011-04-01 17:30:45 +0200
committerAlex Converse <alex.converse@gmail.com>2011-05-16 14:13:03 -0700
commit901ff51116f831c9082e14c80c7481dd3999aa30 (patch)
tree4cc095090c03682cd006b522a4ff653577cc20f9
parent9d5fa6182dd2e41d5c174b29ef2a1a2f83a02d23 (diff)
downloadffmpeg-901ff51116f831c9082e14c80c7481dd3999aa30.tar.gz
ffmpeg: fix -aspect cli option
Redesign the way -aspect option is handled. This is done by making ffmpeg read the sample aspect ratio set in the corresponding input stream by default, and overriding it using the value specified by -aspect. If the output display aspect ratio is specified with -aspect, it is set at the end of the filterchain, thus overriding the value set by filters in the filterchain. This implementation is more robust, since does not modify the filterchain description (which was creating potential syntax errors). (Cherry-pick abf8342aa94bdf06bb324f6723a6743dd628d5c6) Another aspect ratio fix try. This leaves the setdar addition at the end (preferred by people). (Cherry-pick e7c7b0d000e81d24327602e04d8fed400dbb7193)
-rw-r--r--ffmpeg.c29
1 files changed, 14 insertions, 15 deletions
diff --git a/ffmpeg.c b/ffmpeg.c
index 828e7f1414..c99c4de024 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -274,6 +274,8 @@ typedef struct AVOutputStream {
int resample_width;
int resample_pix_fmt;
+ float frame_aspect_ratio;
+
/* forced key frames */
int64_t *forced_kf_pts;
int forced_kf_count;
@@ -411,6 +413,8 @@ static int configure_video_filters(AVInputStream *ist, AVOutputStream *ost)
codec->width = ost->output_video_filter->inputs[0]->w;
codec->height = ost->output_video_filter->inputs[0]->h;
codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
+ ost->frame_aspect_ratio ? // overriden by the -aspect cli option
+ av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
ost->output_video_filter->inputs[0]->sample_aspect_ratio;
return 0;
@@ -1623,7 +1627,7 @@ static int output_packet(AVInputStream *ist, int ist_index,
break;
case AVMEDIA_TYPE_VIDEO:
#if CONFIG_AVFILTER
- if (ost->picref->video)
+ if (ost->picref->video && !ost->frame_aspect_ratio)
ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
#endif
do_video_out(os, ost, ist, &picture, &frame_size);
@@ -2132,6 +2136,13 @@ static int transcode(AVFormatContext **output_files,
codec->width = icodec->width;
codec->height = icodec->height;
codec->has_b_frames = icodec->has_b_frames;
+ if (!codec->sample_aspect_ratio.num) {
+ codec->sample_aspect_ratio =
+ ost->st->sample_aspect_ratio =
+ ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
+ ist->st->codec->sample_aspect_ratio.num ?
+ ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
+ }
break;
case AVMEDIA_TYPE_SUBTITLE:
codec->width = icodec->width;
@@ -3220,11 +3231,6 @@ static void opt_input_file(const char *filename)
set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM, input_codecs[nb_input_codecs-1]);
frame_height = dec->height;
frame_width = dec->width;
- if(ic->streams[i]->sample_aspect_ratio.num)
- frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
- else
- frame_aspect_ratio=av_q2d(dec->sample_aspect_ratio);
- frame_aspect_ratio *= (float) dec->width / dec->height;
frame_pix_fmt = dec->pix_fmt;
rfps = ic->streams[i]->r_frame_rate.num;
rfps_base = ic->streams[i]->r_frame_rate.den;
@@ -3337,7 +3343,6 @@ static void new_video_stream(AVFormatContext *oc, int file_idx)
AVCodecContext *video_enc;
enum CodecID codec_id = CODEC_ID_NONE;
AVCodec *codec= NULL;
- int i;
st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
if (!st) {
@@ -3358,14 +3363,9 @@ static void new_video_stream(AVFormatContext *oc, int file_idx)
codec = avcodec_find_encoder(codec_id);
}
+ ost->frame_aspect_ratio = frame_aspect_ratio;
+ frame_aspect_ratio = 0;
#if CONFIG_AVFILTER
- if (frame_aspect_ratio > 0){
- i = vfilters ? strlen(vfilters) : 0;
- vfilters = av_realloc(vfilters, i+100);
- snprintf(vfilters+i, i+100, "%csetdar=%f\n", i?',':' ', frame_aspect_ratio);
- frame_aspect_ratio=0;
- }
-
ost->avfilter= vfilters;
vfilters = NULL;
#endif
@@ -3412,7 +3412,6 @@ static void new_video_stream(AVFormatContext *oc, int file_idx)
video_enc->width = frame_width;
video_enc->height = frame_height;
- video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
video_enc->pix_fmt = frame_pix_fmt;
st->sample_aspect_ratio = video_enc->sample_aspect_ratio;