8 #include "libvo/fastmemcpy.h"
15 config(struct vf_instance_s
* vf
,
16 int width
, int height
, int d_width
, int d_height
,
17 unsigned int flags
, unsigned int outfmt
)
19 if (vf
->priv
->w
< 0 || width
< vf
->priv
->w
)
21 if (vf
->priv
->h
< 0 || height
< vf
->priv
->h
)
24 vf
->priv
->x
= (width
- vf
->priv
->w
) / 2;
26 vf
->priv
->y
= (height
- vf
->priv
->h
) / 2;
27 if (vf
->priv
->w
+ vf
->priv
->x
> width
28 || vf
->priv
->h
+ vf
->priv
->y
> height
) {
29 mp_msg(MSGT_VFILTER
,MSGL_WARN
,"rectangle: bad position/width/height - rectangle area is out of the original!\n");
32 return vf_next_config(vf
, width
, height
, d_width
, d_height
, flags
, outfmt
);
36 control(struct vf_instance_s
* vf
, int request
, void *data
)
38 const int *const tmp
= data
;
40 case VFCTRL_CHANGE_RECTANGLE
:
43 vf
->priv
->w
+= tmp
[1];
47 vf
->priv
->h
+= tmp
[1];
51 vf
->priv
->x
+= tmp
[1];
55 vf
->priv
->y
+= tmp
[1];
59 mp_msg(MSGT_VFILTER
,MSGL_FATAL
,"Unknown param %d \n", tmp
[0]);
63 return vf_next_control(vf
, request
, data
);
67 put_image(struct vf_instance_s
* vf
, mp_image_t
* mpi
, double pts
){
69 unsigned int bpp
= mpi
->bpp
/ 8;
70 unsigned int x
, y
, w
, h
;
71 dmpi
= vf_get_image(vf
->next
, mpi
->imgfmt
, MP_IMGTYPE_TEMP
,
72 MP_IMGFLAG_ACCEPT_STRIDE
| MP_IMGFLAG_PREFER_ALIGNED_STRIDE
,
75 memcpy_pic(dmpi
->planes
[0],mpi
->planes
[0],mpi
->w
*bpp
, mpi
->h
,
76 dmpi
->stride
[0],mpi
->stride
[0]);
77 if(mpi
->flags
&MP_IMGFLAG_PLANAR
&& mpi
->flags
&MP_IMGFLAG_YUV
){
78 memcpy_pic(dmpi
->planes
[1],mpi
->planes
[1],
79 mpi
->w
>>mpi
->chroma_x_shift
, mpi
->h
>>mpi
->chroma_y_shift
,
80 dmpi
->stride
[1],mpi
->stride
[1]);
81 memcpy_pic(dmpi
->planes
[2],mpi
->planes
[2],
82 mpi
->w
>>mpi
->chroma_x_shift
, mpi
->h
>>mpi
->chroma_y_shift
,
83 dmpi
->stride
[2],mpi
->stride
[2]);
86 /* Draw the rectangle */
88 mp_msg(MSGT_VFILTER
,MSGL_INFO
, "rectangle: -vf rectangle=%d:%d:%d:%d \n", vf
->priv
->w
, vf
->priv
->h
, vf
->priv
->x
, vf
->priv
->y
);
92 else if (dmpi
->width
< vf
->priv
->x
)
96 if (vf
->priv
->x
+ vf
->priv
->w
- 1 < 0)
97 w
= vf
->priv
->x
+ vf
->priv
->w
- 1 - x
;
98 else if (dmpi
->width
< vf
->priv
->x
+ vf
->priv
->w
- 1)
101 w
= vf
->priv
->x
+ vf
->priv
->w
- 1 - x
;
104 else if (dmpi
->height
< vf
->priv
->y
)
108 if (vf
->priv
->y
+ vf
->priv
->h
- 1 < 0)
109 h
= vf
->priv
->y
+ vf
->priv
->h
- 1 - y
;
110 else if (dmpi
->height
< vf
->priv
->y
+ vf
->priv
->h
- 1)
111 h
= dmpi
->height
- y
;
113 h
= vf
->priv
->y
+ vf
->priv
->h
- 1 - y
;
115 if (0 <= vf
->priv
->y
&& vf
->priv
->y
<= dmpi
->height
) {
116 unsigned char *p
= dmpi
->planes
[0] + y
* dmpi
->stride
[0] + x
* bpp
;
117 unsigned int count
= w
* bpp
;
119 p
[count
] = 0xff - p
[count
];
121 if (h
!= 1 && vf
->priv
->y
+ vf
->priv
->h
- 1 <= mpi
->height
) {
122 unsigned char *p
= dmpi
->planes
[0] + (vf
->priv
->y
+ vf
->priv
->h
- 1) * dmpi
->stride
[0] + x
* bpp
;
123 unsigned int count
= w
* bpp
;
125 p
[count
] = 0xff - p
[count
];
127 if (0 <= vf
->priv
->x
&& vf
->priv
->x
<= dmpi
->width
) {
128 unsigned char *p
= dmpi
->planes
[0] + y
* dmpi
->stride
[0] + x
* bpp
;
129 unsigned int count
= h
;
131 unsigned int i
= bpp
;
134 p
+= dmpi
->stride
[0];
137 if (w
!= 1 && vf
->priv
->x
+ vf
->priv
->w
- 1 <= mpi
->width
) {
138 unsigned char *p
= dmpi
->planes
[0] + y
* dmpi
->stride
[0] + (vf
->priv
->x
+ vf
->priv
->w
- 1) * bpp
;
139 unsigned int count
= h
;
141 unsigned int i
= bpp
;
144 p
+= dmpi
->stride
[0];
147 return vf_next_put_image(vf
, dmpi
, pts
);
151 open(vf_instance_t
* vf
, char* args
) {
153 vf
->control
= control
;
154 vf
->put_image
= put_image
;
155 vf
->priv
= malloc(sizeof(struct vf_priv_s
));
161 sscanf(args
, "%d:%d:%d:%d",
162 &vf
->priv
->w
, &vf
->priv
->h
, &vf
->priv
->x
, &vf
->priv
->y
);
166 vf_info_t vf_info_rectangle
= {