summaryrefslogtreecommitdiff
path: root/libavfilter/vf_crop.c
diff options
context:
space:
mode:
authorBaptiste Coudurier <baptiste.coudurier@gmail.com>2012-03-10 04:07:17 +0100
committerMichael Niedermayer <michaelni@gmx.at>2012-03-11 17:46:31 +0100
commitf49cb8e669d9ee3ec97ec7ffa3532c4a6bee3cd0 (patch)
tree8a1a19d56e0c89b6bf85e402372b47088513e0e2 /libavfilter/vf_crop.c
parent84b9b4aa187c5a2aacbbd45c910e5b53eeaa1adf (diff)
vf_crop: keepaspect support
Diffstat (limited to 'libavfilter/vf_crop.c')
-rw-r--r--libavfilter/vf_crop.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/libavfilter/vf_crop.c b/libavfilter/vf_crop.c
index 117cd4397e..c8c4fb24ad 100644
--- a/libavfilter/vf_crop.c
+++ b/libavfilter/vf_crop.c
@@ -74,6 +74,9 @@ typedef struct {
int w; ///< width of the cropped area
int h; ///< height of the cropped area
+ AVRational out_sar; ///< output sample aspect ratio
+ int keep_aspect; ///< keep display aspect ratio when cropping
+
int max_step[4]; ///< max pixel step for each plane, expressed as a number of bytes
int hsub, vsub; ///< chroma subsampling
char x_expr[256], y_expr[256], ow_expr[256], oh_expr[256];
@@ -124,7 +127,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
av_strlcpy(crop->y_expr, "(in_h-out_h)/2", sizeof(crop->y_expr));
if (args)
- sscanf(args, "%255[^:]:%255[^:]:%255[^:]:%255[^:]", crop->ow_expr, crop->oh_expr, crop->x_expr, crop->y_expr);
+ sscanf(args, "%255[^:]:%255[^:]:%255[^:]:%255[^:]:%d", crop->ow_expr, crop->oh_expr, crop->x_expr, crop->y_expr, &crop->keep_aspect);
return 0;
}
@@ -210,6 +213,14 @@ static int config_input(AVFilterLink *link)
NULL, NULL, NULL, NULL, 0, ctx)) < 0)
return AVERROR(EINVAL);
+ if (crop->keep_aspect) {
+ AVRational dar = av_mul_q(link->sample_aspect_ratio,
+ (AVRational){ link->w, link->h });
+ av_reduce(&crop->out_sar.num, &crop->out_sar.den,
+ dar.num * crop->h, dar.den * crop->w, INT_MAX);
+ } else
+ crop->out_sar = link->sample_aspect_ratio;
+
av_log(ctx, AV_LOG_INFO, "w:%d h:%d -> w:%d h:%d\n",
link->w, link->h, crop->w, crop->h);
@@ -239,6 +250,7 @@ static int config_output(AVFilterLink *link)
link->w = crop->w;
link->h = crop->h;
+ link->sample_aspect_ratio = crop->out_sar;
return 0;
}