Home | History | Annotate | Download | only in qt
      1 # Scan an Apple header file, generating a Python file of generator calls.
      2 
      3 import sys
      4 from bgenlocations import TOOLBOXDIR, BGENDIR
      5 sys.path.append(BGENDIR)
      6 from scantools import Scanner
      7 
      8 LONG = "QuickTime"
      9 SHORT = "qt"
     10 HEADERFILES= (
     11 #       "Components.h"  -- In Carbon.Cm
     12         "Movies.h",
     13         "ImageCompression.h",
     14         "QuickTimeComponents.h",
     15 #       "ImageCodec.h"  -- seems not too useful, and difficult.
     16 #       "IsochronousDataHandlers.h" -- Is this useful?
     17         "MediaHandlers.h",
     18 #       "QTML.h", -- Windows only, needs separate module
     19 #       "QuickTimeStreaming.h", -- Difficult
     20 #       "QTStreamingComponents.h", -- Needs QTStreaming
     21         "QuickTimeMusic.h",
     22 #       "QuickTimeVR.h", -- Not done yet
     23 #       "Sound.h", -- In Carbon.Snd
     24         )
     25 OBJECTS = ("Movie", "Track", "Media", "UserData", "TimeBase", "MovieController",
     26         "IdleManager", "SGOutput")
     27 
     28 def main():
     29     input = HEADERFILES
     30     output = SHORT + "gen.py"
     31     defsoutput = TOOLBOXDIR + LONG + ".py"
     32     scanner = MyScanner(input, output, defsoutput)
     33     scanner.scan()
     34     scanner.close()
     35     scanner.gentypetest(SHORT+"typetest.py")
     36     print "=== Testing definitions output code ==="
     37     execfile(defsoutput, {}, {})
     38     print "=== Done scanning and generating, now importing the generated code... ==="
     39     exec "import " + SHORT + "support"
     40     print "=== Done.  It's up to you to compile it now! ==="
     41 
     42 class MyScanner(Scanner):
     43 
     44     def destination(self, type, name, arglist):
     45         classname = "Function"
     46         listname = "functions"
     47         if arglist:
     48             t, n, m = arglist[0]
     49             if t in OBJECTS and m == "InMode":
     50                 classname = "Method"
     51                 listname = t + "_methods"
     52         return classname, listname
     53 
     54     def writeinitialdefs(self):
     55         self.defsfile.write("def FOUR_CHAR_CODE(x): return x\n")
     56         self.defsfile.write("xmlIdentifierUnrecognized = -1\n")
     57         self.defsfile.write("kControllerMinimum = -0xf777\n")
     58         self.defsfile.write("notImplementedMusicOSErr      = -2071\n")
     59         self.defsfile.write("cantSendToSynthesizerOSErr    = -2072\n")
     60         self.defsfile.write("cantReceiveFromSynthesizerOSErr = -2073\n")
     61         self.defsfile.write("illegalVoiceAllocationOSErr   = -2074\n")
     62         self.defsfile.write("illegalPartOSErr              = -2075\n")
     63         self.defsfile.write("illegalChannelOSErr           = -2076\n")
     64         self.defsfile.write("illegalKnobOSErr              = -2077\n")
     65         self.defsfile.write("illegalKnobValueOSErr         = -2078\n")
     66         self.defsfile.write("illegalInstrumentOSErr        = -2079\n")
     67         self.defsfile.write("illegalControllerOSErr        = -2080\n")
     68         self.defsfile.write("midiManagerAbsentOSErr        = -2081\n")
     69         self.defsfile.write("synthesizerNotRespondingOSErr = -2082\n")
     70         self.defsfile.write("synthesizerOSErr              = -2083\n")
     71         self.defsfile.write("illegalNoteChannelOSErr       = -2084\n")
     72         self.defsfile.write("noteChannelNotAllocatedOSErr  = -2085\n")
     73         self.defsfile.write("tunePlayerFullOSErr           = -2086\n")
     74         self.defsfile.write("tuneParseOSErr                = -2087\n")
     75 
     76     def makeblacklistnames(self):
     77         return [
     78                 "xmlIdentifierUnrecognized", # const with incompatible definition
     79                 "DisposeMovie",         # Done on python-object disposal
     80                 "DisposeMovieTrack",    # ditto
     81                 "DisposeTrackMedia",    # ditto
     82                 "DisposeUserData",              # ditto
     83 #                       "DisposeTimeBase",              # ditto
     84                 "DisposeMovieController", # ditto
     85 
     86                 # The following 4 use 'void *' in an uncontrolled way
     87                 # TBD when I've read the manual...
     88                 "GetUserDataItem",
     89                 "SetUserDataItem",
     90                 "SetTextSampleData",
     91                 "BeginFullScreen",
     92                 # bgen gets the argument in/out wrong..
     93                 "AddTextSample",
     94                 "AddTESample",
     95                 "AddHiliteSample",
     96                 "HiliteTextSample",
     97 
     98                 "MakeTrackTimeTable", # Uses long * return?
     99                 "MakeMediaTimeTable", # ditto
    100 ##                      "VideoMediaGetStallCount", # Undefined in CW Pro 3 library
    101                 # OS8 only:
    102                 'SpriteMediaGetIndImageProperty',       # XXXX Why isn't this in carbon?
    103                 'CheckQuickTimeRegistration',
    104                 'SetMovieAnchorDataRef',
    105                 'GetMovieAnchorDataRef',
    106                 'GetMovieLoadState',
    107                 'OpenADataHandler',
    108                 'MovieMediaGetCurrentMovieProperty',
    109                 'MovieMediaGetCurrentTrackProperty',
    110                 'MovieMediaGetChildMovieDataReference',
    111                 'MovieMediaSetChildMovieDataReference',
    112                 'MovieMediaLoadChildMovieFromDataReference',
    113                 'Media3DGetViewObject',
    114 
    115     # these are ImageCompression blacklists
    116                 "GraphicsExportGetInputPtr",
    117 
    118                 # QuickTimeComponents
    119                 # These two need some help: the first returns a point to a databuffer that
    120                 # the second disposes. Generate manually?
    121                 "VDCompressDone",
    122                 "VDReleaseCompressBuffer",
    123                 "QTVideoOutputGetGWorldParameters", # How useful is this?
    124 
    125                 # MediaHandlers
    126                 "MediaMakeMediaTimeTable", # just lazy
    127                 "MediaGetSampleDataPointer", # funny output pointer
    128 
    129                 # QuickTimeMusic
    130                 "kControllerMinimum",
    131                 # These are artefacts of a macro definition
    132                 "ulen",
    133                 "_ext",
    134                 "x",
    135                 "w1",
    136                 "w2",
    137                 ]
    138 
    139     def makeblacklisttypes(self):
    140         return [
    141                 # I don't think we want to do these
    142                 "QTSyncTaskPtr",
    143                 # We dont do callbacks yet, so no need for these
    144                 "QTCallBack",
    145                 # Skipped for now, due to laziness
    146                 "TrackEditState",
    147                 "MovieEditState",
    148                 "MatrixRecord",
    149                 "MatrixRecord_ptr",
    150                 "SampleReferencePtr",
    151                 "QTTweener",
    152                 "QTErrorReplacementPtr",
    153                 "QTRestrictionSet",
    154                 "QTUUID",
    155                 "QTUUID_ptr",
    156 
    157                 # Routine pointers, not yet.
    158                 "MoviesErrorUPP",
    159                 "MoviePreviewCallOutUPP",
    160                 "MovieDrawingCompleteUPP",
    161                 "QTCallBackUPP",
    162                 "TextMediaUPP",
    163                 "MovieProgressUPP",
    164                 "MovieRgnCoverUPP",
    165                 "MCActionFilterUPP",
    166                 "MCActionFilterWithRefConUPP",
    167                 "GetMovieUPP",
    168                 "ModalFilterUPP",
    169                 "TrackTransferUPP",
    170                 "MoviePrePrerollCompleteUPP",
    171                 "MovieExecuteWiredActionsUPP",
    172                 "QTBandwidthNotificationUPP",
    173                 "DoMCActionUPP",
    174                 "QTNextTaskNeededSoonerCallbackUPP",
    175 
    176                 "SampleReference64Ptr", # Don't know what this does, yet
    177                 "QTRuntimeSpriteDescPtr",
    178                 "QTBandwidthReference",
    179                 "QTScheduledBandwidthReference",
    180                 "QTAtomContainer",
    181                 "SpriteWorld",
    182                 "Sprite",
    183 
    184     # these are ImageCompression blacklists
    185     "ICMDataUPP",
    186     "ICMFlushUPP",
    187     "ICMCompletionUPP",
    188     "ICMProgressUPP",
    189     "StdPixUPP",
    190     "QDPixUPP",
    191     "ICMAlignmentUPP",
    192     "ICMCursorShieldedUPP",
    193     "ICMMemoryDisposedUPP",
    194     "ICMConvertDataFormatUPP",
    195     "ModalFilterYDUPP",
    196                 "FileFilterUPP",
    197 
    198     "CodecNameSpecListPtr",
    199     "CodecInfo",
    200      "ImageSequence",
    201     "MatrixRecordPtr",
    202     "ICMDataProcRecordPtr",
    203     "OpenCPicParams",
    204     "ICMProgressProcRecordPtr",
    205     "ICMAlignmentProcRecordPtr",
    206     "ICMPixelFormatInfoPtr",
    207     "ImageSequenceDataSource",
    208     "ConstStrFileNameParam",
    209     "ImageTranscodeSequence",
    210     "ImageFieldSequence",
    211     "Fract",
    212     "PixMapPtr",
    213     "GWorldFlags",
    214     "void_ptr",   # XXX Being lazy, this one is doable.
    215 
    216     # These are from QuickTimeComponents
    217     "CDataHandlerUPP",
    218     "CharDataHandlerUPP",
    219     "CommentHandlerUPP",
    220     "DataHCompletionUPP",
    221     "'MovieExportGetDataUPP",
    222     "MovieExportGetPropertyUPP",
    223     "PreprocessInstructionHandlerUPP",
    224     "SGModalFilterUPP",
    225     "StartDocumentHandlerUPP",
    226     "StartElementHandlerUPP",
    227     "VdigIntUPP",
    228     "SGDataUPP",
    229     "EndDocumentHandlerUPP",
    230     "EndElementHandlerUPP",
    231     "VideoBottles", # Record full of UPPs
    232 
    233     "SCParams",
    234     "ICMCompletionProcRecordPtr",
    235     "DataHVolumeList",
    236     "DigitizerInfo",
    237     "SGCompressInfo",
    238     "SeqGrabExtendedFrameInfoPtr",
    239     "SeqGrabFrameInfoPtr",
    240     "TCTextOptionsPtr",
    241     "SGCompressInfo_ptr",
    242     "SGDeviceList",
    243     "TextDisplayData",
    244     "TimeCodeDef",
    245     "TimeCodeRecord",
    246     "TweenRecord",
    247     "VDGamRecPtr",
    248     "ToneDescription",  # XXXX Just lazy: this one is easy.
    249     "XMLDoc",
    250     "UInt64",   # XXXX lazy
    251     "UInt64_ptr", # XXXX lazy
    252 
    253     # From MediaHandlers
    254     "ActionsUPP",
    255     "PrePrerollCompleteUPP",
    256     "CodecComponentHandle", # Difficult: handle containing list of components.
    257     "GetMovieCompleteParams", # Immense struct
    258     "LevelMeterInfoPtr", # Lazy. Also: can be an output parameter!!
    259     "MediaEQSpectrumBandsRecordPtr", # ditto
    260 
    261     # From QuickTimeMusic
    262     "MusicMIDISendUPP",
    263     "MusicOfflineDataUPP",
    264     "TuneCallBackUPP",
    265     "TunePlayCallBackUPP",
    266     "GCPart", # Struct with lots of fields
    267     "GCPart_ptr",
    268     "GenericKnobDescription", # Struct with lots of fields
    269     "KnobDescription",  # Struct with lots of fields
    270     "InstrumentAboutInfo", # Struct, not too difficult
    271     "NoteChannel", # XXXX Lazy. Could be opaque, I think
    272     "NoteRequest", # XXXX Lazy. Not-too-difficult struct
    273     "SynthesizerConnections", # Struct with lots of fields
    274     "SynthesizerDescription", # Struct with lots of fields
    275     "TuneStatus", # Struct with lots of fields
    276 
    277                 ]
    278 
    279     def makerepairinstructions(self):
    280         return [
    281                 ([('FSSpec', '*', 'OutMode')], [('FSSpec_ptr', '*', 'InMode')]),
    282 
    283                 # Movie controller creation
    284                 ([('ComponentInstance', 'NewMovieController', 'ReturnMode')],
    285                  [('MovieController', '*', 'ReturnMode')]),
    286 
    287                 # NewMovieFromFile
    288                 ([('short', 'resId', 'OutMode'), ('StringPtr', 'resName', 'InMode')],
    289                  [('short', 'resId', 'InOutMode'), ('dummyStringPtr', 'resName', 'InMode')]),
    290 
    291                 # MCDoAction and more
    292                 ([('void', '*', 'OutMode')], [('mcactionparams', '*', 'InMode')]),
    293 
    294                 # SetTimeBaseZero. Does not handle NULLs, unfortunately
    295                 ([('TimeRecord', 'zero', 'OutMode')], [('TimeRecord', 'zero', 'InMode')]),
    296 
    297                 # ConvertTime and ConvertTimeScale
    298                 ([('TimeRecord', 'inout', 'OutMode')], [('TimeRecord', 'inout', 'InOutMode')]),
    299                 ([('TimeRecord', 'theTime', 'OutMode')], [('TimeRecord', 'theTime', 'InOutMode')]),
    300 
    301                 # AddTime and SubtractTime
    302                 ([('TimeRecord', 'dst', 'OutMode')], [('TimeRecord', 'dst', 'InOutMode')]),
    303 
    304                 # Funny definitions
    305                 ([('char_ptr', '*', 'InMode')], [('stringptr', '*', 'InMode')]),
    306                 ([('FSSpecPtr', '*', 'InMode')], [('FSSpec_ptr', '*', 'InMode')]),
    307                 ([('unsigned_char', 'swfVersion', 'OutMode')], [('UInt8', 'swfVersion', 'OutMode')]),
    308 
    309                 # It seems MusicMIDIPacket if never flagged with const but always used
    310                 # for sending only. If that ever changes this needs to be fixed.
    311                 ([('MusicMIDIPacket', '*', 'OutMode')], [('MusicMIDIPacket_ptr', '*', 'InMode')]),
    312 
    313                 # QTMusic const-less input parameters
    314                 ([('unsigned_long', 'header', 'OutMode')], [('UnsignedLongPtr', 'header', 'InMode')]),
    315                 ]
    316 
    317 if __name__ == "__main__":
    318     main()
    319