Mercurial > mplayer.hg
annotate libmpcodecs/ve_qtvideo.c @ 9046:13b7ad16f278
This patch should fix the display problem with 4bpp and 8bpp modes.
The problem was that the new drawing method assumes a linear
framebuffer, which is not available in those modes. This can be worked
around by using the old drawing method, which is what this patch does.
The old method can be forced, by using the "old" driver option.
This patch also enables linear addressing, since it improves write speed
to video memory considerably. The mentioned problem:
"it is not compatable with vga_draw* for some cards"
Is a bug in svgalib, which I think should be fixed in recent svgalib
versions. If someone sees this problem, please report to svgalib
maintainer (that's me).
patch by Matan Ziv-Av. matan@svgalib.org
author | arpi |
---|---|
date | Mon, 20 Jan 2003 21:33:11 +0000 |
parents | c671e9adbe22 |
children | 420e2b2f8e5a |
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 | |
11 #include "../config.h" | |
12 #include "../mp_msg.h" | |
13 #include "../bswap.h" | |
14 | |
15 #ifdef USE_QTX_CODECS | |
16 #include "../loader/qtx/qtxsdk/components.h" | |
17 #include "wine/windef.h" | |
18 | |
8733
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
19 #ifdef USE_WIN32DLL |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
20 #include "ldt_keeper.h" |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
21 #endif |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
22 |
8471 | 23 #include "codec-cfg.h" |
24 #include "stream.h" | |
25 #include "demuxer.h" | |
26 #include "stheader.h" | |
27 | |
8585 | 28 #include "muxer.h" |
8471 | 29 |
30 #include "img_format.h" | |
31 #include "mp_image.h" | |
32 #include "vf.h" | |
33 | |
34 HMODULE WINAPI LoadLibraryA(LPCSTR); | |
35 FARPROC WINAPI GetProcAddress(HMODULE,LPCSTR); | |
36 int WINAPI FreeLibrary(HMODULE); | |
37 static HMODULE handler; | |
38 | |
39 static OSErr (*FindCodec)(CodecType cType, | |
40 CodecComponent specCodec, | |
41 CompressorComponent * compressor, | |
42 DecompressorComponent * decompressor); | |
43 static OSErr (*InitializeQTML)(long flags); | |
44 static PixMapHandle (*GetGWorldPixMap)(GWorldPtr offscreenGWorld); | |
45 static OSErr (*QTNewGWorldFromPtr)(GWorldPtr *gw, | |
46 OSType pixelFormat, | |
47 const Rect *boundsRect, | |
48 CTabHandle cTable, | |
49 /*GDHandle*/void* aGDevice, /*unused anyway*/ | |
50 GWorldFlags flags, | |
51 void *baseAddr, | |
52 long rowBytes); | |
53 static OSErr (*NewHandleClear)(Size byteCount); | |
54 static OSErr (*CompressSequenceBegin) ( | |
55 ImageSequence *seqID, | |
56 PixMapHandle src, | |
57 PixMapHandle prev, | |
58 const Rect *srcRect, | |
59 const Rect *prevRect, | |
60 short colorDepth, | |
61 CodecType cType, | |
62 CompressorComponent codec, | |
63 CodecQ spatialQuality, | |
64 CodecQ temporalQuality, | |
65 long keyFrameRate, | |
66 CTabHandle ctable, | |
67 CodecFlags flags, | |
68 ImageDescriptionHandle desc ); | |
69 | |
70 static OSErr (*CompressSequenceFrame) ( | |
71 ImageSequence seqID, | |
72 PixMapHandle src, | |
73 const Rect *srcRect, | |
74 CodecFlags flags, | |
75 Ptr data, | |
76 long *dataSize, | |
77 UInt8 *similarity, | |
78 ICMCompletionProcRecordPtr asyncCompletionProc ); | |
79 | |
80 static OSErr (*GetMaxCompressionSize)(PixMapHandle src, | |
81 const Rect *srcRect, | |
82 short colorDepth, | |
83 CodecQ quality, | |
84 CodecType cType, | |
85 CompressorComponent codec, | |
86 long *size ); | |
87 static OSErr (*CDSequenceEnd)( ImageSequence seqID ); | |
88 static Component (*FindNextComponent)(Component prev,ComponentDescription* desc); | |
89 static long (*CountComponents)(ComponentDescription* desc); | |
90 static OSErr (*GetComponentInfo)(Component prev,ComponentDescription* desc,Handle h1,Handle h2,Handle h3); | |
91 | |
92 | |
93 | |
94 //static int format=mmioFOURCC('S','V','Q','1'); | |
95 static int format=mmioFOURCC('S','V','Q','3'); | |
96 | |
97 | |
98 | |
99 //static void *frame_in; //input frame | |
100 static void *frame_prev; //previous frame | |
101 static void *frame_comp; //compressed frame | |
102 static GWorldPtr frame_GWorld_in = NULL;//a GWorld is some kind of description for a drawing environment | |
103 static GWorldPtr frame_GWorld_prev = NULL; | |
104 static Rect FrameRect; | |
105 | |
106 static CompressorComponent compressor; | |
107 static DecompressorComponent decompressor; | |
108 static ImageDescriptionHandle desc; | |
109 static ImageSequence seq; | |
110 | |
111 | |
112 | |
113 | |
114 | |
115 struct vf_priv_s { | |
8585 | 116 muxer_stream_t* mux; |
8471 | 117 //dv_encoder_t* enc; |
118 | |
119 }; | |
120 #define mux_v (vf->priv->mux) | |
121 | |
122 //===========================================================================// | |
123 | |
124 static int config(struct vf_instance_s* vf, | |
125 int width, int height, int d_width, int d_height, | |
126 unsigned int flags, unsigned int outfmt){ | |
127 OSErr cres; | |
128 ComponentDescription cdesc; | |
129 mux_v->bih->biWidth=width; | |
130 mux_v->bih->biHeight=height; | |
131 mux_v->bih->biSizeImage=width*height*2; | |
132 | |
133 | |
134 | |
135 memset(&desc,0,sizeof(cdesc)); | |
136 cdesc.componentType= (((unsigned char)'i')<<24)| | |
137 (((unsigned char)'m')<<16)| | |
138 (((unsigned char)'c')<<8)| | |
139 (((unsigned char)'o')); | |
140 | |
141 cdesc.componentSubType=bswap_32(format); | |
142 cdesc.componentManufacturer=0; | |
143 cdesc.componentFlags=0; | |
144 cdesc.componentFlagsMask=0; | |
145 | |
146 | |
147 printf("Count = %d\n",CountComponents(&cdesc)); | |
148 compressor=FindNextComponent(NULL,&cdesc); | |
149 if(!compressor){ | |
150 printf("Cannot find requested component\n"); | |
151 return(0); | |
152 } | |
153 printf("Found it! ID = 0x%X\n",compressor); | |
154 | |
155 // cres= FindCodec (fourcc,anyCodec,&compressor,&decompressor ); | |
156 // printf("FindCodec returned:%i compressor: 0x%X decompressor: 0x%X\n",cres&0xFFFF,compressor,decompressor); | |
157 | |
158 return 1; | |
159 } | |
160 | |
161 static int control(struct vf_instance_s* vf, int request, void* data){ | |
162 | |
163 return CONTROL_UNKNOWN; | |
164 } | |
165 | |
166 static int query_format(struct vf_instance_s* vf, unsigned int fmt){ | |
167 if(fmt==IMGFMT_YUY2) return 3; | |
168 return 0; | |
169 } | |
170 | |
171 static int codec_inited = 0; | |
172 | |
173 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi){ | |
174 | |
175 OSErr cres; | |
176 long framesizemax; | |
8511 | 177 UInt8 similarity=0; |
8471 | 178 long compressedsize; |
179 int in_format=kYUVSPixelFormat; | |
180 int width = mpi->width; | |
181 int height = mpi->height; | |
182 int stride = width*2; | |
183 if(!codec_inited){ | |
184 FrameRect.top=0; | |
185 FrameRect.left=0; | |
186 FrameRect.right=width; | |
187 FrameRect.bottom=height; | |
188 cres = QTNewGWorldFromPtr( | |
189 &frame_GWorld_in, | |
190 in_format, | |
191 &FrameRect, | |
192 0, | |
193 0, | |
194 0, | |
195 mpi->planes[0], | |
196 stride); | |
197 printf("NewGWorldFromPtr returned:%i\n",cres&0xFFFF); | |
198 //dunno what todo about this | |
199 frame_prev = malloc(stride * height); | |
200 cres = QTNewGWorldFromPtr( | |
201 &frame_GWorld_prev, | |
202 in_format, | |
203 &FrameRect, | |
204 0, | |
205 0, | |
206 0, | |
207 frame_prev, | |
208 stride); | |
209 printf("height:%i width:%i stride:%i\n",height,width,stride); | |
210 printf("NewGWorldFromPtr returned:%i\n",cres&0xFFFF); | |
211 cres= GetMaxCompressionSize ( | |
212 GetGWorldPixMap(frame_GWorld_in), | |
213 &FrameRect, | |
214 24, | |
215 codecNormalQuality, | |
216 bswap_32(format), | |
217 compressor, | |
218 &framesizemax ); | |
219 printf("GetMaxCompressionSize returned:%i : MaxSize:%i\n",cres&0xFFFF,framesizemax); | |
220 frame_comp=malloc(framesizemax); | |
8511 | 221 |
8471 | 222 desc = (ImageDescriptionHandle)NewHandleClear(MAX_IDSIZE); //memory where the desc will be stored |
223 (*desc)->idSize=MAX_IDSIZE; | |
224 | |
225 cres= CompressSequenceBegin ( | |
226 &seq, | |
227 GetGWorldPixMap( frame_GWorld_in), | |
228 GetGWorldPixMap( frame_GWorld_prev), | |
229 &FrameRect, | |
230 &FrameRect, | |
231 24, // color depth | |
232 bswap_32(format), // fourcc | |
233 compressor, // codec component | |
234 codecNormalQuality, //codecNormalQuality, | |
235 codecMaxQuality, //codecNormalQuality, | |
8511 | 236 10*30, // keyframe rate |
8471 | 237 0, |
238 0, | |
239 desc); | |
240 printf("CompressSequenceBegin returned:%i\n",cres&0xFFFF); | |
241 printf("Sequence ID:%i\n",seq); | |
242 | |
243 dump_ImageDescription(*desc); | |
244 codec_inited++; | |
245 } | |
246 cres = CompressSequenceFrame ( | |
247 seq, | |
248 GetGWorldPixMap(frame_GWorld_in), | |
249 &FrameRect, | |
250 0, | |
251 (char*)mux_v->buffer, | |
252 &compressedsize, | |
253 &similarity, | |
254 0); | |
255 | |
256 if(cres&0xFFFF)printf("CompressSequenceFrame returned:%i\n",cres&0xFFFF); | |
8511 | 257 #if 0 |
8471 | 258 printf("Size %i->%i \n",stride*height,compressedsize); |
259 printf("Ratio: %i:1\n",(stride*height)/compressedsize); | |
260 #endif | |
9014
c671e9adbe22
Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents:
8733
diff
changeset
|
261 muxer_write_chunk(mux_v, compressedsize , similarity?0:0x10); |
8471 | 262 |
263 if(((*desc)->idSize)>MAX_IDSIZE){ | |
264 printf("FATAL! idSize=%d too big, increase MAX_IDSIZE in ve_qtvideo.c!\n",((*desc)->idSize)); | |
265 } else { | |
266 // according to QT docs, imagedescription may be changed while encoding | |
267 // a frame (even its size may (and does!) change!) | |
268 memcpy(mux_v->bih+1,*desc,(*desc)->idSize); | |
269 } | |
270 | |
271 return 1; | |
272 } | |
273 | |
274 //===========================================================================// | |
275 | |
276 static int vf_open(vf_instance_t *vf, char* args){ | |
277 OSErr cres = 1; | |
278 vf->config=config; | |
279 vf->control=control; | |
280 vf->query_format=query_format; | |
281 vf->put_image=put_image; | |
282 vf->priv=malloc(sizeof(struct vf_priv_s)); | |
283 memset(vf->priv,0,sizeof(struct vf_priv_s)); | |
8585 | 284 vf->priv->mux=(muxer_stream_t*)args; |
8471 | 285 |
286 mux_v->bih=malloc(sizeof(BITMAPINFOHEADER)+MAX_IDSIZE); | |
287 mux_v->bih->biSize=sizeof(BITMAPINFOHEADER)+MAX_IDSIZE; | |
288 mux_v->bih->biWidth=0; | |
289 mux_v->bih->biHeight=0; | |
290 mux_v->bih->biCompression=format; | |
291 mux_v->bih->biPlanes=1; | |
292 mux_v->bih->biBitCount=24; | |
293 | |
294 | |
295 Setup_LDT_Keeper(); | |
296 handler = LoadLibraryA("qtmlClient.dll"); | |
8733
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
297 InitializeQTML = (OSErr (*)(long))GetProcAddress(handler, "InitializeQTML"); |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
298 GetGWorldPixMap = (PixMapHandle (*)(GWorldPtr))GetProcAddress(handler, "GetGWorldPixMap"); |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
299 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
|
300 NewHandleClear = (OSErr(*)(Size))GetProcAddress(handler, "NewHandleClear"); |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
301 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
|
302 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
|
303 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
|
304 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
|
305 CDSequenceEnd = (OSErr (*)(ImageSequence))GetProcAddress(handler,"CDSequenceEnd"); |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
306 FindNextComponent = (Component (*)(Component,ComponentDescription*))GetProcAddress(handler, "FindNextComponent"); |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
307 CountComponents = (long (*)(ComponentDescription*))GetProcAddress(handler, "CountComponents"); |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
308 GetComponentInfo = (OSErr (*)(Component,ComponentDescription*,Handle,Handle,Handle))GetProcAddress(handler, "GetComponentInfo"); |
8471 | 309 if(!InitializeQTML ||!CompressSequenceBegin){ |
310 printf("invalid qt DLL!\n"); | |
311 return 0; | |
312 } | |
313 //printf("%i,%i,%i\n",mmioFOURCC('S','V','Q','1'),'SVQ1',bswap_32(mmioFOURCC('S','V','Q','1'))); | |
314 cres=InitializeQTML(6+16); | |
315 printf("InitializeQTML returned %i\n",cres); | |
316 return 1; | |
317 } | |
318 | |
319 vf_info_t ve_info_qtvideo = { | |
320 "Quicktime video encoder using win32 DLLs", | |
321 "qtvideo", | |
322 "Sascha Sommer", | |
323 "for internal use by mencoder", | |
324 vf_open | |
325 }; | |
326 | |
327 //===========================================================================// | |
328 #endif |