10 #include "img_format.h"
14 #include "libvo/fastmemcpy.h"
15 #include "postproc/rgb2rgb.h"
24 static int checkline(unsigned char* src
,int stride
,int len
,int bpp
){
30 total
+=src
[0]; src
+=stride
;
36 total
+=src
[0]+src
[1]+src
[2]; src
+=stride
;
42 // printf("total=%d\n",total);
46 //===========================================================================//
48 static int config(struct vf_instance_s
* vf
,
49 int width
, int height
, int d_width
, int d_height
,
50 unsigned int flags
, unsigned int outfmt
){
51 vf
->priv
->x1
=width
- 1;
52 vf
->priv
->y1
=height
- 1;
56 return vf_next_config(vf
,width
,height
,d_width
,d_height
,flags
,outfmt
);
59 static int put_image(struct vf_instance_s
* vf
, mp_image_t
*mpi
, double pts
){
62 int w
,h
,x
,y
,shrink_by
;
64 // hope we'll get DR buffer:
65 dmpi
=vf_get_image(vf
->next
,mpi
->imgfmt
,
69 dmpi
->planes
[0]=mpi
->planes
[0];
70 dmpi
->planes
[1]=mpi
->planes
[1];
71 dmpi
->planes
[2]=mpi
->planes
[2];
72 dmpi
->stride
[0]=mpi
->stride
[0];
73 dmpi
->stride
[1]=mpi
->stride
[1];
74 dmpi
->stride
[2]=mpi
->stride
[2];
75 dmpi
->width
=mpi
->width
;
76 dmpi
->height
=mpi
->height
;
78 if(++vf
->priv
->fno
>2){ // ignore first 2 frames - they may be empty
80 for(y
=0;y
<vf
->priv
->y1
;y
++){
81 if(checkline(mpi
->planes
[0]+mpi
->stride
[0]*y
,bpp
,mpi
->w
,bpp
)>vf
->priv
->limit
){
87 for(y
=mpi
->h
-1;y
>vf
->priv
->y2
;y
--){
88 if(checkline(mpi
->planes
[0]+mpi
->stride
[0]*y
,bpp
,mpi
->w
,bpp
)>vf
->priv
->limit
){
94 for(y
=0;y
<vf
->priv
->x1
;y
++){
95 if(checkline(mpi
->planes
[0]+bpp
*y
,mpi
->stride
[0],mpi
->h
,bpp
)>vf
->priv
->limit
){
101 for(y
=mpi
->w
-1;y
>vf
->priv
->x2
;y
--){
102 if(checkline(mpi
->planes
[0]+bpp
*y
,mpi
->stride
[0],mpi
->h
,bpp
)>vf
->priv
->limit
){
108 // round x and y (up), important for yuv colorspaces
109 // make sure they stay rounded!
110 x
=(vf
->priv
->x1
+1)&(~1);
111 y
=(vf
->priv
->y1
+1)&(~1);
113 w
= vf
->priv
->x2
- x
+ 1;
114 h
= vf
->priv
->y2
- y
+ 1;
116 // w and h must be divisible by 2 as well because of yuv
117 // colorspace problems.
118 if (vf
->priv
->round
<= 1)
119 vf
->priv
->round
= 16;
120 if (vf
->priv
->round
% 2)
121 vf
->priv
->round
*= 2;
123 shrink_by
= w
% vf
->priv
->round
;
125 x
+= (shrink_by
/ 2 + 1) & ~1;
127 shrink_by
= h
% vf
->priv
->round
;
129 y
+= (shrink_by
/ 2 + 1) & ~1;
131 mp_msg(MSGT_VFILTER
, MSGL_INFO
, MSGTR_MPCODECS_CropArea
,
132 vf
->priv
->x1
,vf
->priv
->x2
,
133 vf
->priv
->y1
,vf
->priv
->y2
,
139 return vf_next_put_image(vf
,dmpi
, pts
);
142 static int query_format(struct vf_instance_s
* vf
, unsigned int fmt
) {
144 // the default limit value works only right with YV12 right now.
146 return vf_next_query_format(vf
, fmt
);
150 //===========================================================================//
152 static int open(vf_instance_t
*vf
, char* args
){
154 vf
->put_image
=put_image
;
155 vf
->query_format
=query_format
;
156 vf
->priv
=malloc(sizeof(struct vf_priv_s
));
157 vf
->priv
->limit
=24; // should be option
159 if(args
) sscanf(args
, "%d:%d",
165 vf_info_t vf_info_cropdetect
= {
166 "autodetect crop size",
174 //===========================================================================//