Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2016-08-21 01:01:57 +0300
committerPaul B Mahol <onemda@gmail.com>2016-08-21 11:06:48 +0300
commit4d7d74802d0c857d365f95d7cd712581cce93323 (patch)
tree00c75f47991f9e9e2c67c2987275bc157af746fb /libavfilter/vf_crop.c
parenta3cab3d43387add8914c1c471fc99d733227d81b (diff)
avfilter/vf_crop: make possible to do exact cropping for subsampled videos
Diffstat (limited to 'libavfilter/vf_crop.c')
-rw-r--r--libavfilter/vf_crop.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/libavfilter/vf_crop.c b/libavfilter/vf_crop.c
index 01773fa3cf..bcdbb8cd58 100644
--- a/libavfilter/vf_crop.c
+++ b/libavfilter/vf_crop.c
@@ -82,6 +82,7 @@ typedef struct CropContext {
AVRational out_sar; ///< output sample aspect ratio
int keep_aspect; ///< keep display aspect ratio when cropping
+ int exact; ///< exact cropping, for subsampled formats
int max_step[4]; ///< max pixel step for each plane, expressed as a number of bytes
int hsub, vsub; ///< chroma subsampling
@@ -184,8 +185,11 @@ static int config_input(AVFilterLink *link)
s->w_expr, s->h_expr);
return AVERROR(EINVAL);
}
- s->w &= ~((1 << s->hsub) - 1);
- s->h &= ~((1 << s->vsub) - 1);
+
+ if (!s->exact) {
+ s->w &= ~((1 << s->hsub) - 1);
+ s->h &= ~((1 << s->vsub) - 1);
+ }
av_expr_free(s->x_pexpr);
av_expr_free(s->y_pexpr);
@@ -219,8 +223,10 @@ static int config_input(AVFilterLink *link)
/* set default, required in the case the first computed value for x/y is NAN */
s->x = (link->w - s->w) / 2;
s->y = (link->h - s->h) / 2;
- s->x &= ~((1 << s->hsub) - 1);
- s->y &= ~((1 << s->vsub) - 1);
+ if (!s->exact) {
+ s->x &= ~((1 << s->hsub) - 1);
+ s->y &= ~((1 << s->vsub) - 1);
+ }
return 0;
fail_expr:
@@ -269,8 +275,10 @@ static int filter_frame(AVFilterLink *link, AVFrame *frame)
s->x = link->w - s->w;
if ((unsigned)s->y + (unsigned)s->h > link->h)
s->y = link->h - s->h;
- s->x &= ~((1 << s->hsub) - 1);
- s->y &= ~((1 << s->vsub) - 1);
+ if (!s->exact) {
+ s->x &= ~((1 << s->hsub) - 1);
+ s->y &= ~((1 << s->vsub) - 1);
+ }
av_log(ctx, AV_LOG_TRACE, "n:%d t:%f pos:%f x:%d y:%d x+w:%d y+h:%d\n",
(int)s->var_values[VAR_N], s->var_values[VAR_T], s->var_values[VAR_POS],
@@ -344,6 +352,7 @@ static const AVOption crop_options[] = {
{ "x", "set the x crop area expression", OFFSET(x_expr), AV_OPT_TYPE_STRING, {.str = "(in_w-out_w)/2"}, CHAR_MIN, CHAR_MAX, FLAGS },
{ "y", "set the y crop area expression", OFFSET(y_expr), AV_OPT_TYPE_STRING, {.str = "(in_h-out_h)/2"}, CHAR_MIN, CHAR_MAX, FLAGS },
{ "keep_aspect", "keep aspect ratio", OFFSET(keep_aspect), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
+ { "exact", "do exact cropping", OFFSET(exact), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS },
{ NULL }
};