Mercurial > mplayer.hg
annotate libmpcodecs/ve_qtvideo.c @ 10916:c36db88bfbc4
Subtitle alignment & smart splitting by Salvatore Falco
author | henry |
---|---|
date | Sun, 21 Sep 2003 13:20:06 +0000 |
parents | 97b30b4b722f |
children | 656a1b45b309 |
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 | |
9435 | 15 #ifdef WIN32_LOADER |
9217
420e2b2f8e5a
compiler warning fixes patch by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
9014
diff
changeset
|
16 #include "ldt_keeper.h" |
420e2b2f8e5a
compiler warning fixes patch by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
9014
diff
changeset
|
17 #endif |
420e2b2f8e5a
compiler warning fixes patch by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
9014
diff
changeset
|
18 |
8471 | 19 #ifdef USE_QTX_CODECS |
20 #include "../loader/qtx/qtxsdk/components.h" | |
21 #include "wine/windef.h" | |
22 | |
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 | |
9435 | 295 #ifdef WIN32_LOADER |
8471 | 296 Setup_LDT_Keeper(); |
9435 | 297 #endif |
8471 | 298 handler = LoadLibraryA("qtmlClient.dll"); |
8733
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
299 InitializeQTML = (OSErr (*)(long))GetProcAddress(handler, "InitializeQTML"); |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
300 GetGWorldPixMap = (PixMapHandle (*)(GWorldPtr))GetProcAddress(handler, "GetGWorldPixMap"); |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
301 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
|
302 NewHandleClear = (OSErr(*)(Size))GetProcAddress(handler, "NewHandleClear"); |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
303 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
|
304 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
|
305 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
|
306 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
|
307 CDSequenceEnd = (OSErr (*)(ImageSequence))GetProcAddress(handler,"CDSequenceEnd"); |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
308 FindNextComponent = (Component (*)(Component,ComponentDescription*))GetProcAddress(handler, "FindNextComponent"); |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
309 CountComponents = (long (*)(ComponentDescription*))GetProcAddress(handler, "CountComponents"); |
478561617705
compiler warning fixes by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8585
diff
changeset
|
310 GetComponentInfo = (OSErr (*)(Component,ComponentDescription*,Handle,Handle,Handle))GetProcAddress(handler, "GetComponentInfo"); |
8471 | 311 if(!InitializeQTML ||!CompressSequenceBegin){ |
312 printf("invalid qt DLL!\n"); | |
313 return 0; | |
314 } | |
315 //printf("%i,%i,%i\n",mmioFOURCC('S','V','Q','1'),'SVQ1',bswap_32(mmioFOURCC('S','V','Q','1'))); | |
316 cres=InitializeQTML(6+16); | |
317 printf("InitializeQTML returned %i\n",cres); | |
318 return 1; | |
319 } | |
320 | |
321 vf_info_t ve_info_qtvideo = { | |
322 "Quicktime video encoder using win32 DLLs", | |
323 "qtvideo", | |
324 "Sascha Sommer", | |
325 "for internal use by mencoder", | |
326 vf_open | |
327 }; | |
328 | |
329 //===========================================================================// | |
330 #endif |