|
|
@ -74,6 +74,9 @@ typedef struct { |
|
|
|
int w; ///< width of the cropped area
|
|
|
|
int w; ///< width of the cropped area
|
|
|
|
int h; ///< height 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 max_step[4]; ///< max pixel step for each plane, expressed as a number of bytes
|
|
|
|
int hsub, vsub; ///< chroma subsampling
|
|
|
|
int hsub, vsub; ///< chroma subsampling
|
|
|
|
char x_expr[256], y_expr[256], ow_expr[256], oh_expr[256]; |
|
|
|
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)); |
|
|
|
av_strlcpy(crop->y_expr, "(in_h-out_h)/2", sizeof(crop->y_expr)); |
|
|
|
|
|
|
|
|
|
|
|
if (args) |
|
|
|
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; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
@ -210,6 +213,14 @@ static int config_input(AVFilterLink *link) |
|
|
|
NULL, NULL, NULL, NULL, 0, ctx)) < 0) |
|
|
|
NULL, NULL, NULL, NULL, 0, ctx)) < 0) |
|
|
|
return AVERROR(EINVAL); |
|
|
|
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", |
|
|
|
av_log(ctx, AV_LOG_INFO, "w:%d h:%d -> w:%d h:%d\n", |
|
|
|
link->w, link->h, crop->w, crop->h); |
|
|
|
link->w, link->h, crop->w, crop->h); |
|
|
|
|
|
|
|
|
|
|
@ -239,6 +250,7 @@ static int config_output(AVFilterLink *link) |
|
|
|
|
|
|
|
|
|
|
|
link->w = crop->w; |
|
|
|
link->w = crop->w; |
|
|
|
link->h = crop->h; |
|
|
|
link->h = crop->h; |
|
|
|
|
|
|
|
link->sample_aspect_ratio = crop->out_sar; |
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|