Mercurial > mplayer.hg
annotate libmpcodecs/vd_qtvideo.c @ 33718:b4c4ee25269f
Signal EOF vs. error also via streaming control API (not yet evaluated).
author | reimar |
---|---|
date | Mon, 04 Jul 2011 19:10:17 +0000 |
parents | ee42c625f5ba |
children |
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; |
32105 | 101 int extradata_size = sh->bih ? sh->bih->biSize - sizeof(*sh->bih) : 0; |
31718
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 } |
32569 | 178 if (mp_msg_test(MSGT_DECVIDEO, MSGL_V)) |
32570 | 179 dump_ImageDescription(*framedescHandle); |
8160 | 180 |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
181 (**framedescHandle).cType = bswap_32(sh->format); |
13188 | 182 sh->context = (void *)kYUVSPixelFormat; |
8282 | 183 { |
184 int imgfmt = sh->codec->outfmt[sh->outfmtidx]; | |
185 int qt_imgfmt; | |
186 switch(imgfmt) | |
187 { | |
188 case IMGFMT_YUY2: | |
189 qt_imgfmt = kYUVSPixelFormat; | |
190 break; | |
191 case IMGFMT_YVU9: | |
8301 | 192 qt_imgfmt = 0x73797639; //kYVU9PixelFormat; |
193 break; | |
194 case IMGFMT_YV12: | |
195 qt_imgfmt = 0x79343230; | |
8282 | 196 break; |
197 case IMGFMT_UYVY: | |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
198 qt_imgfmt = k2vuyPixelFormat; |
8282 | 199 break; |
200 case IMGFMT_YVYU: | |
201 qt_imgfmt = kYVYU422PixelFormat; | |
202 imgfmt = IMGFMT_YUY2; | |
203 break; | |
204 case IMGFMT_RGB16: | |
205 qt_imgfmt = k16LE555PixelFormat; | |
206 break; | |
207 case IMGFMT_BGR24: | |
208 qt_imgfmt = k24BGRPixelFormat; | |
209 break; | |
210 case IMGFMT_BGR32: | |
211 qt_imgfmt = k32BGRAPixelFormat; | |
212 break; | |
213 case IMGFMT_RGB32: | |
214 qt_imgfmt = k32RGBAPixelFormat; | |
215 break; | |
216 default: | |
12194
81f8e4f97b38
printf -> mp_msg, error msg when qtmlClient.dll is missing
faust3
parents:
9502
diff
changeset
|
217 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"Unknown requested csp\n"); |
26754
63630c09e237
cosmetics: Remove pointless parentheses from return calls.
diego
parents:
26542
diff
changeset
|
218 return 0; |
8282 | 219 } |
17366 | 220 mp_msg(MSGT_DECVIDEO,MSGL_DBG2,"imgfmt: %s qt_imgfmt: %.4s\n", vo_format_name(imgfmt), (char *)&qt_imgfmt); |
13188 | 221 sh->context = (void *)qt_imgfmt; |
8282 | 222 if(!mpcodecs_config_vo(sh,sh->disp_w,sh->disp_h,imgfmt)) return 0; |
223 } | |
8160 | 224 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28198
diff
changeset
|
225 mpi=mpcodecs_get_image(sh, MP_IMGTYPE_STATIC, MP_IMGFLAG_PRESERVE, |
8160 | 226 sh->disp_w, sh->disp_h); |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
227 if(!mpi) return 0; |
30614
ed516abd6137
Fix the stack crash(SYS3171) on OS/2 when playing qtaudio/qtvideo.
komh
parents:
30504
diff
changeset
|
228 |
8160 | 229 result = QTNewGWorldFromPtr( |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28198
diff
changeset
|
230 &OutBufferGWorld, |
13188 | 231 (OSType)sh->context, |
8160 | 232 &OutBufferRect, //we should benchmark if yvu9 is faster for svq3, too |
29263
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, |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28198
diff
changeset
|
235 0, |
8160 | 236 mpi->planes[0], |
237 mpi->stride[0]); | |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
238 if (result) { |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
239 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
|
240 return 0; |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
241 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28198
diff
changeset
|
242 |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
243 result = DecompressSequenceBegin(&imageSeq, framedescHandle, (CGrafPtr)OutBufferGWorld, |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
244 NULL, NULL, NULL, srcCopy, NULL, 0, |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
245 codecNormalQuality, 0); |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
246 if(result) { |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
247 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
|
248 return 0; |
8430 | 249 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28198
diff
changeset
|
250 |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
251 return 1; |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
252 } |
8160 | 253 |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
254 // uninit driver |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
255 static void uninit(sh_video_t *sh){ |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
256 if(OutBufferGWorld) { |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
257 DisposeGWorld(OutBufferGWorld); |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
258 OutBufferGWorld = NULL; |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
259 } |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
260 if(framedescHandle) { |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
261 DisposeHandle((Handle)framedescHandle); |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
262 framedescHandle = NULL; |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
263 } |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
264 if(imageSeq) { |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
265 CDSequenceEnd(imageSeq); |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
266 imageSeq = 0; |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
267 } |
30869 | 268 ExitMovies(); |
8160 | 269 } |
270 | |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
271 // decode a frame |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
272 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
|
273 OSErr result = 1; |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
274 CodecFlags ignore; |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
275 |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
276 if(len<=0) return NULL; // skipped frame |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
277 |
32400
83d15532e904
Do not call Setup_FS_Segment if the QuickTime framework is used on OSX
reimar
parents:
32105
diff
changeset
|
278 #if defined(WIN32_LOADER) && !defined(CONFIG_QUICKTIME) |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
279 Setup_FS_Segment(); |
8160 | 280 #endif |
281 | |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
282 result = DecompressSequenceFrameS(imageSeq, data, len, 0, &ignore, NULL); |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
283 if(result) { |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
284 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
|
285 return NULL; |
8321
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
286 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28198
diff
changeset
|
287 |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
288 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
|
289 int i; |
8321
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
290 |
30857
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
291 PixMap dstPixMap = **GetGWorldPixMap(OutBufferGWorld); |
77ce62f13d42
Use the high-level QuickTime decoding APIs (DecompressSequenceFrameS and
sesse
parents:
30812
diff
changeset
|
292 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
|
293 |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
294 for(i=0;i<mpi->h;i++){ |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
295 int x; |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
296 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
|
297 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
|
298 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
|
299 } |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
300 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
|
301 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
|
302 int x; |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
303 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
|
304 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
|
305 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
|
306 src+=((mpi->w+63)&(~63))/4; |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
307 } |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
308 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
|
309 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
|
310 int x; |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
311 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
|
312 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
|
313 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
|
314 src+=((mpi->w+63)&(~63))/4; |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
315 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28198
diff
changeset
|
316 |
8321
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 |
ca24204fb547
SVQ1 support (ugly hack... - really we need 'syuv' support in swscaler :))
arpi
parents:
8301
diff
changeset
|
319 |
8160 | 320 return mpi; |
321 } |