Mercurial > mplayer.hg
annotate libmpcodecs/ve_qtvideo.c @ 22251:f2f62540bd0d
smil over realrtsp
author | rtogni |
---|---|
date | Sun, 18 Feb 2007 22:57:47 +0000 |
parents | ca9da45d13e9 |
children | a033e5519802 |
rev | line source |
---|---|
8471 | 1 /*qt video encoder using win32 libs |
2 released under gnu gpl | |
3 (C)Sascha Sommer */ | |
4 | |
5 #define MAX_IDSIZE 0x6F | |
6 | |
7 #include <stdio.h> | |
8 #include <stdlib.h> | |
9 #include <string.h> | |
10 | |
17012 | 11 #include "config.h" |
12 #include "mp_msg.h" | |
21372 | 13 #include "libavutil/common.h" |
21507
fa99b3d31d13
Hack around libavutil/bswap.h compilation problems due to always_inline undefined.
reimar
parents:
21372
diff
changeset
|
14 #include "mpbswap.h" |
8471 | 15 |
9435 | 16 #ifdef WIN32_LOADER |
9217
420e2b2f8e5a
compiler warning fixes patch by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
9014
diff
changeset
|
17 #include "ldt_keeper.h" |
420e2b2f8e5a
compiler warning fixes patch by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
9014
diff
changeset
|
18 #endif |
420e2b2f8e5a
compiler warning fixes patch by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
9014
diff
changeset
|
19 |
17012 | 20 #include "loader/qtx/qtxsdk/components.h" |
8471 | 21 #include "wine/windef.h" |
22 | |
23 #include "codec-cfg.h" | |
24 #include "stream.h" | |
25 #include "demuxer.h" | |
26 #include "stheader.h" | |
27 | |
21660
ca9da45d13e9
muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents:
21507
diff
changeset
|
28 #include "stream.h" |
8585 | 29 #include "muxer.h" |
8471 | 30 |
31 #include "img_format.h" | |
32 #include "mp_image.h" | |
33 #include "vf.h" | |
34 | |
35 HMODULE WINAPI LoadLibraryA(LPCSTR); | |
36 FARPROC WINAPI GetProcAddress(HMODULE,LPCSTR); | |
37 int WINAPI FreeLibrary(HMODULE); | |
14528
860f06087aac
preload quicktime.qts, this allows us to ignore the hardcoded path inside the dlls so that quicktime.qts doesn't need to be in the windows system dir, patch by Gianluigi Tiesi <mplayer at netfarm.it>, comments by myself
faust3
parents:
13188
diff
changeset
|
38 static HINSTANCE qtime_qts; //handle to preloaded quicktime.qts |
8471 | 39 static HMODULE handler; |
40 | |
41 static OSErr (*FindCodec)(CodecType cType, | |
42 CodecComponent specCodec, | |
43 CompressorComponent * compressor, | |
44 DecompressorComponent * decompressor); | |
45 static OSErr (*InitializeQTML)(long flags); | |
46 static PixMapHandle (*GetGWorldPixMap)(GWorldPtr offscreenGWorld); | |
47 static OSErr (*QTNewGWorldFromPtr)(GWorldPtr *gw, | |
48 OSType pixelFormat, | |
49 const Rect *boundsRect, | |
50 CTabHandle cTable, | |
51 /*GDHandle*/void* aGDevice, /*unused anyway*/ | |
52 GWorldFlags flags, | |
53 void *baseAddr, | |
54 long rowBytes); | |
55 static OSErr (*NewHandleClear)(Size byteCount); | |
56 static OSErr (*CompressSequenceBegin) ( | |
57 ImageSequence *seqID, | |
58 PixMapHandle src, | |
59 PixMapHandle prev, | |
60 const Rect *srcRect, | |
61 const Rect *prevRect, | |
62 short colorDepth, | |
63 CodecType cType, | |
64 CompressorComponent codec, | |
65 CodecQ spatialQuality, | |
66 CodecQ temporalQuality, | |
67 long keyFrameRate, | |
68 CTabHandle ctable, | |
69 CodecFlags flags, | |
70 ImageDescriptionHandle desc ); | |
71 | |
72 static OSErr (*CompressSequenceFrame) ( | |
73 ImageSequence seqID, | |
74 PixMapHandle src, | |
75 const Rect *srcRect, | |
76 CodecFlags flags, | |
77 Ptr data, | |
78 long *dataSize, | |
79 UInt8 *similarity, | |
80 ICMCompletionProcRecordPtr asyncCompletionProc ); | |
81 | |
82 static OSErr (*GetMaxCompressionSize)(PixMapHandle src, | |
83 const Rect *srcRect, | |
84 short colorDepth, | |
85 CodecQ quality, | |
86 CodecType cType, | |
87 CompressorComponent codec, | |
88 long *size ); | |
89 static OSErr (*CDSequenceEnd)( ImageSequence seqID ); | |
90 static Component (*FindNextComponent)(Component prev,ComponentDescription* desc); | |
91 static long (*CountComponents)(ComponentDescription* desc); | |
92 static OSErr (*GetComponentInfo)(Component prev,ComponentDescription* desc,Handle h1,Handle h2,Handle h3); | |
93 | |
94 | |
95 | |
96 //static int format=mmioFOURCC('S','V','Q','1'); | |
97 static int format=mmioFOURCC('S','V','Q','3'); | |
98 | |
99 | |
100 | |
101 //static void *frame_in; //input frame | |
102 static void *frame_prev; //previous frame | |
103 static void *frame_comp; //compressed frame | |
104 static GWorldPtr frame_GWorld_in = NULL;//a GWorld is some kind of description for a drawing environment | |
105 static GWorldPtr frame_GWorld_prev = NULL; | |
106 static Rect FrameRect; | |
107 | |
108 static CompressorComponent compressor; | |
109 static DecompressorComponent decompressor; | |
110 static ImageDescriptionHandle desc; | |
111 static ImageSequence seq; | |
112 | |
113 | |
114 | |
115 | |
116 | |
117 struct vf_priv_s { | |
8585 | 118 muxer_stream_t* mux; |
8471 | 119 //dv_encoder_t* enc; |
120 | |
121 }; | |
122 #define mux_v (vf->priv->mux) | |
123 | |
124 //===========================================================================// | |
125 | |
126 static int config(struct vf_instance_s* vf, | |
127 int width, int height, int d_width, int d_height, | |
128 unsigned int flags, unsigned int outfmt){ | |
129 OSErr cres; | |
130 ComponentDescription cdesc; | |
131 mux_v->bih->biWidth=width; | |
132 mux_v->bih->biHeight=height; | |
133 mux_v->bih->biSizeImage=width*height*2; | |
12061 | 134 mux_v->aspect = (float)d_width/d_height; |
8471 | 135 |
136 | |
137 | |
15274
d42539110db9
typo, memset 0 was done on desc instead of cdesc, see bug #288
reimar
parents:
15212
diff
changeset
|
138 memset(&cdesc,0,sizeof(cdesc)); |
8471 | 139 cdesc.componentType= (((unsigned char)'i')<<24)| |
140 (((unsigned char)'m')<<16)| | |
141 (((unsigned char)'c')<<8)| | |
142 (((unsigned char)'o')); | |
143 | |
144 cdesc.componentSubType=bswap_32(format); | |
145 cdesc.componentManufacturer=0; | |
146 cdesc.componentFlags=0; | |
147 cdesc.componentFlagsMask=0; | |
148 | |
149 | |
17366 | 150 mp_msg(MSGT_MENCODER,MSGL_DBG2,"Count = %ld\n",CountComponents(&cdesc)); |
8471 | 151 compressor=FindNextComponent(NULL,&cdesc); |
152 if(!compressor){ | |
12195
96b366ed15ad
printf -> mp_msg; print error msg when qtmlClient.dll is missing
faust3
parents:
12061
diff
changeset
|
153 mp_msg(MSGT_MENCODER,MSGL_ERR,"Cannot find requested component\n"); |
8471 | 154 return(0); |
155 } | |
17366 | 156 mp_msg(MSGT_MENCODER,MSGL_DBG2,"Found it! ID = %p\n",compressor); |
8471 | 157 |
158 // cres= FindCodec (fourcc,anyCodec,&compressor,&decompressor ); | |
159 // printf("FindCodec returned:%i compressor: 0x%X decompressor: 0x%X\n",cres&0xFFFF,compressor,decompressor); | |
160 | |
161 return 1; | |
162 } | |
163 | |
164 static int control(struct vf_instance_s* vf, int request, void* data){ | |
165 | |
166 return CONTROL_UNKNOWN; | |
167 } | |
168 | |
169 static int query_format(struct vf_instance_s* vf, unsigned int fmt){ | |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
14878
diff
changeset
|
170 if(fmt==IMGFMT_YUY2) return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW; |
8471 | 171 return 0; |
172 } | |
173 | |
174 static int codec_inited = 0; | |
175 | |
17906
20aca9baf5d8
passing pts through the filter layer (lets see if pts or cola comes out at the end)
michael
parents:
17487
diff
changeset
|
176 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){ |
8471 | 177 |
178 OSErr cres; | |
179 long framesizemax; | |
8511 | 180 UInt8 similarity=0; |
8471 | 181 long compressedsize; |
13188 | 182 OSType in_format=kYUVSPixelFormat; |
8471 | 183 int width = mpi->width; |
184 int height = mpi->height; | |
185 int stride = width*2; | |
186 if(!codec_inited){ | |
187 FrameRect.top=0; | |
188 FrameRect.left=0; | |
189 FrameRect.right=width; | |
190 FrameRect.bottom=height; | |
191 cres = QTNewGWorldFromPtr( | |
192 &frame_GWorld_in, | |
193 in_format, | |
194 &FrameRect, | |
195 0, | |
196 0, | |
197 0, | |
198 mpi->planes[0], | |
199 stride); | |
12195
96b366ed15ad
printf -> mp_msg; print error msg when qtmlClient.dll is missing
faust3
parents:
12061
diff
changeset
|
200 mp_msg(MSGT_MENCODER,MSGL_DBG2,"NewGWorldFromPtr returned:%i\n",cres&0xFFFF); |
8471 | 201 //dunno what todo about this |
202 frame_prev = malloc(stride * height); | |
203 cres = QTNewGWorldFromPtr( | |
204 &frame_GWorld_prev, | |
205 in_format, | |
206 &FrameRect, | |
207 0, | |
208 0, | |
209 0, | |
210 frame_prev, | |
211 stride); | |
12195
96b366ed15ad
printf -> mp_msg; print error msg when qtmlClient.dll is missing
faust3
parents:
12061
diff
changeset
|
212 mp_msg(MSGT_MENCODER,MSGL_DBG2,"height:%i width:%i stride:%i\n",height,width,stride); |
96b366ed15ad
printf -> mp_msg; print error msg when qtmlClient.dll is missing
faust3
parents:
12061
diff
changeset
|
213 mp_msg(MSGT_MENCODER,MSGL_DBG2,"NewGWorldFromPtr returned:%i\n",cres&0xFFFF); |
8471 | 214 cres= GetMaxCompressionSize ( |
215 GetGWorldPixMap(frame_GWorld_in), | |
216 &FrameRect, | |
217 24, | |
218 codecNormalQuality, | |
219 bswap_32(format), | |
220 compressor, | |
221 &framesizemax ); | |
17366 | 222 mp_msg(MSGT_MENCODER,MSGL_DBG2,"GetMaxCompressionSize returned:%i : MaxSize:%li\n",cres&0xFFFF,framesizemax); |
8471 | 223 frame_comp=malloc(framesizemax); |
8511 | 224 |
8471 | 225 desc = (ImageDescriptionHandle)NewHandleClear(MAX_IDSIZE); //memory where the desc will be stored |
226 (*desc)->idSize=MAX_IDSIZE; | |
227 | |
228 cres= CompressSequenceBegin ( | |
229 &seq, | |
230 GetGWorldPixMap( frame_GWorld_in), | |
231 GetGWorldPixMap( frame_GWorld_prev), | |
232 &FrameRect, | |
233 &FrameRect, | |
234 24, // color depth | |
235 bswap_32(format), // fourcc | |
236 compressor, // codec component | |
237 codecNormalQuality, //codecNormalQuality, | |
238 codecMaxQuality, //codecNormalQuality, | |
8511 | 239 10*30, // keyframe rate |
8471 | 240 0, |
241 0, | |
242 desc); | |
12195
96b366ed15ad
printf -> mp_msg; print error msg when qtmlClient.dll is missing
faust3
parents:
12061
diff
changeset
|
243 mp_msg(MSGT_MENCODER,MSGL_DBG2,"CompressSequenceBegin returned:%i\n",cres&0xFFFF); |
96b366ed15ad
printf -> mp_msg; print error msg when qtmlClient.dll is missing
faust3
parents:
12061
diff
changeset
|
244 mp_msg(MSGT_MENCODER,MSGL_DBG2,"Sequence ID:%i\n",seq); |
8471 | 245 |
246 dump_ImageDescription(*desc); | |
247 codec_inited++; | |
248 } | |
249 cres = CompressSequenceFrame ( | |
250 seq, | |
251 GetGWorldPixMap(frame_GWorld_in), | |
252 &FrameRect, | |
253 0, | |
254 (char*)mux_v->buffer, | |
255 &compressedsize, | |
256 &similarity, | |
257 0); | |
258 | |
12195
96b366ed15ad
printf -> mp_msg; print error msg when qtmlClient.dll is missing
faust3
parents:
12061
diff
changeset
|
259 if(cres&0xFFFF)mp_msg(MSGT_MENCODER,MSGL_DBG2,"CompressSequenceFrame returned:%i\n",cres&0xFFFF); |
8511 | 260 #if 0 |
8471 | 261 printf("Size %i->%i \n",stride*height,compressedsize); |
262 printf("Ratio: %i:1\n",(stride*height)/compressedsize); | |
263 #endif | |
17487
fa17424b4c7b
change muxer_write_chunk() so that pts/dts _could_ be passed from encoder to muxer
michael
parents:
17366
diff
changeset
|
264 muxer_write_chunk(mux_v, compressedsize , similarity?0:0x10, MP_NOPTS_VALUE, MP_NOPTS_VALUE); |
8471 | 265 |
266 if(((*desc)->idSize)>MAX_IDSIZE){ | |
12195
96b366ed15ad
printf -> mp_msg; print error msg when qtmlClient.dll is missing
faust3
parents:
12061
diff
changeset
|
267 mp_msg(MSGT_MENCODER,MSGL_ERR,"FATAL! idSize=%d too big, increase MAX_IDSIZE in ve_qtvideo.c!\n",((*desc)->idSize)); |
8471 | 268 } else { |
269 // according to QT docs, imagedescription may be changed while encoding | |
270 // a frame (even its size may (and does!) change!) | |
271 memcpy(mux_v->bih+1,*desc,(*desc)->idSize); | |
272 } | |
273 | |
274 return 1; | |
275 } | |
276 | |
277 //===========================================================================// | |
278 | |
279 static int vf_open(vf_instance_t *vf, char* args){ | |
280 OSErr cres = 1; | |
281 vf->config=config; | |
14878 | 282 vf->default_caps=VFCAP_CONSTANT; |
8471 | 283 vf->control=control; |
284 vf->query_format=query_format; | |
285 vf->put_image=put_image; | |
286 vf->priv=malloc(sizeof(struct vf_priv_s)); | |
287 memset(vf->priv,0,sizeof(struct vf_priv_s)); | |
8585 | 288 vf->priv->mux=(muxer_stream_t*)args; |
8471 | 289 |
14549
acf3241be19b
Initialized BITMAPINFOHEADER to 0 to avoid problems, esp. windows has problems
reimar
parents:
14528
diff
changeset
|
290 mux_v->bih=calloc(1, sizeof(BITMAPINFOHEADER)+MAX_IDSIZE); |
8471 | 291 mux_v->bih->biSize=sizeof(BITMAPINFOHEADER)+MAX_IDSIZE; |
292 mux_v->bih->biWidth=0; | |
293 mux_v->bih->biHeight=0; | |
294 mux_v->bih->biCompression=format; | |
295 mux_v->bih->biPlanes=1; | |
296 mux_v->bih->biBitCount=24; | |
297 | |
298 | |
9435 | 299 #ifdef WIN32_LOADER |
8471 | 300 Setup_LDT_Keeper(); |
9435 | 301 #endif |
14528
860f06087aac
preload quicktime.qts, this allows us to ignore the hardcoded path inside the dlls so that quicktime.qts doesn't need to be in the windows system dir, patch by Gianluigi Tiesi <mplayer at netfarm.it>, comments by myself
faust3
parents:
13188
diff
changeset
|
302 //preload quicktime.qts to avoid the problems caused by the hardcoded path inside the dll |
860f06087aac
preload quicktime.qts, this allows us to ignore the hardcoded path inside the dlls so that quicktime.qts doesn't need to be in the windows system dir, patch by Gianluigi Tiesi <mplayer at netfarm.it>, comments by myself
faust3
parents:
13188
diff
changeset
|
303 qtime_qts = LoadLibraryA("QuickTime.qts"); |
860f06087aac
preload quicktime.qts, this allows us to ignore the hardcoded path inside the dlls so that quicktime.qts doesn't need to be in the windows system dir, patch by Gianluigi Tiesi <mplayer at netfarm.it>, comments by myself
faust3
parents:
13188
diff
changeset
|
304 if(!qtime_qts){ |
860f06087aac
preload quicktime.qts, this allows us to ignore the hardcoded path inside the dlls so that quicktime.qts doesn't need to be in the windows system dir, patch by Gianluigi Tiesi <mplayer at netfarm.it>, comments by myself
faust3
parents:
13188
diff
changeset
|
305 mp_msg(MSGT_MENCODER,MSGL_ERR,"unable to load QuickTime.qts\n" ); |
860f06087aac
preload quicktime.qts, this allows us to ignore the hardcoded path inside the dlls so that quicktime.qts doesn't need to be in the windows system dir, patch by Gianluigi Tiesi <mplayer at netfarm.it>, comments by myself
faust3
parents:
13188
diff
changeset
|
306 return 0; |
860f06087aac
preload quicktime.qts, this allows us to ignore the hardcoded path inside the dlls so that quicktime.qts doesn't need to be in the windows system dir, patch by Gianluigi Tiesi <mplayer at netfarm.it>, comments by myself
faust3
parents:
13188
diff
changeset
|
307 } |
860f06087aac
preload quicktime.qts, this allows us to ignore the hardcoded path inside the dlls so that quicktime.qts doesn't need to be in the windows system dir, patch by Gianluigi Tiesi <mplayer at netfarm.it>, comments by myself
faust3
parents:
13188
diff
changeset
|
308 |
8471 | 309 handler = LoadLibraryA("qtmlClient.dll"); |
12195
96b366ed15ad
printf -> mp_msg; print error msg when qtmlClient.dll is missing
faust3
parents:
12061
diff
changeset
|
310 if(!handler){ |
96b366ed15ad
printf -> mp_msg; print error msg when qtmlClient.dll is missing
faust3
parents:
12061
diff
changeset
|
311 mp_msg(MSGT_MENCODER,MSGL_ERR,"unable to load qtmlClient.dll\n"); |
96b366ed15ad
printf -> mp_msg; print error msg when qtmlClient.dll is missing
faust3
parents:
12061
diff
changeset
|
312 return 0; |
96b366ed15ad
printf -> mp_msg; print error msg when qtmlClient.dll is missing
faust3
parents:
12061
diff
changeset
|
313 } |
8733
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
314 InitializeQTML = (OSErr (*)(long))GetProcAddress(handler, "InitializeQTML"); |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
315 GetGWorldPixMap = (PixMapHandle (*)(GWorldPtr))GetProcAddress(handler, "GetGWorldPixMap"); |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
316 QTNewGWorldFromPtr = (OSErr(*)(GWorldPtr *,OSType,const Rect *,CTabHandle,void*,GWorldFlags,void *,long))GetProcAddress(handler, "QTNewGWorldFromPtr"); |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
317 NewHandleClear = (OSErr(*)(Size))GetProcAddress(handler, "NewHandleClear"); |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
318 FindCodec = (OSErr (*)(CodecType,CodecComponent,CompressorComponent *,DecompressorComponent *))GetProcAddress(handler,"FindCodec"); |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
319 CompressSequenceBegin = (OSErr(*)(ImageSequence *,PixMapHandle,PixMapHandle,const Rect *,const Rect *,short,CodecType,CompressorComponent,CodecQ,CodecQ,long,CTabHandle,CodecFlags,ImageDescriptionHandle))GetProcAddress(handler,"CompressSequenceBegin"); |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
320 CompressSequenceFrame = (OSErr(*)(ImageSequence,PixMapHandle,const Rect *,CodecFlags,Ptr,long *,UInt8 *,ICMCompletionProcRecordPtr))GetProcAddress(handler,"CompressSequenceFrame"); |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
321 GetMaxCompressionSize = (OSErr(*)(PixMapHandle,const Rect *,short,CodecQ,CodecType,CompressorComponent,long *))GetProcAddress(handler,"GetMaxCompressionSize"); |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
322 CDSequenceEnd = (OSErr (*)(ImageSequence))GetProcAddress(handler,"CDSequenceEnd"); |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
323 FindNextComponent = (Component (*)(Component,ComponentDescription*))GetProcAddress(handler, "FindNextComponent"); |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
324 CountComponents = (long (*)(ComponentDescription*))GetProcAddress(handler, "CountComponents"); |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
325 GetComponentInfo = (OSErr (*)(Component,ComponentDescription*,Handle,Handle,Handle))GetProcAddress(handler, "GetComponentInfo"); |
8471 | 326 if(!InitializeQTML ||!CompressSequenceBegin){ |
12195
96b366ed15ad
printf -> mp_msg; print error msg when qtmlClient.dll is missing
faust3
parents:
12061
diff
changeset
|
327 mp_msg(MSGT_MENCODER,MSGL_ERR,"invalid qt DLL!\n"); |
8471 | 328 return 0; |
329 } | |
330 //printf("%i,%i,%i\n",mmioFOURCC('S','V','Q','1'),'SVQ1',bswap_32(mmioFOURCC('S','V','Q','1'))); | |
331 cres=InitializeQTML(6+16); | |
12195
96b366ed15ad
printf -> mp_msg; print error msg when qtmlClient.dll is missing
faust3
parents:
12061
diff
changeset
|
332 mp_msg(MSGT_MENCODER,MSGL_DBG2,"InitializeQTML returned %i\n",cres); |
8471 | 333 return 1; |
334 } | |
335 | |
336 vf_info_t ve_info_qtvideo = { | |
337 "Quicktime video encoder using win32 DLLs", | |
338 "qtvideo", | |
339 "Sascha Sommer", | |
340 "for internal use by mencoder", | |
341 vf_open | |
342 }; | |
343 | |
344 //===========================================================================// |