summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/man/en/mplayer.116
-rw-r--r--libmpcodecs/vf_cropdetect.c31
2 files changed, 41 insertions, 6 deletions
diff --git a/DOCS/man/en/mplayer.1 b/DOCS/man/en/mplayer.1
index 6c2c3abb6b..4982a66cc0 100644
--- a/DOCS/man/en/mplayer.1
+++ b/DOCS/man/en/mplayer.1
@@ -3317,12 +3317,24 @@ Position of the cropped picture, defaults to center.
.PD 1
.
.TP
-.B cropdetect[=0\-255]
+.B cropdetect[=limit:round]
Calculates necessary cropping parameters and prints the recommended parameters
to stdout.
-The threshold can be optionally specified from nothing (0) to everything
+.PD 0
+.RSs
+.IPs limit
+threshold, which can be optionally specified from nothing (0) to everything
(255).
(default: 24)
+.br
+.IPs round
+value which the width/height should be divisible by.
+The offset is automatically adjusted to center the video.
+Use \'2\' to get only even dimentions (needed for 4:2:2 video).
+\'16\' is best when encoding to most video codecs.
+(default: 16)
+.RE
+.PD 1
.
.TP
.B rectangle[=w:h:x:y]
diff --git a/libmpcodecs/vf_cropdetect.c b/libmpcodecs/vf_cropdetect.c
index 251cabd046..1911d580d5 100644
--- a/libmpcodecs/vf_cropdetect.c
+++ b/libmpcodecs/vf_cropdetect.c
@@ -16,6 +16,7 @@
struct vf_priv_s {
int x1,y1,x2,y2;
int limit;
+ int round;
int fno;
};
@@ -57,7 +58,7 @@ static int config(struct vf_instance_s* vf,
static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){
mp_image_t *dmpi;
int bpp=mpi->bpp/8;
- int x,y;
+ int w,h,x,y,shrink_by;
// hope we'll get DR buffer:
dmpi=vf_get_image(vf->next,mpi->imgfmt,
@@ -103,14 +104,34 @@ if(++vf->priv->fno>2){ // ignore first 2 frames - they may be empty
}
}
+ // round x and y (up), important for yuv colorspaces
+ // make sure they stay rounded!
x=(vf->priv->x1+1)&(~1);
y=(vf->priv->y1+1)&(~1);
+ w = vf->priv->x2 - x;
+ h = vf->priv->y2 - y;
+
+ // w and h must be divisible by 2 as well because of yuv
+ // colorspace problems.
+ if (vf->priv->round <= 1)
+ vf->priv->round = 16;
+ if (vf->priv->round % 2)
+ vf->priv->round *= 2;
+
+ shrink_by = w % vf->priv->round;
+ w -= shrink_by;
+ x += (shrink_by / 2 + 1) & ~1;
+
+ shrink_by = h % vf->priv->round;
+ h -= shrink_by;
+ y += (shrink_by / 2 + 1) & ~1;
+
printf("crop area: X: %d..%d Y: %d..%d (-vf crop=%d:%d:%d:%d)\n",
vf->priv->x1,vf->priv->x2,
vf->priv->y1,vf->priv->y2,
- (vf->priv->x2+1-x)&(~1),(vf->priv->y2+1-y)&(~1),x,y
- );
+ w,h,x,y);
+
}
@@ -124,7 +145,9 @@ static int open(vf_instance_t *vf, char* args){
vf->put_image=put_image;
vf->priv=malloc(sizeof(struct vf_priv_s));
vf->priv->limit=24; // should be option
- if(args) vf->priv->limit=atoi(args);
+ if(args) sscanf(args, "%d:%d",
+ &vf->priv->limit,
+ &vf->priv->round);
return 1;
}