Mercurial > mplayer.hg
annotate libmpcodecs/vd_qtvideo.c @ 21836:7c5e893dff54
Make sure we do not crash when eof is reset, e.g. due to an attempt to seek.
author | reimar |
---|---|
date | Sun, 07 Jan 2007 19:23:59 +0000 |
parents | a5daafb2c201 |
children | a033e5519802 |
rev | line source |
---|---|
8160 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
21263
db9754cebfab
Move #include <QuickTime/ImageCodec.h> before internal headers
uau
parents:
18771
diff
changeset
|
3 #include <inttypes.h> |
8160 | 4 |
5 #include "config.h" | |
6 | |
21263
db9754cebfab
Move #include <QuickTime/ImageCodec.h> before internal headers
uau
parents:
18771
diff
changeset
|
7 #ifdef MACOSX |
db9754cebfab
Move #include <QuickTime/ImageCodec.h> before internal headers
uau
parents:
18771
diff
changeset
|
8 #include <QuickTime/ImageCodec.h> |
db9754cebfab
Move #include <QuickTime/ImageCodec.h> before internal headers
uau
parents:
18771
diff
changeset
|
9 #define dump_ImageDescription(x) |
21264
a5daafb2c201
Fix previous broken vd_qtvideo.c commit which failed on MACOSX
uau
parents:
21263
diff
changeset
|
10 #endif |
21263
db9754cebfab
Move #include <QuickTime/ImageCodec.h> before internal headers
uau
parents:
18771
diff
changeset
|
11 |
12356
6a61d694f7d3
minimal fix for alex's 1000000000000l compile errors. imo the fix in
rfelker
parents:
12194
diff
changeset
|
12 #include "wine/windef.h" |
8160 | 13 |
14 #include "mp_msg.h" | |
15 #include "vd_internal.h" | |
16 | |
9405
a4444e7ee56a
real cygwin support by Sascha Sommer <saschasommer@freenet.de>
alex
parents:
8473
diff
changeset
|
17 #ifdef WIN32_LOADER |
8451 | 18 #include "ldt_keeper.h" |
19 #endif | |
20 | |
8160 | 21 static vd_info_t info = { |
22 "Quicktime Video decoder", | |
23 "qtvideo", | |
24 "A'rpi", | |
12194
81f8e4f97b38
printf -> mp_msg, error msg when qtmlClient.dll is missing
faust3
parents:
9502
diff
changeset
|
25 "Sascha Sommer", |
8160 | 26 "win32" |
27 }; | |
28 | |
29 LIBVD_EXTERN(qtvideo) | |
30 | |
17012 | 31 #include "bswap.h" |
9502
241bba8f60e8
MACOSX support patch, based on Dan Christiansens work
alex
parents:
9405
diff
changeset
|
32 |
21264
a5daafb2c201
Fix previous broken vd_qtvideo.c commit which failed on MACOSX
uau
parents:
21263
diff
changeset
|
33 #ifndef MACOSX |
a5daafb2c201
Fix previous broken vd_qtvideo.c commit which failed on MACOSX
uau
parents:
21263
diff
changeset
|
34 #include "qtx/qtxsdk/components.h" |
a5daafb2c201
Fix previous broken vd_qtvideo.c commit which failed on MACOSX
uau
parents:
21263
diff
changeset
|
35 |
8160 | 36 HMODULE WINAPI LoadLibraryA(LPCSTR); |
37 FARPROC WINAPI GetProcAddress(HMODULE,LPCSTR); | |
38 int WINAPI FreeLibrary(HMODULE); | |
9502
241bba8f60e8
MACOSX support patch, based on Dan Christiansens work
alex
parents:
9405
diff
changeset
|
39 #endif |
8160 | 40 |
41 //static ComponentDescription desc; // for FindNextComponent() | |
42 static ComponentInstance ci=NULL; // codec handle | |
43 //static CodecInfo cinfo; // for ImageCodecGetCodecInfo() | |
44 //Component prev=NULL; | |
45 //ComponentResult cres; // | |
46 static CodecCapabilities codeccap; // for decpar | |
47 static CodecDecompressParams decpar; // for ImageCodecPreDecompress() | |
48 //static ImageSubCodecDecompressCapabilities icap; // for ImageCodecInitialize() | |
49 static Rect OutBufferRect; //the dimensions of our GWorld | |
50 | |
51 static GWorldPtr OutBufferGWorld = NULL;//a GWorld is some kind of description for a drawing environment | |
52 static ImageDescriptionHandle framedescHandle; | |
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:
13606
diff
changeset
|
53 static HINSTANCE qtime_qts; // handle to the preloaded quicktime.qts |
8160 | 54 static HMODULE handler; |
55 | |
18771
a1807995e2ab
Move #ifdefs around complete files into the build system.
diego
parents:
18766
diff
changeset
|
56 #if !defined(MACOSX) |
8160 | 57 static Component (*FindNextComponent)(Component prev,ComponentDescription* desc); |
58 static OSErr (*GetComponentInfo)(Component prev,ComponentDescription* desc,Handle h1,Handle h2,Handle h3); | |
59 static long (*CountComponents)(ComponentDescription* desc); | |
60 static OSErr (*InitializeQTML)(long flags); | |
61 static OSErr (*EnterMovies)(void); | |
62 static ComponentInstance (*OpenComponent)(Component c); | |
63 static ComponentResult (*ImageCodecInitialize)(ComponentInstance ci, | |
64 ImageSubCodecDecompressCapabilities * cap); | |
65 static ComponentResult (*ImageCodecBeginBand)(ComponentInstance ci, | |
66 CodecDecompressParams * params, | |
67 ImageSubCodecDecompressRecord * drp, | |
68 long flags); | |
69 static ComponentResult (*ImageCodecDrawBand)(ComponentInstance ci, | |
70 ImageSubCodecDecompressRecord * drp); | |
71 static ComponentResult (*ImageCodecEndBand)(ComponentInstance ci, | |
72 ImageSubCodecDecompressRecord * drp, | |
73 OSErr result, | |
74 long flags); | |
75 static ComponentResult (*ImageCodecGetCodecInfo)(ComponentInstance ci, | |
76 CodecInfo * info); | |
77 static ComponentResult (*ImageCodecPreDecompress)(ComponentInstance ci, | |
78 CodecDecompressParams * params); | |
79 static ComponentResult (*ImageCodecBandDecompress)(ComponentInstance ci, | |
80 CodecDecompressParams * params); | |
81 static PixMapHandle (*GetGWorldPixMap)(GWorldPtr offscreenGWorld); | |
82 static OSErr (*QTNewGWorldFromPtr)(GWorldPtr *gw, | |
83 OSType pixelFormat, | |
84 const Rect *boundsRect, | |
85 CTabHandle cTable, | |
86 /*GDHandle*/void* aGDevice, //unused anyway | |
87 GWorldFlags flags, | |
88 void *baseAddr, | |
89 long rowBytes); | |
90 static OSErr (*NewHandleClear)(Size byteCount); | |
18771
a1807995e2ab
Move #ifdefs around complete files into the build system.
diego
parents:
18766
diff
changeset
|
91 #endif /* #if !defined(MACOSX) */ |
8160 | 92 |
93 // to set/get/query special features/parameters | |
94 static int control(sh_video_t *sh,int cmd,void* arg,...){ | |
95 return CONTROL_UNKNOWN; | |
96 } | |
97 | |
98 static int codec_inited=0; | |
99 | |
100 // init driver | |
101 static int init(sh_video_t *sh){ | |
102 long result = 1; | |
103 ComponentResult cres; | |
104 ComponentDescription desc; | |
105 Component prev=NULL; | |
106 CodecInfo cinfo; // for ImageCodecGetCodecInfo() | |
107 ImageSubCodecDecompressCapabilities icap; // for ImageCodecInitialize() | |
108 | |
9502
241bba8f60e8
MACOSX support patch, based on Dan Christiansens work
alex
parents:
9405
diff
changeset
|
109 #ifdef MACOSX |
241bba8f60e8
MACOSX support patch, based on Dan Christiansens work
alex
parents:
9405
diff
changeset
|
110 EnterMovies(); |
241bba8f60e8
MACOSX support patch, based on Dan Christiansens work
alex
parents:
9405
diff
changeset
|
111 #else |
241bba8f60e8
MACOSX support patch, based on Dan Christiansens work
alex
parents:
9405
diff
changeset
|
112 |
9405
a4444e7ee56a
real cygwin support by Sascha Sommer <saschasommer@freenet.de>
alex
parents:
8473
diff
changeset
|
113 #ifdef WIN32_LOADER |
8270 | 114 Setup_LDT_Keeper(); |
115 #endif | |
116 | |
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:
13606
diff
changeset
|
117 //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:
13606
diff
changeset
|
118 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:
13606
diff
changeset
|
119 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:
13606
diff
changeset
|
120 mp_msg(MSGT_DECVIDEO,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:
13606
diff
changeset
|
121 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:
13606
diff
changeset
|
122 } |
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:
13606
diff
changeset
|
123 |
8160 | 124 handler = LoadLibraryA("qtmlClient.dll"); |
12194
81f8e4f97b38
printf -> mp_msg, error msg when qtmlClient.dll is missing
faust3
parents:
9502
diff
changeset
|
125 if(!handler){ |
81f8e4f97b38
printf -> mp_msg, error msg when qtmlClient.dll is missing
faust3
parents:
9502
diff
changeset
|
126 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"unable to load qtmlClient.dll\n"); |
81f8e4f97b38
printf -> mp_msg, error msg when qtmlClient.dll is missing
faust3
parents:
9502
diff
changeset
|
127 return 0; |
81f8e4f97b38
printf -> mp_msg, error msg when qtmlClient.dll is missing
faust3
parents:
9502
diff
changeset
|
128 } |
8160 | 129 |
8451 | 130 InitializeQTML = (OSErr (*)(long))GetProcAddress(handler, "InitializeQTML"); |
131 EnterMovies = (OSErr (*)(void))GetProcAddress(handler, "EnterMovies"); | |
132 FindNextComponent = (Component (*)(Component,ComponentDescription*))GetProcAddress(handler, "FindNextComponent"); | |
133 CountComponents = (long (*)(ComponentDescription*))GetProcAddress(handler, "CountComponents"); | |
134 GetComponentInfo = (OSErr (*)(Component,ComponentDescription*,Handle,Handle,Handle))GetProcAddress(handler, "GetComponentInfo"); | |
135 OpenComponent = (ComponentInstance (*)(Component))GetProcAddress(handler, "OpenComponent"); | |
136 ImageCodecInitialize = (ComponentResult (*)(ComponentInstance,ImageSubCodecDecompressCapabilities *))GetProcAddress(handler, "ImageCodecInitialize"); | |
137 ImageCodecGetCodecInfo = (ComponentResult (*)(ComponentInstance,CodecInfo *))GetProcAddress(handler, "ImageCodecGetCodecInfo"); | |
138 ImageCodecBeginBand = (ComponentResult (*)(ComponentInstance,CodecDecompressParams *,ImageSubCodecDecompressRecord *,long))GetProcAddress(handler, "ImageCodecBeginBand"); | |
139 ImageCodecPreDecompress = (ComponentResult (*)(ComponentInstance,CodecDecompressParams *))GetProcAddress(handler, "ImageCodecPreDecompress"); | |
140 ImageCodecBandDecompress = (ComponentResult (*)(ComponentInstance,CodecDecompressParams *))GetProcAddress(handler, "ImageCodecBandDecompress"); | |
141 GetGWorldPixMap = (PixMapHandle (*)(GWorldPtr))GetProcAddress(handler, "GetGWorldPixMap"); | |
142 QTNewGWorldFromPtr = (OSErr(*)(GWorldPtr *,OSType,const Rect *,CTabHandle,void*,GWorldFlags,void *,long))GetProcAddress(handler, "QTNewGWorldFromPtr"); | |
143 NewHandleClear = (OSErr(*)(Size))GetProcAddress(handler, "NewHandleClear"); | |
8160 | 144 // = GetProcAddress(handler, ""); |
145 | |
146 if(!InitializeQTML || !EnterMovies || !FindNextComponent || !ImageCodecBandDecompress){ | |
12194
81f8e4f97b38
printf -> mp_msg, error msg when qtmlClient.dll is missing
faust3
parents:
9502
diff
changeset
|
147 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"invalid qtmlClient.dll!\n"); |
8160 | 148 return 0; |
149 } | |
150 | |
8162
98951b7331e1
no need to EnterMovies(), do minimal InitializeQTML only
arpi
parents:
8160
diff
changeset
|
151 result=InitializeQTML(6+16); |
98951b7331e1
no need to EnterMovies(), do minimal InitializeQTML only
arpi
parents:
8160
diff
changeset
|
152 // result=InitializeQTML(0); |
17366 | 153 mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"InitializeQTML returned %li\n",result); |
8162
98951b7331e1
no need to EnterMovies(), do minimal InitializeQTML only
arpi
parents:
8160
diff
changeset
|
154 // result=EnterMovies(); |
98951b7331e1
no need to EnterMovies(), do minimal InitializeQTML only
arpi
parents:
8160
diff
changeset
|
155 // printf("EnterMovies->%d\n",result); |
18766 | 156 #endif /* MACOSX */ |
8160 | 157 |
8428 | 158 #if 0 |
159 memset(&desc,0,sizeof(desc)); | |
160 while((prev=FindNextComponent(prev,&desc))){ | |
161 ComponentDescription desc2; | |
162 unsigned char* c1=&desc2.componentType; | |
163 unsigned char* c2=&desc2.componentSubType; | |
164 memset(&desc2,0,sizeof(desc2)); | |
165 // printf("juhee %p (%p)\n",prev,&desc); | |
166 GetComponentInfo(prev,&desc2,NULL,NULL,NULL); | |
12194
81f8e4f97b38
printf -> mp_msg, error msg when qtmlClient.dll is missing
faust3
parents:
9502
diff
changeset
|
167 mp_msg(MSGT_DECVIDEO,MSGL_DGB2,"DESC: %c%c%c%c/%c%c%c%c [0x%X/0x%X] 0x%X\n", |
8428 | 168 c1[3],c1[2],c1[1],c1[0], |
169 c2[3],c2[2],c2[1],c2[0], | |
170 desc2.componentType,desc2.componentSubType, | |
171 desc2.componentFlags); | |
172 } | |
173 #endif | |
174 | |
175 | |
8160 | 176 memset(&desc,0,sizeof(desc)); |
177 desc.componentType= (((unsigned char)'i')<<24)| | |
178 (((unsigned char)'m')<<16)| | |
179 (((unsigned char)'d')<<8)| | |
180 (((unsigned char)'c')); | |
8282 | 181 #if 0 |
8160 | 182 desc.componentSubType= |
183 (((unsigned char)'S'<<24))| | |
184 (((unsigned char)'V')<<16)| | |
185 (((unsigned char)'Q')<<8)| | |
186 (((unsigned char)'3')); | |
8282 | 187 #else |
188 desc.componentSubType = bswap_32(sh->format); | |
189 #endif | |
8160 | 190 desc.componentManufacturer=0; |
191 desc.componentFlags=0; | |
192 desc.componentFlagsMask=0; | |
193 | |
17366 | 194 mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"Count = %ld\n",CountComponents(&desc)); |
8160 | 195 prev=FindNextComponent(NULL,&desc); |
196 if(!prev){ | |
12194
81f8e4f97b38
printf -> mp_msg, error msg when qtmlClient.dll is missing
faust3
parents:
9502
diff
changeset
|
197 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"Cannot find requested component\n"); |
8282 | 198 return(0); |
8160 | 199 } |
17366 | 200 mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"Found it! ID = %p\n",prev); |
8160 | 201 |
202 ci=OpenComponent(prev); | |
12194
81f8e4f97b38
printf -> mp_msg, error msg when qtmlClient.dll is missing
faust3
parents:
9502
diff
changeset
|
203 mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"ci=%p\n",ci); |
8160 | 204 |
205 memset(&icap,0,sizeof(icap)); | |
206 cres=ImageCodecInitialize(ci,&icap); | |
17366 | 207 mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"ImageCodecInitialize->%#x size=%d (%d)\n",cres,icap.recordSize,icap.decompressRecordSize); |
8160 | 208 |
209 memset(&cinfo,0,sizeof(cinfo)); | |
210 cres=ImageCodecGetCodecInfo(ci,&cinfo); | |
12194
81f8e4f97b38
printf -> mp_msg, error msg when qtmlClient.dll is missing
faust3
parents:
9502
diff
changeset
|
211 mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"Flags: compr: 0x%X decomp: 0x%X format: 0x%X\n", |
8160 | 212 cinfo.compressFlags, cinfo.decompressFlags, cinfo.formatFlags); |
12194
81f8e4f97b38
printf -> mp_msg, error msg when qtmlClient.dll is missing
faust3
parents:
9502
diff
changeset
|
213 mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"Codec name: %.*s\n",((unsigned char*)&cinfo.typeName)[0], |
8160 | 214 ((unsigned char*)&cinfo.typeName)+1); |
215 | |
216 //make a yuy2 gworld | |
217 OutBufferRect.top=0; | |
218 OutBufferRect.left=0; | |
219 OutBufferRect.right=sh->disp_w; | |
220 OutBufferRect.bottom=sh->disp_h; | |
221 | |
222 //Fill the imagedescription for our SVQ3 frame | |
223 //we can probably get this from Demuxer | |
224 #if 0 | |
225 framedescHandle=(ImageDescriptionHandle)NewHandleClear(sizeof(ImageDescription)+200); | |
226 printf("framedescHandle=%p *p=%p\n",framedescHandle,*framedescHandle); | |
227 { FILE* f=fopen("/root/.wine/fake_windows/IDesc","r"); | |
228 if(!f) printf("filenot found: IDesc\n"); | |
229 fread(*framedescHandle,sizeof(ImageDescription)+200,1,f); | |
230 fclose(f); | |
231 } | |
232 #else | |
8471 | 233 if(!sh->ImageDesc) sh->ImageDesc=(sh->bih+1); // hack for SVQ3-in-AVI |
12194
81f8e4f97b38
printf -> mp_msg, error msg when qtmlClient.dll is missing
faust3
parents:
9502
diff
changeset
|
234 mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"ImageDescription size: %d\n",((ImageDescription*)(sh->ImageDesc))->idSize); |
8301 | 235 framedescHandle=(ImageDescriptionHandle)NewHandleClear(((ImageDescription*)(sh->ImageDesc))->idSize); |
236 memcpy(*framedescHandle,sh->ImageDesc,((ImageDescription*)(sh->ImageDesc))->idSize); | |
8471 | 237 dump_ImageDescription(*framedescHandle); |
8160 | 238 #endif |
239 //Find codecscomponent for video decompression | |
240 // result = FindCodec ('SVQ1',anyCodec,&compressor,&decompressor ); | |
241 // printf("FindCodec SVQ1 returned:%i compressor: 0x%X decompressor: 0x%X\n",result,compressor,decompressor); | |
242 | |
13188 | 243 sh->context = (void *)kYUVSPixelFormat; |
8301 | 244 #if 1 |
8282 | 245 { |
246 int imgfmt = sh->codec->outfmt[sh->outfmtidx]; | |
247 int qt_imgfmt; | |
248 switch(imgfmt) | |
249 { | |
250 case IMGFMT_YUY2: | |
251 qt_imgfmt = kYUVSPixelFormat; | |
252 break; | |
253 case IMGFMT_YVU9: | |
8301 | 254 qt_imgfmt = 0x73797639; //kYVU9PixelFormat; |
255 break; | |
256 case IMGFMT_YV12: | |
257 qt_imgfmt = 0x79343230; | |
8282 | 258 break; |
259 case IMGFMT_UYVY: | |
260 qt_imgfmt = kUYVY422PixelFormat; | |
261 break; | |
262 case IMGFMT_YVYU: | |
263 qt_imgfmt = kYVYU422PixelFormat; | |
264 imgfmt = IMGFMT_YUY2; | |
265 break; | |
266 case IMGFMT_RGB16: | |
267 qt_imgfmt = k16LE555PixelFormat; | |
268 break; | |
269 case IMGFMT_BGR24: | |
270 qt_imgfmt = k24BGRPixelFormat; | |
271 break; | |
272 case IMGFMT_BGR32: | |
273 qt_imgfmt = k32BGRAPixelFormat; | |
274 break; | |
275 case IMGFMT_RGB32: | |
276 qt_imgfmt = k32RGBAPixelFormat; | |
277 break; | |
278 default: | |
12194
81f8e4f97b38
printf -> mp_msg, error msg when qtmlClient.dll is missing
faust3
parents:
9502
diff
changeset
|
279 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"Unknown requested csp\n"); |
8282 | 280 return(0); |
281 } | |
17366 | 282 mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"imgfmt: %s qt_imgfmt: %.4s\n", vo_format_name(imgfmt), (char *)&qt_imgfmt); |
13188 | 283 sh->context = (void *)qt_imgfmt; |
8282 | 284 if(!mpcodecs_config_vo(sh,sh->disp_w,sh->disp_h,imgfmt)) return 0; |
285 } | |
286 #else | |
8160 | 287 if(!mpcodecs_config_vo(sh,sh->disp_w,sh->disp_h,IMGFMT_YUY2)) return 0; |
8282 | 288 #endif |
8160 | 289 |
290 return 1; | |
291 } | |
292 | |
293 // uninit driver | |
294 static void uninit(sh_video_t *sh){ | |
9502
241bba8f60e8
MACOSX support patch, based on Dan Christiansens work
alex
parents:
9405
diff
changeset
|
295 #ifdef MACOSX |
241bba8f60e8
MACOSX support patch, based on Dan Christiansens work
alex
parents:
9405
diff
changeset
|
296 ExitMovies(); |
241bba8f60e8
MACOSX support patch, based on Dan Christiansens work
alex
parents:
9405
diff
changeset
|
297 #endif |
8160 | 298 } |
299 | |
300 // decode a frame | |
301 static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){ | |
302 long result = 1; | |
8321
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
303 int i; |
8160 | 304 mp_image_t* mpi; |
305 ComponentResult cres; | |
8473 | 306 |
307 if(len<=0) return NULL; // skipped frame | |
8160 | 308 |
309 mpi=mpcodecs_get_image(sh, MP_IMGTYPE_STATIC, MP_IMGFLAG_PRESERVE, | |
310 sh->disp_w, sh->disp_h); | |
311 if(!mpi) return NULL; | |
312 | |
313 decpar.data = (char*)data; | |
314 decpar.bufferSize = len; | |
315 (**framedescHandle).dataSize=len; | |
316 | |
317 if(!codec_inited){ | |
318 result = QTNewGWorldFromPtr( | |
319 &OutBufferGWorld, | |
8282 | 320 // kYUVSPixelFormat, //pixel format of new GWorld == YUY2 |
13188 | 321 (OSType)sh->context, |
8160 | 322 &OutBufferRect, //we should benchmark if yvu9 is faster for svq3, too |
323 0, | |
324 0, | |
325 0, | |
326 mpi->planes[0], | |
327 mpi->stride[0]); | |
17366 | 328 mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"NewGWorldFromPtr returned:%ld\n",65536-(result&0xffff)); |
8282 | 329 // if (65536-(result&0xFFFF) != 10000) |
330 // return NULL; | |
8160 | 331 |
332 // printf("IDesc=%d\n",sizeof(ImageDescription)); | |
333 | |
334 decpar.imageDescription = framedescHandle; | |
335 decpar.startLine=0; | |
336 decpar.stopLine=(**framedescHandle).height; | |
337 decpar.frameNumber = 1; //1 | |
338 // decpar.conditionFlags=0xFFD; // first | |
339 // decpar.callerFlags=0x2001; // first | |
340 decpar.matrixFlags = 0; | |
341 decpar.matrixType = 0; | |
342 decpar.matrix = 0; | |
343 decpar.capabilities=&codeccap; | |
344 // decpar.accuracy = 0x1680000; //codecNormalQuality; | |
345 decpar.accuracy = codecNormalQuality; | |
8431 | 346 // decpar.port = OutBufferGWorld; |
8160 | 347 // decpar.preferredOffscreenPixelSize=17207; |
348 | |
349 // decpar.sequenceID=malloc(1000); | |
350 // memset(decpar.sequenceID,0,1000); | |
351 | |
352 // SrcRect.top=17207; | |
353 // SrcRect.left=0; | |
354 // SrcRect.right=0;//image_width; | |
355 // SrcRect.bottom=0;//image_height; | |
356 | |
357 // decpar.srcRect = SrcRect; | |
358 decpar.srcRect = OutBufferRect; | |
359 | |
360 decpar.transferMode = srcCopy; | |
361 decpar.dstPixMap = **GetGWorldPixMap( OutBufferGWorld);//destPixmap; | |
362 | |
363 cres=ImageCodecPreDecompress(ci,&decpar); | |
12194
81f8e4f97b38
printf -> mp_msg, error msg when qtmlClient.dll is missing
faust3
parents:
9502
diff
changeset
|
364 mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"ImageCodecPreDecompress cres=0x%X\n",cres); |
8430 | 365 |
366 if(decpar.wantedDestinationPixelTypes) | |
367 { OSType *p=*(decpar.wantedDestinationPixelTypes); | |
368 if(p) while(*p){ | |
17366 | 369 mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"supported csp: 0x%08X %.4s\n",*p,(char *)p); |
8430 | 370 ++p; |
371 } | |
372 } | |
373 | |
8160 | 374 |
375 // decpar.conditionFlags=0x10FFF; // first | |
376 // decpar.preferredOffscreenPixelSize=17207; | |
377 | |
378 // decpar.conditionFlags=0x10FFD; // first | |
379 | |
380 // cres=ImageCodecPreDecompress(ci,&decpar); | |
381 // printf("ImageCodecPreDecompress cres=0x%X\n",cres); | |
382 | |
383 | |
384 codec_inited=1; | |
385 } | |
386 | |
387 #if 0 | |
388 if(decpar.frameNumber==124){ | |
389 decpar.frameNumber=1; | |
390 cres=ImageCodecPreDecompress(ci,&decpar); | |
17366 | 391 mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"ImageCodecPreDecompress cres=0x%lX\n",cres); |
8160 | 392 } |
393 #endif | |
394 | |
395 cres=ImageCodecBandDecompress(ci,&decpar); | |
396 | |
397 ++decpar.frameNumber; | |
8321
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
398 |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
399 if(cres&0xFFFF){ |
12194
81f8e4f97b38
printf -> mp_msg, error msg when qtmlClient.dll is missing
faust3
parents:
9502
diff
changeset
|
400 mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"ImageCodecBandDecompress cres=0x%X (-0x%X) %d\n",cres,-cres,cres); |
8321
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
401 return NULL; |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
402 } |
8160 | 403 |
8321
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
404 // for(i=0;i<8;i++) |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
405 // printf("img_base[%d]=%p\n",i,((int*)decpar.dstPixMap.baseAddr)[i]); |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
406 |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
407 if((int)sh->context==0x73797639){ // Sorenson 16-bit YUV -> std YVU9 |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
408 |
8451 | 409 short *src0=(short *)((char*)decpar.dstPixMap.baseAddr+0x20); |
8321
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
410 |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
411 for(i=0;i<mpi->h;i++){ |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
412 int x; |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
413 unsigned char* dst=mpi->planes[0]+i*mpi->stride[0]; |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
414 unsigned short* src=src0+i*((mpi->w+15)&(~15)); |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
415 for(x=0;x<mpi->w;x++) dst[x]=src[x]; |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
416 } |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
417 src0+=((mpi->w+15)&(~15))*((mpi->h+15)&(~15)); |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
418 for(i=0;i<mpi->h/4;i++){ |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
419 int x; |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
420 unsigned char* dst=mpi->planes[1]+i*mpi->stride[1]; |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
421 unsigned short* src=src0+i*(((mpi->w+63)&(~63))/4); |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
422 for(x=0;x<mpi->w/4;x++) dst[x]=src[x]; |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
423 src+=((mpi->w+63)&(~63))/4; |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
424 } |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
425 src0+=(((mpi->w+63)&(~63))/4)*(((mpi->h+63)&(~63))/4); |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
426 for(i=0;i<mpi->h/4;i++){ |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
427 int x; |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
428 unsigned char* dst=mpi->planes[2]+i*mpi->stride[2]; |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
429 unsigned short* src=src0+i*(((mpi->w+63)&(~63))/4); |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
430 for(x=0;x<mpi->w/4;x++) dst[x]=src[x]; |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
431 src+=((mpi->w+63)&(~63))/4; |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
432 } |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
433 |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
434 } |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
435 |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
436 |
8160 | 437 return mpi; |
438 } |