diff options
author | reimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2004-08-30 20:39:32 +0000 |
---|---|---|
committer | reimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2004-08-30 20:39:32 +0000 |
commit | 264676faef933805754c958c5f0be13ee39620dd (patch) | |
tree | 0ff947a975504716a96eb95a5eb38dad9a50183b /libmpcodecs | |
parent | 7d0af8ba2727515a58ad25567018f0072613e16e (diff) | |
download | mpv-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.c | 31 |
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; } |