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:
parent
74b1680abf
commit
939d40dd78
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user