# HG changeset patch # User reimar # Date 1093898372 0 # Node ID 08bb01a9905a656c639cd85bc6099d72a3cb64a0 # Parent 5f083a9f000eb4cbdd4ccd1fafdfca0467fcd3d3 Adds rounding parameter for width and height values returned. Based on idea from . diff -r 5f083a9f000e -r 08bb01a9905a DOCS/man/en/mplayer.1 --- a/DOCS/man/en/mplayer.1 Mon Aug 30 20:34:25 2004 +0000 +++ b/DOCS/man/en/mplayer.1 Mon Aug 30 20:39:32 2004 +0000 @@ -3317,12 +3317,24 @@ .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 -r 5f083a9f000e -r 08bb01a9905a libmpcodecs/vf_cropdetect.c --- a/libmpcodecs/vf_cropdetect.c Mon Aug 30 20:34:25 2004 +0000 +++ b/libmpcodecs/vf_cropdetect.c Mon Aug 30 20:39:32 2004 +0000 @@ -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 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 @@ } } + // 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 @@ 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; }