aboutsummaryrefslogtreecommitdiffstats
path: root/ffmpeg.c
diff options
context:
space:
mode:
authorBaptiste Coudurier <baptiste.coudurier@gmail.com>2011-04-16 16:47:24 -0700
committerBaptiste Coudurier <baptiste.coudurier@gmail.com>2011-04-16 16:47:26 -0700
commitabf8342aa94bdf06bb324f6723a6743dd628d5c6 (patch)
treebc2e89f47642c0eaaa2436fbd08d084a0a09168c /ffmpeg.c
parent0ba8485666f532f2dbab716f74e1be1189102c89 (diff)
downloadffmpeg-abf8342aa94bdf06bb324f6723a6743dd628d5c6.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).
Diffstat (limited to 'ffmpeg.c')
-rw-r--r--ffmpeg.c33
1 files changed, 14 insertions, 19 deletions
diff --git a/ffmpeg.c b/ffmpeg.c
index 6eb4912591..2b7cc86f6c 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -151,7 +151,6 @@ static int nb_streamid_map = 0;
static int frame_width = 0;
static int frame_height = 0;
static float frame_aspect_ratio = 0;
-static int frame_aspect_ratio_override = 0;
static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
static int frame_bits_per_raw_sample = 0;
static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
@@ -287,6 +286,8 @@ typedef struct AVOutputStream {
int resample_width;
int resample_pix_fmt;
+ float frame_aspect_ratio;
+
/* full frame size of first frame */
int original_height;
int original_width;
@@ -431,6 +432,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;
@@ -1696,7 +1699,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);
@@ -2243,6 +2246,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;
@@ -2904,7 +2914,6 @@ static void opt_frame_aspect_ratio(const char *arg)
ffmpeg_exit(1);
}
frame_aspect_ratio = ar;
- frame_aspect_ratio_override = 1;
}
static int opt_metadata(const char *opt, const char *arg)
@@ -3342,12 +3351,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_aspect_ratio_override = 0;
frame_pix_fmt = dec->pix_fmt;
rfps = ic->streams[i]->r_frame_rate.num;
rfps_base = ic->streams[i]->r_frame_rate.den;
@@ -3452,7 +3455,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) {
@@ -3472,15 +3474,9 @@ static void new_video_stream(AVFormatContext *oc, int file_idx)
codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
codec = avcodec_find_encoder(codec_id);
}
+ ost->frame_aspect_ratio = frame_aspect_ratio;
+ frame_aspect_ratio = 0;
#if CONFIG_AVFILTER
- if(frame_aspect_ratio_override){
- i = vfilters ? strlen(vfilters) : 0;
- vfilters = av_realloc(vfilters, i+100);
- snprintf(vfilters+i, 100, "%csetdar=%f\n", i?',':' ', frame_aspect_ratio);
- frame_aspect_ratio=0;
- frame_aspect_ratio_override=0;
- }
-
ost->avfilter= vfilters;
vfilters= NULL;
#endif
@@ -3527,7 +3523,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;
video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
st->sample_aspect_ratio = video_enc->sample_aspect_ratio;