blob: 1006c6c73600376059838fe67ed85a25793a5aef [file] [log] [blame]
Jack Jansencb4eaad1995-11-30 15:03:59 +00001# Scan an Apple header file, generating a Python file of generator calls.
2
Jack Jansen0c4d9471998-04-17 14:07:56 +00003import sys
4import os
Jack Jansenaaebdd62002-08-05 15:39:30 +00005from bgenlocations import TOOLBOXDIR, BGENDIR
Jack Jansen0c4d9471998-04-17 14:07:56 +00006sys.path.append(BGENDIR)
Jack Jansencb4eaad1995-11-30 15:03:59 +00007from scantools import Scanner
8
9LONG = "QuickTime"
10SHORT = "qt"
Jack Jansen2e5e6442004-01-09 23:18:47 +000011HEADERFILES= (
12 "Movies.h",
13 "ImageCompression.h",
14 "QuickTimeComponents.h",
15# "ImageCodec.h" -- seems not too useful, and difficult.
Jack Jansenae57b7f2004-01-11 22:27:42 +000016 "MediaHandlers.h",
17# "QTML.h", -- Windows only, needs separate module
18# "QuickTimeStreaming.h", -- Difficult
19# "QTStreamingComponents.h", -- Needs QTStreaming
20 "QuickTimeMusic.h",
Jack Jansen2e5e6442004-01-09 23:18:47 +000021 )
Jack Jansen007b8eb2004-01-03 17:23:27 +000022OBJECTS = ("Movie", "Track", "Media", "UserData", "TimeBase", "MovieController",
23 "IdleManager", "SGOutput")
Jack Jansencb4eaad1995-11-30 15:03:59 +000024
25def main():
Jack Jansen007b8eb2004-01-03 17:23:27 +000026 input = HEADERFILES
Jack Jansencb4eaad1995-11-30 15:03:59 +000027 output = SHORT + "gen.py"
Jack Jansen46d9e791996-04-12 16:29:23 +000028 defsoutput = TOOLBOXDIR + LONG + ".py"
Jack Jansencb4eaad1995-11-30 15:03:59 +000029 scanner = MyScanner(input, output, defsoutput)
30 scanner.scan()
31 scanner.close()
Jack Jansen007b8eb2004-01-03 17:23:27 +000032 scanner.gentypetest(SHORT+"typetest.py")
Jack Jansen87eea882002-08-15 21:48:16 +000033 print "=== Testing definitions output code ==="
34 execfile(defsoutput, {}, {})
Jack Jansencb4eaad1995-11-30 15:03:59 +000035 print "=== Done scanning and generating, now importing the generated code... ==="
36 exec "import " + SHORT + "support"
37 print "=== Done. It's up to you to compile it now! ==="
38
39class MyScanner(Scanner):
40
41 def destination(self, type, name, arglist):
42 classname = "Function"
43 listname = "functions"
44 if arglist:
45 t, n, m = arglist[0]
Jack Jansen453ced51995-11-30 17:42:08 +000046 if t in OBJECTS and m == "InMode":
Jack Jansencb4eaad1995-11-30 15:03:59 +000047 classname = "Method"
Jack Jansen453ced51995-11-30 17:42:08 +000048 listname = t + "_methods"
Jack Jansencb4eaad1995-11-30 15:03:59 +000049 return classname, listname
50
Jack Jansen21f96871998-02-20 16:02:09 +000051 def writeinitialdefs(self):
52 self.defsfile.write("def FOUR_CHAR_CODE(x): return x\n")
Jack Jansen007b8eb2004-01-03 17:23:27 +000053 self.defsfile.write("xmlIdentifierUnrecognized = -1\n")
Jack Jansenae57b7f2004-01-11 22:27:42 +000054 self.defsfile.write("kControllerMinimum = -0xf777\n")
55 self.defsfile.write("notImplementedMusicOSErr = -2071\n")
56 self.defsfile.write("cantSendToSynthesizerOSErr = -2072\n")
57 self.defsfile.write("cantReceiveFromSynthesizerOSErr = -2073\n")
58 self.defsfile.write("illegalVoiceAllocationOSErr = -2074\n")
59 self.defsfile.write("illegalPartOSErr = -2075\n")
60 self.defsfile.write("illegalChannelOSErr = -2076\n")
61 self.defsfile.write("illegalKnobOSErr = -2077\n")
62 self.defsfile.write("illegalKnobValueOSErr = -2078\n")
63 self.defsfile.write("illegalInstrumentOSErr = -2079\n")
64 self.defsfile.write("illegalControllerOSErr = -2080\n")
65 self.defsfile.write("midiManagerAbsentOSErr = -2081\n")
66 self.defsfile.write("synthesizerNotRespondingOSErr = -2082\n")
67 self.defsfile.write("synthesizerOSErr = -2083\n")
68 self.defsfile.write("illegalNoteChannelOSErr = -2084\n")
69 self.defsfile.write("noteChannelNotAllocatedOSErr = -2085\n")
70 self.defsfile.write("tunePlayerFullOSErr = -2086\n")
71 self.defsfile.write("tuneParseOSErr = -2087\n")
Jack Jansen21f96871998-02-20 16:02:09 +000072
Jack Jansencb4eaad1995-11-30 15:03:59 +000073 def makeblacklistnames(self):
74 return [
Jack Jansen007b8eb2004-01-03 17:23:27 +000075 "xmlIdentifierUnrecognized", # const with incompatible definition
Jack Jansencb4eaad1995-11-30 15:03:59 +000076 "DisposeMovie", # Done on python-object disposal
Jack Jansen453ced51995-11-30 17:42:08 +000077 "DisposeMovieTrack", # ditto
78 "DisposeTrackMedia", # ditto
79 "DisposeUserData", # ditto
Jack Jansenb2006391998-04-23 13:22:44 +000080# "DisposeTimeBase", # ditto
Jack Jansen9cfea101995-12-09 14:05:56 +000081 "DisposeMovieController", # ditto
Jack Jansen68a0ee01997-09-01 15:38:24 +000082
Jack Jansen453ced51995-11-30 17:42:08 +000083 # The following 4 use 'void *' in an uncontrolled way
84 # TBD when I've read the manual...
85 "GetUserDataItem",
86 "SetUserDataItem",
87 "SetTextSampleData",
Jack Jansene0cf87b1997-04-09 15:53:46 +000088 "BeginFullScreen",
Jack Jansen453ced51995-11-30 17:42:08 +000089 # bgen gets the argument in/out wrong..
90 "AddTextSample",
91 "AddTESample",
92 "AddHiliteSample",
93 "HiliteTextSample",
Jack Jansen1c4e6141998-04-21 15:23:55 +000094
95 "MakeTrackTimeTable", # Uses long * return?
96 "MakeMediaTimeTable", # ditto
Jack Jansena05ac601999-12-12 21:41:51 +000097## "VideoMediaGetStallCount", # Undefined in CW Pro 3 library
Jack Jansen6c7e3262002-12-12 10:31:54 +000098 # OS8 only:
99 'SpriteMediaGetIndImageProperty', # XXXX Why isn't this in carbon?
100 'CheckQuickTimeRegistration',
101 'SetMovieAnchorDataRef',
102 'GetMovieAnchorDataRef',
103 'GetMovieLoadState',
104 'OpenADataHandler',
105 'MovieMediaGetCurrentMovieProperty',
106 'MovieMediaGetCurrentTrackProperty',
107 'MovieMediaGetChildMovieDataReference',
108 'MovieMediaSetChildMovieDataReference',
109 'MovieMediaLoadChildMovieFromDataReference',
110 'Media3DGetViewObject',
Jack Jansencb4eaad1995-11-30 15:03:59 +0000111
Jack Jansen06778242004-01-02 23:51:22 +0000112 # these are ImageCompression blacklists
113 "GraphicsExportGetInputPtr",
Jack Jansen007b8eb2004-01-03 17:23:27 +0000114
115 # QuickTimeComponents
116 # These two need some help: the first returns a point to a databuffer that
117 # the second disposes. Generate manually?
118 "VDCompressDone",
119 "VDReleaseCompressBuffer",
120 "QTVideoOutputGetGWorldParameters", # How useful is this?
Jack Jansen2e5e6442004-01-09 23:18:47 +0000121
122 # MediaHandlers
123 "MediaMakeMediaTimeTable", # just lazy
124 "MediaGetSampleDataPointer", # funny output pointer
Jack Jansenae57b7f2004-01-11 22:27:42 +0000125
126 # QuickTimeMusic
127 "kControllerMinimum",
128 # These are artefacts of a macro definition
129 "ulen",
130 "_ext",
131 "x",
132 "w1",
133 "w2",
Jack Jansen6c7e3262002-12-12 10:31:54 +0000134 ]
Jack Jansen8d929ae2000-06-21 22:07:06 +0000135
Jack Jansencb4eaad1995-11-30 15:03:59 +0000136 def makeblacklisttypes(self):
137 return [
Jack Jansen453ced51995-11-30 17:42:08 +0000138 # I don't think we want to do these
139 "QTSyncTaskPtr",
140 # We dont do callbacks yet, so no need for these
Jack Jansencb4eaad1995-11-30 15:03:59 +0000141 "QTCallBack",
Jack Jansen453ced51995-11-30 17:42:08 +0000142 # Skipped for now, due to laziness
Jack Jansencb4eaad1995-11-30 15:03:59 +0000143 "TrackEditState",
144 "MovieEditState",
Jack Jansencb4eaad1995-11-30 15:03:59 +0000145 "MatrixRecord",
146 "MatrixRecord_ptr",
Jack Jansen453ced51995-11-30 17:42:08 +0000147 "SampleReferencePtr",
Jack Jansen1c4e6141998-04-21 15:23:55 +0000148 "QTTweener",
Jack Jansen59f7dc92004-01-02 23:27:42 +0000149 "QTErrorReplacementPtr",
150 "QTRestrictionSet",
151 "QTUUID",
152 "QTUUID_ptr",
Jack Jansen68a0ee01997-09-01 15:38:24 +0000153
Jack Jansen453ced51995-11-30 17:42:08 +0000154 # Routine pointers, not yet.
155 "MoviesErrorUPP",
156 "MoviePreviewCallOutUPP",
157 "MovieDrawingCompleteUPP",
Jack Jansencb4eaad1995-11-30 15:03:59 +0000158 "QTCallBackUPP",
159 "TextMediaUPP",
160 "MovieProgressUPP",
161 "MovieRgnCoverUPP",
162 "MCActionFilterUPP",
163 "MCActionFilterWithRefConUPP",
Jack Jansen453ced51995-11-30 17:42:08 +0000164 "GetMovieUPP",
165 "ModalFilterUPP",
Jack Jansene0cf87b1997-04-09 15:53:46 +0000166 "TrackTransferUPP",
Jack Jansen723ad8a2000-12-12 22:10:21 +0000167 "MoviePrePrerollCompleteUPP",
168 "MovieExecuteWiredActionsUPP",
169 "QTBandwidthNotificationUPP",
170 "DoMCActionUPP",
Jack Jansen59f7dc92004-01-02 23:27:42 +0000171 "QTNextTaskNeededSoonerCallbackUPP",
Jack Jansen723ad8a2000-12-12 22:10:21 +0000172
173 "SampleReference64Ptr", # Don't know what this does, yet
174 "QTRuntimeSpriteDescPtr",
175 "QTBandwidthReference",
176 "QTScheduledBandwidthReference",
Jack Jansen4a8c54e1997-02-24 13:56:59 +0000177 "QTAtomContainer",
178 "SpriteWorld",
179 "Sprite",
Jack Jansen06778242004-01-02 23:51:22 +0000180
181 # these are ImageCompression blacklists
182 "ICMDataUPP",
183 "ICMFlushUPP",
184 "ICMCompletionUPP",
185 "ICMProgressUPP",
186 "StdPixUPP",
187 "QDPixUPP",
188 "ICMAlignmentUPP",
189 "ICMCursorShieldedUPP",
190 "ICMMemoryDisposedUPP",
191 "ICMConvertDataFormatUPP",
192 "ModalFilterYDUPP",
193 "FileFilterUPP",
194
195 "CodecNameSpecListPtr",
196 "CodecInfo",
197 "ImageSequence",
198 "MatrixRecordPtr",
199 "ICMDataProcRecordPtr",
200 "OpenCPicParams",
201 "ICMProgressProcRecordPtr",
202 "ICMAlignmentProcRecordPtr",
203 "ICMPixelFormatInfoPtr",
204 "ImageSequenceDataSource",
205 "ConstStrFileNameParam",
206 "ImageTranscodeSequence",
207 "ImageFieldSequence",
208 "Fract",
209 "PixMapPtr",
210 "GWorldFlags",
211 "void_ptr", # XXX Being lazy, this one is doable.
Jack Jansen007b8eb2004-01-03 17:23:27 +0000212
213 # These are from QuickTimeComponents
214 "CDataHandlerUPP",
215 "CharDataHandlerUPP",
216 "CommentHandlerUPP",
217 "DataHCompletionUPP",
218 "'MovieExportGetDataUPP",
219 "MovieExportGetPropertyUPP",
220 "PreprocessInstructionHandlerUPP",
221 "SGModalFilterUPP",
222 "StartDocumentHandlerUPP",
223 "StartElementHandlerUPP",
224 "VdigIntUPP",
225 "SGDataUPP",
226 "EndDocumentHandlerUPP",
227 "EndElementHandlerUPP",
228 "VideoBottles", # Record full of UPPs
229
230 "SCParams",
231 "ICMCompletionProcRecordPtr",
232 "DataHVolumeList",
233 "DigitizerInfo",
234 "SGCompressInfo",
235 "SeqGrabExtendedFrameInfoPtr",
236 "SeqGrabFrameInfoPtr",
237 "TCTextOptionsPtr",
238 "SGCompressInfo_ptr",
239 "SGDeviceList",
240 "TextDisplayData",
241 "TimeCodeDef",
242 "TimeCodeRecord",
243 "TweenRecord",
244 "VDGamRecPtr",
245 "ToneDescription", # XXXX Just lazy: this one is easy.
246 "XMLDoc",
247 "UInt64", # XXXX lazy
248 "UInt64_ptr", # XXXX lazy
Jack Jansen2e5e6442004-01-09 23:18:47 +0000249
250 # From MediaHandlers
251 "ActionsUPP",
252 "PrePrerollCompleteUPP",
253 "CodecComponentHandle", # Difficult: handle containing list of components.
254 "GetMovieCompleteParams", # Immense struct
255 "LevelMeterInfoPtr", # Lazy. Also: can be an output parameter!!
256 "MediaEQSpectrumBandsRecordPtr", # ditto
Jack Jansenae57b7f2004-01-11 22:27:42 +0000257
258 # From QuickTimeMusic
259 "MusicMIDISendUPP",
260 "MusicOfflineDataUPP",
261 "TuneCallBackUPP",
262 "TunePlayCallBackUPP",
263 "GCPart", # Struct with lots of fields
264 "GCPart_ptr",
265 "GenericKnobDescription", # Struct with lots of fields
266 "KnobDescription", # Struct with lots of fields
267 "InstrumentAboutInfo", # Struct, not too difficult
268 "NoteChannel", # XXXX Lazy. Could be opaque, I think
269 "NoteRequest", # XXXX Lazy. Not-too-difficult struct
270 "SynthesizerConnections", # Struct with lots of fields
271 "SynthesizerDescription", # Struct with lots of fields
272 "TuneStatus", # Struct with lots of fields
273
Jack Jansencb4eaad1995-11-30 15:03:59 +0000274 ]
275
276 def makerepairinstructions(self):
277 return [
Jack Jansen453ced51995-11-30 17:42:08 +0000278 ([('FSSpec', '*', 'OutMode')], [('FSSpec_ptr', '*', 'InMode')]),
Jack Jansen9cfea101995-12-09 14:05:56 +0000279
280 # Movie controller creation
281 ([('ComponentInstance', 'NewMovieController', 'ReturnMode')],
282 [('MovieController', '*', 'ReturnMode')]),
283
284 # NewMovieFromFile
285 ([('short', 'resId', 'OutMode'), ('StringPtr', 'resName', 'InMode')],
Jack Jansene0cf87b1997-04-09 15:53:46 +0000286 [('short', 'resId', 'InOutMode'), ('dummyStringPtr', 'resName', 'InMode')]),
Jack Jansen9cfea101995-12-09 14:05:56 +0000287
Jack Jansen4a8c54e1997-02-24 13:56:59 +0000288 # MCDoAction and more
289 ([('void', '*', 'OutMode')], [('mcactionparams', '*', 'InMode')]),
290
Jack Jansen1b7a70f2000-03-03 17:06:13 +0000291 # SetTimeBaseZero. Does not handle NULLs, unfortunately
292 ([('TimeRecord', 'zero', 'OutMode')], [('TimeRecord', 'zero', 'InMode')]),
293
294 # ConvertTime and ConvertTimeScale
295 ([('TimeRecord', 'inout', 'OutMode')], [('TimeRecord', 'inout', 'InOutMode')]),
Jack Jansenb9fa1a92003-02-04 15:35:07 +0000296 ([('TimeRecord', 'theTime', 'OutMode')], [('TimeRecord', 'theTime', 'InOutMode')]),
Jack Jansen1b7a70f2000-03-03 17:06:13 +0000297
298 # AddTime and SubtractTime
299 ([('TimeRecord', 'dst', 'OutMode')], [('TimeRecord', 'dst', 'InOutMode')]),
Jack Jansen620a7662001-12-18 15:39:38 +0000300
301 # Funny definitions
302 ([('char_ptr', '*', 'InMode')], [('stringptr', '*', 'InMode')]),
303 ([('FSSpecPtr', '*', 'InMode')], [('FSSpec_ptr', '*', 'InMode')]),
304 ([('unsigned_char', 'swfVersion', 'OutMode')], [('UInt8', 'swfVersion', 'OutMode')]),
Jack Jansenae57b7f2004-01-11 22:27:42 +0000305
306 # It seems MusicMIDIPacket if never flagged with const but always used
307 # for sending only. If that ever changes this needs to be fixed.
308 ([('MusicMIDIPacket', '*', 'OutMode')], [('MusicMIDIPacket_ptr', '*', 'InMode')]),
Jack Jansen69387e12004-01-11 22:52:12 +0000309
310 # QTMusic const-less input parameters
311 ([('unsigned_long', 'header', 'OutMode')], [('UnsignedLongPtr', 'header', 'InMode')]),
Jack Jansencb4eaad1995-11-30 15:03:59 +0000312 ]
313
314if __name__ == "__main__":
315 main()