summaryrefslogtreecommitdiffstats
path: root/libmpcodecs
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2004-08-30 20:39:32 +0000
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2004-08-30 20:39:32 +0000
commit264676faef933805754c958c5f0be13ee39620dd (patch)
tree0ff947a975504716a96eb95a5eb38dad9a50183b /libmpcodecs
parent7d0af8ba2727515a58ad25567018f0072613e16e (diff)
downloadmpv-264676faef933805754c958c5f0be13ee39620dd.tar.bz2
mpv-264676faef933805754c958c5f0be13ee39620dd.tar.xz
Adds rounding parameter for width and height values returned.
Based on idea from <rcooley (at) spamcop (dot) net>. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@13206 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpcodecs')
-rw-r--r--libmpcodecs/vf_cropdetect.c31
1 files changed, 27 insertions, 4 deletions
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;
}