Mercurial > mplayer.hg
annotate libmpcodecs/vd_qtvideo.c @ 31911:0a5093edd406
Switch to uppercase hex.
author | reimar |
---|---|
date | Sat, 21 Aug 2010 09:41:15 +0000 |
parents | 7a3b616b2dfb |
children | c08363dc5320 |
rev | line source |
---|---|
30421
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
1 /* |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
2 * This file is part of MPlayer. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
3 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
7 * (at your option) any later version. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
8 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
12 * GNU General Public License for more details. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
13 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
17 */ |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
18 |
8160 | 19 #include <stdio.h> |
20 #include <stdlib.h> | |
21263
db9754cebfab
Move #include <QuickTime/ImageCodec.h> before internal headers
uau
parents:
18771
diff
changeset
|
21 #include <inttypes.h> |
8160 | 22 |
23 #include "config.h" | |
28196
504aa3e3076a
Reorder #includes and #ifdefs to avoid warnings and excessive #ifdeffery.
diego
parents:
27432
diff
changeset
|
24 #include "mp_msg.h" |
504aa3e3076a
Reorder #includes and #ifdefs to avoid warnings and excessive #ifdeffery.
diego
parents:
27432
diff
changeset
|
25 #include "mpbswap.h" |
504aa3e3076a
Reorder #includes and #ifdefs to avoid warnings and excessive #ifdeffery.
diego
parents:
27432
diff
changeset
|
26 #include "vd_internal.h" |
8160 | 27 |
27388
ac03760f7fcc
Rename all preprocessor directives related to Apple / Mac OS X.
diego
parents:
26754
diff
changeset
|
28 #ifdef CONFIG_QUICKTIME |
21263
db9754cebfab
Move #include <QuickTime/ImageCodec.h> before internal headers
uau
parents:
18771
diff
changeset
|
29 #include <QuickTime/ImageCodec.h> |
db9754cebfab
Move #include <QuickTime/ImageCodec.h> before internal headers
uau
parents:
18771
diff
changeset
|
30 #define dump_ImageDescription(x) |
28196
504aa3e3076a
Reorder #includes and #ifdefs to avoid warnings and excessive #ifdeffery.
diego
parents:
27432
diff
changeset
|
31 #else |
504aa3e3076a
Reorder #includes and #ifdefs to avoid warnings and excessive #ifdeffery.
diego
parents:
27432
diff
changeset
|
32 #include "loader/ldt_keeper.h" |
504aa3e3076a
Reorder #includes and #ifdefs to avoid warnings and excessive #ifdeffery.
diego
parents:
27432
diff
changeset
|
33 #include "loader/qtx/qtxsdk/components.h" |
31348
8df8a7c20f46
Replace forward declarations by proper loader/wine/winbase.h #include.
diego
parents:
30870
diff
changeset
|
34 #include "loader/wine/winbase.h" |
22577
a033e5519802
Include loader/ prefix in #include path everywhere.
diego
parents:
21264
diff
changeset
|
35 #include "loader/wine/windef.h" |
8451 | 36 #endif |
37 | |
30504
cc27da5d7286
Mark all ad_info_t/vd_info_t structure declarations as const.
diego
parents:
30421
diff
changeset
|
38 static const vd_info_t info = { |
8160 | 39 "Quicktime Video decoder", |
40 "qtvideo", | |
41 "A'rpi", | |
12194
81f8e4f97b38
printf -> mp_msg, error msg when qtmlClient.dll is missing
faust3
parents:
9502
diff
changeset
|
42 "Sascha Sommer", |
8160 | 43 "win32" |
44 }; | |
45 | |
46 LIBVD_EXTERN(qtvideo) | |
47 | |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
48 static mp_image_t* mpi; |
8160 | 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; | |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
53 static ImageSequence imageSeq; |
8160 | 54 |
27388
ac03760f7fcc
Rename all preprocessor directives related to Apple / Mac OS X.
diego
parents:
26754
diff
changeset
|
55 #ifndef CONFIG_QUICKTIME |
28196
504aa3e3076a
Reorder #includes and #ifdefs to avoid warnings and excessive #ifdeffery.
diego
parents:
27432
diff
changeset
|
56 static HINSTANCE qtime_qts; // handle to the preloaded quicktime.qts |
504aa3e3076a
Reorder #includes and #ifdefs to avoid warnings and excessive #ifdeffery.
diego
parents:
27432
diff
changeset
|
57 static HMODULE handler; |
8160 | 58 static OSErr (*InitializeQTML)(long flags); |
59 static OSErr (*EnterMovies)(void); | |
30869 | 60 static void (*ExitMovies)(void); |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
61 static OSErr (*DecompressSequenceBegin)(ImageSequence *seqID, |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
62 ImageDescriptionHandle desc, |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
63 CGrafPtr port, |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
64 /*GDHandle*/void* gdh, |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
65 const Rect *srcRect, |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
66 MatrixRecordPtr matrix, |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
67 short mode, |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
68 RgnHandle mask, |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
69 CodecFlags flags, |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
70 CodecQ accuracy, |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
71 DecompressorComponent codec); |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
72 static OSErr (*DecompressSequenceFrameS)(ImageSequence seqID, |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
73 Ptr data, |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
74 long dataSize, |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
75 CodecFlags inFlags, |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
76 CodecFlags *outFlags, |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
77 ICMCompletionProcRecordPtr asyncCompletionProc); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28198
diff
changeset
|
78 static PixMapHandle (*GetGWorldPixMap)(GWorldPtr offscreenGWorld); |
8160 | 79 static OSErr (*QTNewGWorldFromPtr)(GWorldPtr *gw, |
80 OSType pixelFormat, | |
81 const Rect *boundsRect, | |
82 CTabHandle cTable, | |
83 /*GDHandle*/void* aGDevice, //unused anyway | |
84 GWorldFlags flags, | |
85 void *baseAddr, | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28198
diff
changeset
|
86 long rowBytes); |
30812 | 87 static Handle (*NewHandleClear)(Size byteCount); |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
88 static void (*DisposeHandle)(Handle h); |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
89 static void (*DisposeGWorld)(GWorldPtr offscreenGWorld); |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
90 static OSErr (*CDSequenceEnd)(ImageSequence seqID); |
27388
ac03760f7fcc
Rename all preprocessor directives related to Apple / Mac OS X.
diego
parents:
26754
diff
changeset
|
91 #endif /* #ifndef CONFIG_QUICKTIME */ |
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 // init driver | |
99 static int init(sh_video_t *sh){ | |
30812 | 100 OSErr result = 1; |
31718
56e3df9c8aaa
Generate a ImageDescription if none is passed neither via ImageDesc nor
reimar
parents:
31348
diff
changeset
|
101 int extradata_size = sh->bih ? sh->bih->biSize - sizeof(BITMAPINFOHEADER) : 0; |
56e3df9c8aaa
Generate a ImageDescription if none is passed neither via ImageDesc nor
reimar
parents:
31348
diff
changeset
|
102 void *extradata = sh->bih + 1; |
8160 | 103 |
31718
56e3df9c8aaa
Generate a ImageDescription if none is passed neither via ImageDesc nor
reimar
parents:
31348
diff
changeset
|
104 if (!sh->ImageDesc) |
56e3df9c8aaa
Generate a ImageDescription if none is passed neither via ImageDesc nor
reimar
parents:
31348
diff
changeset
|
105 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"sh->ImageDesc not set, try -demuxer mov if this fails.\n"); |
9502
241bba8f60e8
MACOSX support patch, based on Dan Christiansens work
alex
parents:
9405
diff
changeset
|
106 |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
107 #ifndef CONFIG_QUICKTIME |
9405
a4444e7ee56a
real cygwin support by Sascha Sommer <saschasommer@freenet.de>
alex
parents:
8473
diff
changeset
|
108 #ifdef WIN32_LOADER |
8270 | 109 Setup_LDT_Keeper(); |
110 #endif | |
111 | |
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
|
112 //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
|
113 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
|
114 if(!qtime_qts){ |
31719 | 115 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"unable to load QuickTime.qts\n" ); |
116 return 0; | |
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 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28198
diff
changeset
|
118 |
8160 | 119 handler = LoadLibraryA("qtmlClient.dll"); |
12194
81f8e4f97b38
printf -> mp_msg, error msg when qtmlClient.dll is missing
faust3
parents:
9502
diff
changeset
|
120 if(!handler){ |
31719 | 121 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"unable to load qtmlClient.dll\n"); |
122 return 0; | |
12194
81f8e4f97b38
printf -> mp_msg, error msg when qtmlClient.dll is missing
faust3
parents:
9502
diff
changeset
|
123 } |
8160 | 124 |
8451 | 125 InitializeQTML = (OSErr (*)(long))GetProcAddress(handler, "InitializeQTML"); |
126 EnterMovies = (OSErr (*)(void))GetProcAddress(handler, "EnterMovies"); | |
30869 | 127 ExitMovies = (void (*)(void))GetProcAddress(handler, "ExitMovies"); |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
128 DecompressSequenceBegin = (OSErr (*)(ImageSequence*,ImageDescriptionHandle,CGrafPtr,void *,const Rect *,MatrixRecordPtr,short,RgnHandle,CodecFlags,CodecQ,DecompressorComponent))GetProcAddress(handler, "DecompressSequenceBegin"); |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
129 DecompressSequenceFrameS = (OSErr (*)(ImageSequence,Ptr,long,CodecFlags,CodecFlags*,ICMCompletionProcRecordPtr))GetProcAddress(handler, "DecompressSequenceFrameS"); |
8451 | 130 GetGWorldPixMap = (PixMapHandle (*)(GWorldPtr))GetProcAddress(handler, "GetGWorldPixMap"); |
131 QTNewGWorldFromPtr = (OSErr(*)(GWorldPtr *,OSType,const Rect *,CTabHandle,void*,GWorldFlags,void *,long))GetProcAddress(handler, "QTNewGWorldFromPtr"); | |
132 NewHandleClear = (OSErr(*)(Size))GetProcAddress(handler, "NewHandleClear"); | |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
133 DisposeHandle = (void (*)(Handle))GetProcAddress(handler, "DisposeHandle"); |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
134 DisposeGWorld = (void (*)(GWorldPtr))GetProcAddress(handler, "DisposeGWorld"); |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
135 CDSequenceEnd = (OSErr (*)(ImageSequence))GetProcAddress(handler, "CDSequenceEnd"); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28198
diff
changeset
|
136 |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
137 if(!InitializeQTML || !EnterMovies || !DecompressSequenceBegin || !DecompressSequenceFrameS){ |
12194
81f8e4f97b38
printf -> mp_msg, error msg when qtmlClient.dll is missing
faust3
parents:
9502
diff
changeset
|
138 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"invalid qtmlClient.dll!\n"); |
8160 | 139 return 0; |
140 } | |
141 | |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
142 result=InitializeQTML(kInitializeQTMLDisableDirectSound | |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
143 kInitializeQTMLUseGDIFlag | |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
144 kInitializeQTMLDisableDDClippers); |
30812 | 145 mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"InitializeQTML returned %d\n",result); |
27388
ac03760f7fcc
Rename all preprocessor directives related to Apple / Mac OS X.
diego
parents:
26754
diff
changeset
|
146 #endif /* CONFIG_QUICKTIME */ |
8160 | 147 |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
148 result=EnterMovies(); |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
149 mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"EnterMovies returned %d\n",result); |
8160 | 150 |
151 //make a yuy2 gworld | |
152 OutBufferRect.top=0; | |
153 OutBufferRect.left=0; | |
154 OutBufferRect.right=sh->disp_w; | |
155 OutBufferRect.bottom=sh->disp_h; | |
156 | |
157 //Fill the imagedescription for our SVQ3 frame | |
158 //we can probably get this from Demuxer | |
31718
56e3df9c8aaa
Generate a ImageDescription if none is passed neither via ImageDesc nor
reimar
parents:
31348
diff
changeset
|
159 if (!sh->ImageDesc && extradata_size >= sizeof(ImageDescription) && |
56e3df9c8aaa
Generate a ImageDescription if none is passed neither via ImageDesc nor
reimar
parents:
31348
diff
changeset
|
160 ((ImageDescription *)extradata)->idSize <= extradata_size) |
56e3df9c8aaa
Generate a ImageDescription if none is passed neither via ImageDesc nor
reimar
parents:
31348
diff
changeset
|
161 sh->ImageDesc = extradata; |
56e3df9c8aaa
Generate a ImageDescription if none is passed neither via ImageDesc nor
reimar
parents:
31348
diff
changeset
|
162 if (sh->ImageDesc) { |
31719 | 163 mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"ImageDescription size: %d\n",((ImageDescription*)(sh->ImageDesc))->idSize); |
164 framedescHandle=(ImageDescriptionHandle)NewHandleClear(((ImageDescription*)(sh->ImageDesc))->idSize); | |
165 memcpy(*framedescHandle,sh->ImageDesc,((ImageDescription*)(sh->ImageDesc))->idSize); | |
31718
56e3df9c8aaa
Generate a ImageDescription if none is passed neither via ImageDesc nor
reimar
parents:
31348
diff
changeset
|
166 } else { |
56e3df9c8aaa
Generate a ImageDescription if none is passed neither via ImageDesc nor
reimar
parents:
31348
diff
changeset
|
167 // assume extradata consists only of the atoms, build the other parts |
56e3df9c8aaa
Generate a ImageDescription if none is passed neither via ImageDesc nor
reimar
parents:
31348
diff
changeset
|
168 ImageDescription *idesc; |
56e3df9c8aaa
Generate a ImageDescription if none is passed neither via ImageDesc nor
reimar
parents:
31348
diff
changeset
|
169 int size = sizeof(*idesc) + extradata_size; |
56e3df9c8aaa
Generate a ImageDescription if none is passed neither via ImageDesc nor
reimar
parents:
31348
diff
changeset
|
170 mp_msg(MSGT_DECVIDEO, MSGL_V, "Generating a ImageDescription\n"); |
56e3df9c8aaa
Generate a ImageDescription if none is passed neither via ImageDesc nor
reimar
parents:
31348
diff
changeset
|
171 framedescHandle=(ImageDescriptionHandle)NewHandleClear(size); |
56e3df9c8aaa
Generate a ImageDescription if none is passed neither via ImageDesc nor
reimar
parents:
31348
diff
changeset
|
172 idesc = *framedescHandle; |
56e3df9c8aaa
Generate a ImageDescription if none is passed neither via ImageDesc nor
reimar
parents:
31348
diff
changeset
|
173 memcpy(idesc + 1, extradata, extradata_size); |
56e3df9c8aaa
Generate a ImageDescription if none is passed neither via ImageDesc nor
reimar
parents:
31348
diff
changeset
|
174 idesc->idSize = size; |
56e3df9c8aaa
Generate a ImageDescription if none is passed neither via ImageDesc nor
reimar
parents:
31348
diff
changeset
|
175 idesc->width = sh->disp_w; |
56e3df9c8aaa
Generate a ImageDescription if none is passed neither via ImageDesc nor
reimar
parents:
31348
diff
changeset
|
176 idesc->height = sh->disp_h; |
56e3df9c8aaa
Generate a ImageDescription if none is passed neither via ImageDesc nor
reimar
parents:
31348
diff
changeset
|
177 } |
8471 | 178 dump_ImageDescription(*framedescHandle); |
8160 | 179 |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
180 (**framedescHandle).cType = bswap_32(sh->format); |
13188 | 181 sh->context = (void *)kYUVSPixelFormat; |
8282 | 182 { |
183 int imgfmt = sh->codec->outfmt[sh->outfmtidx]; | |
184 int qt_imgfmt; | |
185 switch(imgfmt) | |
186 { | |
187 case IMGFMT_YUY2: | |
188 qt_imgfmt = kYUVSPixelFormat; | |
189 break; | |
190 case IMGFMT_YVU9: | |
8301 | 191 qt_imgfmt = 0x73797639; //kYVU9PixelFormat; |
192 break; | |
193 case IMGFMT_YV12: | |
194 qt_imgfmt = 0x79343230; | |
8282 | 195 break; |
196 case IMGFMT_UYVY: | |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
197 qt_imgfmt = k2vuyPixelFormat; |
8282 | 198 break; |
199 case IMGFMT_YVYU: | |
200 qt_imgfmt = kYVYU422PixelFormat; | |
201 imgfmt = IMGFMT_YUY2; | |
202 break; | |
203 case IMGFMT_RGB16: | |
204 qt_imgfmt = k16LE555PixelFormat; | |
205 break; | |
206 case IMGFMT_BGR24: | |
207 qt_imgfmt = k24BGRPixelFormat; | |
208 break; | |
209 case IMGFMT_BGR32: | |
210 qt_imgfmt = k32BGRAPixelFormat; | |
211 break; | |
212 case IMGFMT_RGB32: | |
213 qt_imgfmt = k32RGBAPixelFormat; | |
214 break; | |
215 default: | |
12194
81f8e4f97b38
printf -> mp_msg, error msg when qtmlClient.dll is missing
faust3
parents:
9502
diff
changeset
|
216 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"Unknown requested csp\n"); |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26542
diff
changeset
|
217 return 0; |
8282 | 218 } |
17366 | 219 mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"imgfmt: %s qt_imgfmt: %.4s\n", vo_format_name(imgfmt), (char *)&qt_imgfmt); |
13188 | 220 sh->context = (void *)qt_imgfmt; |
8282 | 221 if(!mpcodecs_config_vo(sh,sh->disp_w,sh->disp_h,imgfmt)) return 0; |
222 } | |
8160 | 223 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28198
diff
changeset
|
224 mpi=mpcodecs_get_image(sh, MP_IMGTYPE_STATIC, MP_IMGFLAG_PRESERVE, |
8160 | 225 sh->disp_w, sh->disp_h); |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
226 if(!mpi) return 0; |
30614
ed516abd6137
Fix the stack crash(SYS3171) on OS/2 when playing qtaudio/qtvideo.
komh
parents:
30504
diff
changeset
|
227 |
8160 | 228 result = QTNewGWorldFromPtr( |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28198
diff
changeset
|
229 &OutBufferGWorld, |
13188 | 230 (OSType)sh->context, |
8160 | 231 &OutBufferRect, //we should benchmark if yvu9 is faster for svq3, too |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28198
diff
changeset
|
232 0, |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28198
diff
changeset
|
233 0, |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28198
diff
changeset
|
234 0, |
8160 | 235 mpi->planes[0], |
236 mpi->stride[0]); | |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
237 if (result) { |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
238 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"QTNewGWorldFromPtr result=%d\n",result); |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
239 return 0; |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
240 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28198
diff
changeset
|
241 |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
242 result = DecompressSequenceBegin(&imageSeq, framedescHandle, (CGrafPtr)OutBufferGWorld, |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
243 NULL, NULL, NULL, srcCopy, NULL, 0, |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
244 codecNormalQuality, 0); |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
245 if(result) { |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
246 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"DecompressSequenceBegin result=%d\n",result); |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
247 return 0; |
8430 | 248 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28198
diff
changeset
|
249 |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
250 return 1; |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
251 } |
8160 | 252 |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
253 // uninit driver |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
254 static void uninit(sh_video_t *sh){ |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
255 if(OutBufferGWorld) { |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
256 DisposeGWorld(OutBufferGWorld); |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
257 OutBufferGWorld = NULL; |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
258 } |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
259 if(framedescHandle) { |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
260 DisposeHandle((Handle)framedescHandle); |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
261 framedescHandle = NULL; |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
262 } |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
263 if(imageSeq) { |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
264 CDSequenceEnd(imageSeq); |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
265 imageSeq = 0; |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
266 } |
30869 | 267 ExitMovies(); |
8160 | 268 } |
269 | |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
270 // decode a frame |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
271 static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){ |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
272 OSErr result = 1; |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
273 CodecFlags ignore; |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
274 |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
275 if(len<=0) return NULL; // skipped frame |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
276 |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
277 #ifdef WIN32_LOADER |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
278 Setup_FS_Segment(); |
8160 | 279 #endif |
280 | |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
281 result = DecompressSequenceFrameS(imageSeq, data, len, 0, &ignore, NULL); |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
282 if(result) { |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
283 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"DecompressSequenceFrameS result=0x%d\n",result); |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
284 return NULL; |
8321
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
285 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28198
diff
changeset
|
286 |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
287 if((int)sh->context==0x73797639){ // Sorenson 16-bit YUV -> std YVU9 |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
288 int i; |
8321
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
289 |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
290 PixMap dstPixMap = **GetGWorldPixMap(OutBufferGWorld); |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
291 short *src0=(short *)((char*)dstPixMap.baseAddr+0x20); |
8321
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
292 |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
293 for(i=0;i<mpi->h;i++){ |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
294 int x; |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
295 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
|
296 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
|
297 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
|
298 } |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
299 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
|
300 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
|
301 int x; |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
302 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
|
303 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
|
304 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
|
305 src+=((mpi->w+63)&(~63))/4; |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
306 } |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
307 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
|
308 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
|
309 int x; |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
310 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
|
311 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
|
312 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
|
313 src+=((mpi->w+63)&(~63))/4; |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
314 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28198
diff
changeset
|
315 |
8321
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
316 } |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
317 |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
318 |
8160 | 319 return mpi; |
320 } |