changeset 13205:08bb01a9905a

Adds rounding parameter for width and height values returned. Based on idea from <rcooley (at) spamcop (dot) net>.
author reimar
date Mon, 30 Aug 2004 20:39:32 +0000
parents 5f083a9f000e
children 6e8d1ac141fc
files DOCS/man/en/mplayer.1 libmpcodecs/vf_cropdetect.c
diffstat 2 files changed, 41 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- 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]
--- 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;
 }