2 * This file is part of MPlayer.
4 * MPlayer is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * MPlayer is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
36 //===========================================================================//
38 static int config(struct vf_instance
*vf
,
39 int width
, int height
, int d_width
, int d_height
,
40 unsigned int flags
, unsigned int outfmt
){
41 int pixel_stride
= (width
+15)&~15; //FIXME this is ust a guess ... especially for non planar its somewhat bad one
44 if(mpi
->flags
&MP_IMGFLAG_PLANAR
)
45 pixel_stride
= mpi
->stride
[0];
47 pixel_stride
= 8*mpi
->stride
[0] / mpi
->bpp
;
51 if(vf
->priv
->interleave
){
52 vf
->priv
->height
= 2*height
;
53 vf
->priv
->width
= width
- (pixel_stride
/2);
54 vf
->priv
->stridefactor
=1;
56 vf
->priv
->height
= height
/2;
57 vf
->priv
->width
= width
+ pixel_stride
;
58 vf
->priv
->stridefactor
=4;
60 //printf("hX %d %d %d\n", vf->priv->width,vf->priv->height,vf->priv->stridefactor);
62 return vf_next_config(vf
, vf
->priv
->width
, vf
->priv
->height
,
63 (d_width
*vf
->priv
->stridefactor
)>>1, 2*d_height
/vf
->priv
->stridefactor
, flags
, outfmt
);
66 static int put_image(struct vf_instance
*vf
, mp_image_t
*mpi
, double pts
){
67 if(mpi
->flags
&MP_IMGFLAG_DIRECT
){
68 // we've used DR, so we're ready...
69 return vf_next_put_image(vf
,(mp_image_t
*)mpi
->priv
, pts
);
72 vf
->dmpi
=vf_get_image(vf
->next
,mpi
->imgfmt
,
73 MP_IMGTYPE_EXPORT
, MP_IMGFLAG_ACCEPT_STRIDE
,
74 vf
->priv
->width
, vf
->priv
->height
);
76 // set up mpi as a double-stride image of dmpi:
77 vf
->dmpi
->planes
[0]=mpi
->planes
[0];
78 vf
->dmpi
->stride
[0]=(mpi
->stride
[0]*vf
->priv
->stridefactor
)>>1;
79 if(vf
->dmpi
->flags
&MP_IMGFLAG_PLANAR
){
80 vf
->dmpi
->planes
[1]=mpi
->planes
[1];
81 vf
->dmpi
->stride
[1]=(mpi
->stride
[1]*vf
->priv
->stridefactor
)>>1;
82 vf
->dmpi
->planes
[2]=mpi
->planes
[2];
83 vf
->dmpi
->stride
[2]=(mpi
->stride
[2]*vf
->priv
->stridefactor
)>>1;
85 vf
->dmpi
->planes
[1]=mpi
->planes
[1]; // passthru bgr8 palette!!!
87 return vf_next_put_image(vf
,vf
->dmpi
, pts
);
90 //===========================================================================//
92 static void uninit(struct vf_instance
*vf
)
97 static int vf_open(vf_instance_t
*vf
, char *args
){
99 vf
->put_image
=put_image
;
101 vf
->default_reqs
=VFCAP_ACCEPT_STRIDE
;
102 vf
->priv
=calloc(1, sizeof(struct vf_priv_s
));
103 vf
->priv
->interleave
= args
&& (*args
== 'i');
107 const vf_info_t vf_info_fil
= {
108 "fast (de)interleaver",
110 "Michael Niedermayer",
116 //===========================================================================//