summaryrefslogtreecommitdiffstats
path: root/libmpcodecs/vf_rectangle.c
diff options
context:
space:
mode:
authorkmkaplan <kmkaplan@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-08-04 02:21:50 +0000
committerkmkaplan <kmkaplan@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-08-04 02:21:50 +0000
commit939d40dd788120d7ff0ef6dff51fdf40b188299e (patch)
treec85704db552b82edb318abcea2cb7d644f23a79b /libmpcodecs/vf_rectangle.c
parent74b1680abf7466c34ac304c5bd2c3a95b96d8084 (diff)
downloadmpv-939d40dd788120d7ff0ef6dff51fdf40b188299e.tar.bz2
mpv-939d40dd788120d7ff0ef6dff51fdf40b188299e.tar.xz
Add the control VFCTRL_CHANGE_RECTANGLE
print the rectangle boundaries. vf_rectangle accepts stride. Is this correct? git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@6888 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpcodecs/vf_rectangle.c')
-rw-r--r--libmpcodecs/vf_rectangle.c157
1 files changed, 111 insertions, 46 deletions
diff --git a/libmpcodecs/vf_rectangle.c b/libmpcodecs/vf_rectangle.c
index b55b2e7cf2..10ba44de09 100644
--- a/libmpcodecs/vf_rectangle.c
+++ b/libmpcodecs/vf_rectangle.c
@@ -1,5 +1,6 @@
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include "mp_image.h"
#include "vf.h"
@@ -7,66 +8,130 @@ struct vf_priv_s {
int x, y, w, h;
};
+static int
+config(struct vf_instance_s* vf,
+ int width, int height, int d_width, int d_height,
+ unsigned int flags, unsigned int outfmt)
+{
+ if (vf->priv->w < 0 || width < vf->priv->w)
+ vf->priv->w = width;
+ if (vf->priv->h < 0 || height < vf->priv->h)
+ vf->priv->h = height;
+ if (vf->priv->x < 0)
+ vf->priv->x = (width - vf->priv->w) / 2;
+ if (vf->priv->y < 0)
+ vf->priv->y = (height - vf->priv->h) / 2;
+ if (vf->priv->w + vf->priv->x > width
+ || vf->priv->h + vf->priv->y > height) {
+ fprintf(stderr, "rectangle: bad position/width/height - rectangle area is out of the original!\n");
+ return 0;
+ }
+ return vf_next_config(vf, width, height, d_width, d_height, flags, outfmt);
+}
+
+static int
+control(struct vf_instance_s* vf, int request, void *data)
+{
+ const int *const tmp = data;
+ switch(request){
+ case VFCTRL_CHANGE_RECTANGLE:
+ switch (tmp[0]){
+ case 0:
+ vf->priv->w += tmp[1];
+ return 1;
+ break;
+ case 1:
+ vf->priv->h += tmp[1];
+ return 1;
+ break;
+ case 2:
+ vf->priv->x += tmp[1];
+ return 1;
+ break;
+ case 3:
+ vf->priv->y += tmp[1];
+ return 1;
+ break;
+ default:
+ fprintf(stderr, "Unknown param %d \n", tmp[0]);
+ return 0;
+ }
+ }
+ return vf_next_control(vf, request, data);
+ return 0;
+}
static void
put_image(struct vf_instance_s* vf, mp_image_t* mpi){
mp_image_t* dmpi;
- int x, y, w, h;
- unsigned int bpp, count;
- unsigned char *p1, *p2;
- dmpi = vf_get_image(vf->next, mpi->imgfmt, MP_IMGTYPE_TEMP, 0, mpi->w, mpi->h);
+ unsigned int bpp;
+ unsigned int x, y, w, h;
+ dmpi = vf_get_image(vf->next, mpi->imgfmt, MP_IMGTYPE_TEMP,
+ MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_PREFER_ALIGNED_STRIDE,
+ mpi->w, mpi->h);
bpp = dmpi->bpp / 8;
memcpy(dmpi->planes[0], mpi->planes[0], dmpi->stride[0] * bpp * mpi->height);
memcpy(dmpi->planes[1], mpi->planes[1], dmpi->stride[1] * mpi->chroma_height);
memcpy(dmpi->planes[2], mpi->planes[2], dmpi->stride[2] * mpi->chroma_height);
/* Draw the rectangle */
- x = vf->priv->x;
- if (x < 0)
+
+ fprintf(stderr, "rectangle: -vop crop=%d:%d:%d:%d \n", vf->priv->w, vf->priv->h, vf->priv->x, vf->priv->y);
+
+ if (vf->priv->x < 0)
x = 0;
- y = vf->priv->y;
- if (y < 0)
+ else if (dmpi->width < vf->priv->x)
+ x = dmpi->width;
+ else
+ x = vf->priv->x;
+ if (vf->priv->x + vf->priv->w - 1 < 0)
+ w = vf->priv->x + vf->priv->w - 1 - x;
+ else if (dmpi->width < vf->priv->x + vf->priv->w - 1)
+ w = dmpi->width - x;
+ else
+ w = vf->priv->x + vf->priv->w - 1 - x;
+ if (vf->priv->y < 0)
y = 0;
- w = vf->priv->w;
- if (w < 0)
- w = dmpi->w - x;
- h = vf->priv->h;
- if (h < 0)
- h = dmpi->h - y;
- count = w * bpp;
- p1 = dmpi->planes[0] + y * dmpi->stride[0] + x * bpp;
- if (h == 1)
- while (count--) {
- *p1 = 0xff - *p1;
- ++p1;
- }
- else {
- p2 = p1 + (h - 1) * dmpi->stride[0];
- while (count--) {
- *p1 = 0xff - *p1;
- ++p1;
- *p2 = 0xff - *p2;
- ++p2;
- }
+ else if (dmpi->height < vf->priv->y)
+ y = dmpi->height;
+ else
+ y = vf->priv->y;
+ if (vf->priv->y + vf->priv->h - 1 < 0)
+ h = vf->priv->y + vf->priv->h - 1 - y;
+ else if (dmpi->height < vf->priv->y + vf->priv->h - 1)
+ h = dmpi->height - y;
+ else
+ h = vf->priv->y + vf->priv->h - 1 - y;
+
+ if (0 <= vf->priv->y && vf->priv->y <= dmpi->height) {
+ unsigned char *p = dmpi->planes[0] + y * dmpi->stride[0] + x * bpp;
+ unsigned int count = w * bpp;
+ while (count--)
+ p[count] = 0xff - p[count];
+ }
+ if (h != 1 && vf->priv->y + vf->priv->h - 1 <= mpi->height) {
+ unsigned char *p = dmpi->planes[0] + (vf->priv->y + vf->priv->h - 1) * dmpi->stride[0] + x * bpp;
+ unsigned int count = w * bpp;
+ while (count--)
+ p[count] = 0xff - p[count];
}
- count = h;
- p1 = dmpi->planes[0] + y * dmpi->stride[0] + x * bpp;
- if (w == 1)
+ if (0 <= vf->priv->x && vf->priv->x <= dmpi->width) {
+ unsigned char *p = dmpi->planes[0] + y * dmpi->stride[0] + x * bpp;
+ unsigned int count = h;
while (count--) {
- int i = bpp;
+ unsigned int i = bpp;
while (i--)
- p1[i] ^= 0xff;
- p1 += dmpi->stride[0];
+ p[i] = 0xff - p[i];
+ p += dmpi->stride[0];
}
- else {
- p2 = p1 + (w - 1) * bpp;
+ }
+ if (w != 1 && vf->priv->x + vf->priv->w - 1 <= mpi->width) {
+ unsigned char *p = dmpi->planes[0] + y * dmpi->stride[0] + (vf->priv->x + vf->priv->w - 1) * bpp;
+ unsigned int count = h;
while (count--) {
- int i = bpp;
- while (i--) {
- p1[i] = 0xff - p1[i];
- p2[i] = 0xff - p2[i];
- }
- p1 += dmpi->stride[0];
- p2 += dmpi->stride[0];
+ unsigned int i = bpp;
+ while (i--)
+ p[i] = 0xff - p[i];
+ p += dmpi->stride[0];
}
}
vf_next_put_image(vf, dmpi);
@@ -74,6 +139,8 @@ put_image(struct vf_instance_s* vf, mp_image_t* mpi){
static int
open(vf_instance_t* vf, char* args) {
+ vf->config = config;
+ vf->control = control;
vf->put_image = put_image;
vf->priv = malloc(sizeof(struct vf_priv_s));
vf->priv->x = -1;
@@ -83,8 +150,6 @@ open(vf_instance_t* vf, char* args) {
if (args)
sscanf(args, "%d:%d:%d:%d",
&vf->priv->w, &vf->priv->h, &vf->priv->x, &vf->priv->y);
- printf("Crop: %d x %d, %d ; %d\n",
- vf->priv->w, vf->priv->h, vf->priv->x, vf->priv->y);
return 1;
}