1
0
mirror of https://github.com/mpv-player/mpv synced 2024-12-23 23:32:26 +00:00

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
This commit is contained in:
kmkaplan 2002-08-04 02:21:50 +00:00
parent 74b1680abf
commit 939d40dd78
3 changed files with 127 additions and 46 deletions

View File

@ -118,6 +118,21 @@ int get_video_colors(sh_video_t *sh_video,char *item,int *value)
return 0;
}
int set_rectangle(sh_video_t *sh_video,int param,int value)
{
vf_instance_t* vf=sh_video->vfilter;
int data[] = {param, value};
mp_dbg(MSGT_DECVIDEO,MSGL_V,"set rectangle \n");
if (vf)
{
int ret = vf->control(vf, VFCTRL_CHANGE_RECTANGLE, data);
if (ret)
return(1);
}
return 0;
}
void uninit_video(sh_video_t *sh_video){
if(!sh_video->inited) return;
mp_msg(MSGT_DECVIDEO,MSGL_V,"uninit video: %d \n",sh_video->codec->driver);

View File

@ -12,5 +12,6 @@ extern int get_video_quality_max(sh_video_t *sh_video);
extern void set_video_quality(sh_video_t *sh_video,int quality);
extern int set_video_colors(sh_video_t *sh_video,char *item,int value);
extern int set_rectangle(sh_video_t *sh_video,int param,int value);
extern int divx_quality;

View File

@ -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)
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];
}
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--) {
*p1 = 0xff - *p1;
++p1;
}
else {
p2 = p1 + (h - 1) * dmpi->stride[0];
while (count--) {
*p1 = 0xff - *p1;
++p1;
*p2 = 0xff - *p2;
++p2;
unsigned int i = bpp;
while (i--)
p[i] = 0xff - p[i];
p += dmpi->stride[0];
}
}
count = h;
p1 = dmpi->planes[0] + y * dmpi->stride[0] + x * bpp;
if (w == 1)
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;
unsigned int i = bpp;
while (i--)
p1[i] ^= 0xff;
p1 += dmpi->stride[0];
}
else {
p2 = p1 + (w - 1) * bpp;
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];
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;
}