From f49cb8e669d9ee3ec97ec7ffa3532c4a6bee3cd0 Mon Sep 17 00:00:00 2001 From: Baptiste Coudurier Date: Sat, 10 Mar 2012 04:07:17 +0100 Subject: [PATCH] vf_crop: keepaspect support --- libavfilter/vf_crop.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) 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; }