1 // Basic types:
2 
3 typedef char *                          Ptr;
4 typedef Ptr *                           Handle;
5 typedef long                            Size;
6 typedef unsigned char                   Boolean;
7 typedef unsigned char                   Str31[32];
8 typedef long                            Fixed;
9 
10 typedef long OSErr;
11 typedef int OSType;
12 
13 typedef long ComponentResult;
14 typedef unsigned char                   UInt8;
15 typedef signed char                     SInt8;
16 typedef unsigned short                  UInt16;
17 typedef signed short                    SInt16;
18 typedef unsigned long                   UInt32;
19 typedef signed long                     SInt32;
20 
21 #define FOUR_CHAR_CODE(a,b,c,d)       (((a)<<24)|((b)<<16)|((c)<<8)|(d))
22 
23 // codec private shit:
24 typedef void *GlobalsPtr;
25 typedef void **Globals;
26 
27 //==================== COMPONENTS ===========================
28 
29 struct __attribute__((__packed__)) ComponentParameters {
30     UInt8                           flags;                      /* call modifiers: sync/async, deferred, immed, etc */
31     UInt8                           paramSize;                  /* size in bytes of actual parameters passed to this call */
32     short                           what;                       /* routine selector, negative for Component management calls */
33     long                            params[1];                  /* actual parameters for the indicated routine */
34 };
35 typedef struct ComponentParameters      ComponentParameters;
36 
37 
38 struct __attribute__((__packed__)) ComponentDescription {
39     OSType                          componentType;              /* A unique 4-byte code indentifying the command set */
40     OSType                          componentSubType;           /* Particular flavor of this instance */
41     OSType                          componentManufacturer;      /* Vendor indentification */
42     unsigned long                   componentFlags;             /* 8 each for Component,Type,SubType,Manuf/revision */
43     unsigned long                   componentFlagsMask;         /* Mask for specifying which flags to consider in search, zero during registration */
44 };
45 typedef struct ComponentDescription     ComponentDescription;
46 
47 
48 struct __attribute__((__packed__)) ResourceSpec {
49     OSType                          resType;                    /* 4-byte code    */
50     short                           resID;                      /*         */
51 };
52 typedef struct ResourceSpec             ResourceSpec;
53 
54 
55 struct __attribute__((__packed__)) ComponentResource {
56     ComponentDescription            cd;                         /* Registration parameters */
57     ResourceSpec                    component;                  /* resource where Component code is found */
58     ResourceSpec                    componentName;              /* name string resource */
59     ResourceSpec                    componentInfo;              /* info string resource */
60     ResourceSpec                    componentIcon;              /* icon resource */
61 };
62 typedef struct ComponentResource        ComponentResource;
63 typedef ComponentResource *             ComponentResourcePtr;
64 typedef ComponentResourcePtr *          ComponentResourceHandle;
65 
66 
67 struct __attribute__((__packed__)) ComponentRecord {
68     long                            data[1];
69 };
70 typedef struct ComponentRecord          ComponentRecord;
71 typedef ComponentRecord *               Component;
72 
73 
74 struct __attribute__((__packed__)) ComponentInstanceRecord {
75     long                            data[1];
76 };
77 typedef struct ComponentInstanceRecord  ComponentInstanceRecord;
78 
79 typedef ComponentInstanceRecord *       ComponentInstance;
80 
81 // ========================= QUICKDRAW =========================
82 
83 struct __attribute__((__packed__)) Rect {
84     short                           top;
85     short                           left;
86     short                           bottom;
87     short                           right;
88 };
89 typedef struct Rect                     Rect;
90 typedef Rect *                          RectPtr;
91 
92 struct __attribute__((__packed__)) RGBColor {
93     unsigned short                  red;                        /*magnitude of red component*/
94     unsigned short                  green;                      /*magnitude of green component*/
95     unsigned short                  blue;                       /*magnitude of blue component*/
96 };
97 typedef struct RGBColor                 RGBColor;
98 typedef RGBColor *                      RGBColorPtr;
99 typedef RGBColorPtr *                   RGBColorHdl;
100 
101 struct __attribute__((__packed__)) ColorSpec {
102     short                           value;                      /*index or other value*/
103     RGBColor                        rgb;                        /*true color*/
104 };
105 typedef struct ColorSpec                ColorSpec;
106 typedef ColorSpec *                     ColorSpecPtr;
107 typedef ColorSpec                       CSpecArray[1];
108 
109 struct __attribute__((__packed__)) ColorTable {
110     long                            ctSeed;                     /*unique identifier for table*/
111     short                           ctFlags;                    /*high bit: 0 = PixMap; 1 = device*/
112     short                           ctSize;                     /*number of entries in CTTable*/
113     CSpecArray                      ctTable;                    /*array [0..0] of ColorSpec*/
114 };
115 typedef struct ColorTable               ColorTable;
116 typedef ColorTable *                    CTabPtr;
117 typedef CTabPtr *                       CTabHandle;
118 
119 struct __attribute__((__packed__)) MatrixRecord {
120     Fixed                           matrix[3][3];
121 };
122 typedef struct MatrixRecord             MatrixRecord;
123 typedef MatrixRecord *                  MatrixRecordPtr;
124 
125 typedef long                            ImageSequence;
126 typedef OSType                          CodecType;
127 typedef unsigned short                  CodecFlags;
128 typedef unsigned long                   CodecQ;
129 
130 struct __attribute__((__packed__)) ImageDescription {
131     long                            idSize;                     /* total size of ImageDescription including extra data ( CLUTs and other per sequence data ) */
132     CodecType                       cType;                      /* what kind of codec compressed this data */
133     long                            resvd1;                     /* reserved for Apple use */
134     short                           resvd2;                     /* reserved for Apple use */
135     short                           dataRefIndex;               /* set to zero  */
136     short                           version;                    /* which version is this data */
137     short                           revisionLevel;              /* what version of that codec did this */
138     long                            vendor;                     /* whose  codec compressed this data */
139     CodecQ                          temporalQuality;            /* what was the temporal quality factor  */
140     CodecQ                          spatialQuality;             /* what was the spatial quality factor */
141     short                           width;                      /* how many pixels wide is this data */
142     short                           height;                     /* how many pixels high is this data */
143     Fixed                           hRes;                       /* horizontal resolution */
144     Fixed                           vRes;                       /* vertical resolution */
145     long                            dataSize;                   /* if known, the size of data for this image descriptor */
146     short                           frameCount;                 /* number of frames this description applies to */
147     Str31                           name;                       /* name of codec ( in case not installed )  */
148     short                           depth;                      /* what depth is this data (1-32) or ( 33-40 grayscale ) */
149     short                           clutID;                     /* clut id or if 0 clut follows  or -1 if no clut */
150 };
151 typedef struct ImageDescription         ImageDescription;
152 typedef ImageDescription *              ImageDescriptionPtr;
153 typedef ImageDescriptionPtr *           ImageDescriptionHandle;
154 
155 /* values for PixMap.pixelFormat*/
156 enum {
157     k16LE555PixelFormat         = FOUR_CHAR_CODE('L','5','5','5'),       /* 16 bit LE rgb 555 (PC)*/
158     k16LE5551PixelFormat        = FOUR_CHAR_CODE('5','5','5','1'),       /* 16 bit LE rgb 5551*/
159     k16BE565PixelFormat         = FOUR_CHAR_CODE('B','5','6','5'),       /* 16 bit BE rgb 565*/
160     k16LE565PixelFormat         = FOUR_CHAR_CODE('L','5','6','5'),       /* 16 bit LE rgb 565*/
161     k24BGRPixelFormat           = FOUR_CHAR_CODE('2','4','B','G'),       /* 24 bit bgr */
162     k32BGRAPixelFormat          = FOUR_CHAR_CODE('B','G','R','A'),       /* 32 bit bgra    (Matrox)*/
163     k32ABGRPixelFormat          = FOUR_CHAR_CODE('A','B','G','R'),       /* 32 bit abgr    */
164     k32RGBAPixelFormat          = FOUR_CHAR_CODE('R','G','B','A'),       /* 32 bit rgba    */
165     kYUVSPixelFormat            = FOUR_CHAR_CODE('y','u','v','s'),       /* YUV 4:2:2 byte ordering 16-unsigned = 'YUY2'*/
166     kYUVUPixelFormat            = FOUR_CHAR_CODE('y','u','v','u'),       /* YUV 4:2:2 byte ordering 16-signed*/
167     kYVU9PixelFormat            = FOUR_CHAR_CODE('Y','V','U','9'),       /* YVU9 Planar    9*/
168     kYUV411PixelFormat          = FOUR_CHAR_CODE('Y','4','1','1'),       /* YUV 4:1:1 Interleaved  16*/
169     kYVYU422PixelFormat         = FOUR_CHAR_CODE('Y','V','Y','U'),       /* YVYU 4:2:2 byte ordering   16*/
170     kUYVY422PixelFormat         = FOUR_CHAR_CODE('U','Y','V','Y'),       /* UYVY 4:2:2 byte ordering   16*/
171     kYUV211PixelFormat          = FOUR_CHAR_CODE('Y','2','1','1'),       /* YUV 2:1:1 Packed   8*/
172     k2vuyPixelFormat            = FOUR_CHAR_CODE('2','v','u','y')        /* UYVY 4:2:2 byte ordering   16*/
173 };
174 
175 struct __attribute__((__packed__)) PixMapExtension {
176     long                            extSize;                    /*size of struct, duh!*/
177     unsigned long                   pmBits;                     /*pixmap attributes bitfield*/
178     void *                          pmGD;                       /*this is a GDHandle*/
179     long                            pmSeed;
180     Fixed                           gammaLevel;                 /*pixmap gammalevel*/
181     Fixed                           requestedGammaLevel;
182     unsigned long                   reserved2;
183     long                            longRowBytes;               /*used when rowBytes > 16382*/
184     unsigned long                   signature;
185     Handle                          baseAddrHandle;
186 };
187 typedef struct PixMapExtension          PixMapExtension;
188 
189 typedef PixMapExtension *               PixMapExtPtr;
190 typedef PixMapExtPtr *                  PixMapExtHandle;
191 
192 
193 struct __attribute__((__packed__)) PixMap {
194     Ptr                             baseAddr;                   /*pointer to pixels*/
195     short                           rowBytes;                   /*offset to next line*/
196     Rect                            bounds;                     /*encloses bitmap*/
197     short                           pmVersion;                  /*pixMap version number*/
198     short                           packType;                   /*defines packing format*/
199     long                            packSize;                   /*length of pixel data*/
200     Fixed                           hRes;                       /*horiz. resolution (ppi)*/
201     Fixed                           vRes;                       /*vert. resolution (ppi)*/
202     short                           pixelType;                  /*defines pixel type*/
203     short                           pixelSize;                  /*# bits in pixel*/
204     short                           cmpCount;                   /*# components in pixel*/
205     short                           cmpSize;                    /*# bits per component*/
206     OSType                          pixelFormat;                /*fourCharCode representation*/
207     CTabHandle                      pmTable;                    /*color map for this pixMap*/
208     PixMapExtHandle                 pmExt;                      /*Handle to pixMap extension*/
209 };
210 typedef struct PixMap                   PixMap;
211 typedef PixMap *                        PixMapPtr;
212 typedef PixMapPtr *                     PixMapHandle;
213 
214 
215 struct __attribute__((__packed__)) BitMap {
216     Ptr                             baseAddr;
217     short                           rowBytes;
218     Rect                            bounds;
219 };
220 typedef struct BitMap                   BitMap;
221 typedef BitMap *                        BitMapPtr;
222 typedef BitMapPtr *                     BitMapHandle;
223 typedef struct OpaqueRgnHandle*         RgnHandle;
224 
225 struct Pattern {
226     UInt8                           pat[8];
227 };
228 typedef struct Pattern                  Pattern;
229 typedef unsigned char                   Style;
230 typedef Style                           StyleField;
231 struct __attribute__((__packed__)) Point {
232     short                           v;
233     short                           h;
234 };
235 typedef struct Point                    Point;
236 struct __attribute__((__packed__)) GrafPort {
237     short                           device;
238     BitMap                          portBits;
239     Rect                            portRect;
240     RgnHandle                       visRgn;
241     RgnHandle                       clipRgn;
242     Pattern                         bkPat;
243     Pattern                         fillPat;
244     Point                           pnLoc;
245     Point                           pnSize;
246     short                           pnMode;
247     Pattern                         pnPat;
248     short                           pnVis;
249     short                           txFont;
250     StyleField                      txFace;                     /*StyleField occupies 16-bits, but only first 8-bits are used*/
251     UInt8                           txFlags;                    /* QuickTime uses second 8 bits of StyleField for txFlags */
252     short                           txMode;
253     short                           txSize;
254     Fixed                           spExtra;
255     long                            fgColor;
256     long                            bkColor;
257     short                           colrBit;
258     short                           patStretch;
259     Handle                          picSave;
260     Handle                          rgnSave;
261     Handle                          polySave;
262     /*QDProcsPtr*/void*                      grafProcs;
263 };
264 typedef struct GrafPort                 GrafPort;
265 typedef GrafPort *GWorldPtr;
266 typedef GWorldPtr *GWorldHandle;
267 #define anyCodec                ((CodecComponent)0)
268 enum {
269                                                                 /* transfer modes */
270     srcCopy                     = 0,                            /*the 16 transfer modes*/
271     srcOr                       = 1,
272     srcXor                      = 2,
273     srcBic                      = 3,
274     notSrcCopy                  = 4,
275     notSrcOr                    = 5,
276     notSrcXor                   = 6,
277     notSrcBic                   = 7,
278     patCopy                     = 8,
279     patOr                       = 9,
280     patXor                      = 10,
281     patBic                      = 11,
282     notPatCopy                  = 12,
283     notPatOr                    = 13,
284     notPatXor                   = 14,
285     notPatBic                   = 15,                           /* Special Text Transfer Mode */
286     grayishTextOr               = 49,
287     hilitetransfermode          = 50,
288     hilite                      = 50,                           /* Arithmetic transfer modes */
289     blend                       = 32,
290     addPin                      = 33,
291     addOver                     = 34,
292     subPin                      = 35,
293     addMax                      = 37,
294     adMax                       = 37,
295     subOver                     = 38,
296     adMin                       = 39,
297     ditherCopy                  = 64,                           /* Transparent mode constant */
298     transparent                 = 36
299 };
300 
301 typedef unsigned long                   GWorldFlags;
302 
303 
304 
305 // ============================== CODECS ===========================
306 
307 typedef Component                       CompressorComponent;
308 typedef Component                       DecompressorComponent;
309 typedef Component                       CodecComponent;
310 
311 enum {
312     codecLosslessQuality        = 0x00000400,
313     codecMaxQuality             = 0x000003FF,
314     codecMinQuality             = 0x00000000,
315     codecLowQuality             = 0x00000100,
316     codecNormalQuality          = 0x00000200,
317     codecHighQuality            = 0x00000300
318 };
319 
320 
321 
322 // callbacks:
323 typedef void* ImageCodecDrawBandCompleteUPP;
324 typedef long long ICMProgressProcRecord;
325 typedef long long ICMCompletionProcRecord;
326 typedef long long ICMDataProcRecord;
327 typedef void* ICMFrameTimePtr;
328 typedef void* CDSequenceDataSourcePtr;
329 typedef void* ICMFrameTimeInfoPtr;
330 
331 // graphics port
332 typedef struct OpaqueGrafPtr*           GrafPtr;
333 typedef GrafPtr                         CGrafPtr;
334 
335 
336 /*  codec capabilities flags    */
337 enum {
338     codecCanScale               = 1L << 0,
339 	// 1
340     codecCanMask                = 1L << 1,
341 	// 2
342     codecCanMatte               = 1L << 2,
343 	// 4
344     codecCanTransform           = 1L << 3,
345 	// 8
346     codecCanTransferMode        = 1L << 4,
347 	// 10
348     codecCanCopyPrev            = 1L << 5,
349 	// 20
350     codecCanSpool               = 1L << 6,
351 	// 40
352     codecCanClipVertical        = 1L << 7,
353 	// 80
354     codecCanClipRectangular     = 1L << 8,
355 	// 100
356     codecCanRemapColor          = 1L << 9,
357 	// 200
358     codecCanFastDither          = 1L << 10,
359 	// 400
360     codecCanSrcExtract          = 1L << 11,
361 	// 800
362     codecCanCopyPrevComp        = 1L << 12,
363 	// 1000
364     codecCanAsync               = 1L << 13,
365 	// 2000
366     codecCanMakeMask            = 1L << 14,
367 	// 4000
368     codecCanShift               = 1L << 15,
369 	// 8000
370     codecCanAsyncWhen           = 1L << 16,
371 	// 10000
372     codecCanShieldCursor        = 1L << 17,
373 	// 20000
374     codecCanManagePrevBuffer    = 1L << 18,
375 	// 40000
376     codecHasVolatileBuffer      = 1L << 19,     // 80000                /* codec requires redraw after window movement */
377     codecWantsRegionMask        = 1L << 20,
378 	// 100000
379     codecImageBufferIsOnScreen  = 1L << 21,     // 200000                /* old def of codec using overlay surface, = ( codecIsDirectToScreenOnly | codecUsesOverlaySurface | codecImageBufferIsOverlaySurface | codecSrcMustBeImageBuffer ) */
380     codecWantsDestinationPixels = 1L << 22,
381      // 400000
382     codecWantsSpecialScaling    = 1L << 23,
383      // 800000
384     codecHandlesInputs          = 1L << 24,
385 	// 1000000
386     codecCanDoIndirectSurface   = 1L << 25,                     /* codec can handle indirect surface (GDI) */
387     codecIsSequenceSensitive    = 1L << 26,
388     codecRequiresOffscreen      = 1L << 27,
389     codecRequiresMaskBits       = 1L << 28,
390     codecCanRemapResolution     = 1L << 29,
391     codecIsDirectToScreenOnly   = 1L << 30,                     /* codec can only decompress data to the screen */
392     codecCanLockSurface         = 1L << 31                      /* codec can lock destination surface, icm doesn't lock for you */
393 };
394 
395 /*  codec capabilities flags2   */
396 enum {
397     codecUsesOverlaySurface     = 1L << 0,                      /* codec uses overlay surface */
398     codecImageBufferIsOverlaySurface = 1L << 1,                 /* codec image buffer is overlay surface, the bits in the buffer are on the screen */
399     codecSrcMustBeImageBuffer   = 1L << 2,                      /* codec can only source data from an image buffer */
400     codecImageBufferIsInAGPMemory = 1L << 4,                    /* codec image buffer is in AGP space, byte writes are OK */
401     codecImageBufferIsInPCIMemory = 1L << 5                     /* codec image buffer is across a PCI bus; byte writes are bad */
402 };
403 
404 /*  codec condition flags   */
405 // FFD =  13 = 8+4+1
406 enum {
407     codecConditionFirstBand     = 1L << 0,
408 	// 1
409     codecConditionLastBand      = 1L << 1,
410 	// 2
411     codecConditionFirstFrame    = 1L << 2,
412 	// 4
413     codecConditionNewDepth      = 1L << 3,
414 	// 8
415     codecConditionNewTransform  = 1L << 4,
416 	// 10
417     codecConditionNewSrcRect    = 1L << 5,
418 	// 20
419     codecConditionNewMask       = 1L << 6,
420 	// 40
421     codecConditionNewMatte      = 1L << 7,
422 	// 80
423     codecConditionNewTransferMode = 1L << 8,
424 	// 100
425     codecConditionNewClut       = 1L << 9,
426 	// 200
427     codecConditionNewAccuracy   = 1L << 10,
428 	// 400
429     codecConditionNewDestination = 1L << 11,
430 	// 800
431     codecConditionFirstScreen   = 1L << 12,
432 	// 1000
433     codecConditionDoCursor      = 1L << 13,
434 	// 2000
435     codecConditionCatchUpDiff   = 1L << 14,
436 	// 4000
437     codecConditionMaskMayBeChanged = 1L << 15,
438 	// 8000
439     codecConditionToBuffer      = 1L << 16,
440 	// 10000
441     codecConditionCodecChangedMask = 1L << 31
442 	// 20000
443 };
444 
445 
446 
447 struct __attribute__((__packed__)) CodecCapabilities {
448     long                            flags;
449     short                           wantedPixelSize;
450     short                           extendWidth;
451     short                           extendHeight;
452     short                           bandMin;
453     short                           bandInc;
454     short                           pad;
455     unsigned long                   time;
456     long                            flags2;                     /* field new in QuickTime 4.0 */
457 };
458 typedef struct CodecCapabilities        CodecCapabilities;
459 
460 struct __attribute__((__packed__)) CodecDecompressParams {
461     ImageSequence                   sequenceID;                 /* predecompress,banddecompress */
462     ImageDescriptionHandle          imageDescription;           /* predecompress,banddecompress */
463     Ptr                             data;
464     long                            bufferSize;
465 
466     long                            frameNumber;
467     long                            startLine;
468     long                            stopLine;
469     long                            conditionFlags;
470 
471     CodecFlags                      callerFlags;
472  // short
473     CodecCapabilities *             capabilities;               /* predecompress,banddecompress */
474     ICMProgressProcRecord           progressProcRecord;
475     ICMCompletionProcRecord         completionProcRecord;
476 
477     ICMDataProcRecord               dataProcRecord;
478     CGrafPtr                        port;                       /* predecompress,banddecompress */
479     PixMap                          dstPixMap;                  /* predecompress,banddecompress */
480     BitMapPtr                       maskBits;
481     PixMapPtr                       mattePixMap;
482     Rect                            srcRect;                    /* predecompress,banddecompress */
483     MatrixRecord *                  matrix;                     /* predecompress,banddecompress */
484     CodecQ                          accuracy;                   /* predecompress,banddecompress */
485     short                           transferMode;               /* predecompress,banddecompress */
486     ICMFrameTimePtr                 frameTime;                  /* banddecompress */
487     long                            reserved[1];
488 
489                                                                 /* The following fields only exist for QuickTime 2.0 and greater */
490     SInt8                           matrixFlags;                /* high bit set if 2x resize */
491     SInt8                           matrixType;
492     Rect                            dstRect;                    /* only valid for simple transforms */
493 
494                                                                 /* The following fields only exist for QuickTime 2.1 and greater */
495     UInt16                          majorSourceChangeSeed;
496     UInt16                          minorSourceChangeSeed;
497     CDSequenceDataSourcePtr         sourceData;
498 
499     RgnHandle                       maskRegion;
500 
501                                                                 /* The following fields only exist for QuickTime 2.5 and greater */
502     OSType **                       wantedDestinationPixelTypes; /* Handle to 0-terminated list of OSTypes */
503 
504     long                            screenFloodMethod;
505     long                            screenFloodValue;
506     short                           preferredOffscreenPixelSize;
507 
508                                                                 /* The following fields only exist for QuickTime 3.0 and greater */
509     ICMFrameTimeInfoPtr             syncFrameTime;              /* banddecompress */
510     Boolean                         needUpdateOnTimeChange;     /* banddecompress */
511     Boolean                         enableBlackLining;
512     Boolean                         needUpdateOnSourceChange;   /* band decompress */
513     Boolean                         pad;
514 
515     long                            unused;
516 
517     CGrafPtr                        finalDestinationPort;
518 
519     long                            requestedBufferWidth;       /* must set codecWantsSpecialScaling to indicate this field is valid*/
520     long                            requestedBufferHeight;      /* must set codecWantsSpecialScaling to indicate this field is valid*/
521 
522                                                                 /* The following fields only exist for QuickTime 4.0 and greater */
523     Rect                            displayableAreaOfRequestedBuffer; /* set in predecompress*/
524     Boolean                         requestedSingleField;
525     Boolean                         needUpdateOnNextIdle;
526     Boolean                         pad2[2];
527     Fixed                           bufferGammaLevel;
528 
529                                                                 /* The following fields only exist for QuickTime 5.0 and greater */
530     UInt32                          taskWeight;                 /* preferred weight for MP tasks implementing this operation*/
531     OSType                          taskName;                   /* preferred name (type) for MP tasks implementing this operation*/
532 };
533 typedef struct CodecDecompressParams    CodecDecompressParams;
534 
535 
536 
537 struct __attribute__((__packed__)) ImageSubCodecDecompressCapabilities {
538     long                            recordSize;                 /* sizeof(ImageSubCodecDecompressCapabilities)*/
539     long                            decompressRecordSize;       /* size of your codec's decompress record*/
540     Boolean                         canAsync;                   /* default true*/
541     UInt8                           pad0;
542 
543                                                                 /* The following fields only exist for QuickTime 4.0 and greater */
544     UInt16                          suggestedQueueSize;
545     Boolean                         canProvideTrigger;
546 
547                                                                 /* The following fields only exist for QuickTime 5.0 and greater */
548     Boolean                         subCodecFlushesScreen;      /* only used on Mac OS X*/
549     Boolean                         subCodecCallsDrawBandComplete;
550     UInt8                           pad2[1];
551 
552                                                                 /* The following fields only exist for QuickTime 5.1 and greater */
553     Boolean                         isChildCodec;               /* set by base codec before calling Initialize*/
554     UInt8                           pad3[3];
555 };
556 typedef struct ImageSubCodecDecompressCapabilities ImageSubCodecDecompressCapabilities;
557 
558 
559 struct __attribute__((__packed__)) ImageSubCodecDecompressRecord {
560     Ptr                             baseAddr;
561     long                            rowBytes;
562     Ptr                             codecData;
563     ICMProgressProcRecord           progressProcRecord;
564     ICMDataProcRecord               dataProcRecord;
565     void *                          userDecompressRecord;       /* pointer to codec-specific per-band data*/
566     UInt8                           frameType;
567     Boolean                         inhibitMP;                  /* set this in BeginBand to tell the base decompressor not to call DrawBand from an MP task for this frame.  (Only has any effect for MP-capable subcodecs.  New in QuickTime 5.0.)*/
568     UInt8                           pad[2];
569     long                            priv[2];
570 
571                                                                 /* The following fields only exist for QuickTime 5.0 and greater */
572     ImageCodecDrawBandCompleteUPP   drawBandCompleteUPP;        /* only used if subcodec set subCodecCallsDrawBandComplete; if drawBandCompleteUPP is non-nil, codec must call it when a frame is finished, but may return from DrawBand before the frame is finished. */
573     void *                          drawBandCompleteRefCon;     /* Note: do not call drawBandCompleteUPP directly from a hardware interrupt; instead, use DTInstall to run a function at deferred task time, and call drawBandCompleteUPP from that. */
574 };
575 typedef struct ImageSubCodecDecompressRecord ImageSubCodecDecompressRecord;
576 
577 
578 /* These are the bits that are set in the Component flags, and also in the codecInfo struct. */
579 enum {
580     codecInfoDoes1              = (1L << 0),                    /* codec can work with 1-bit pixels */
581     codecInfoDoes2              = (1L << 1),                    /* codec can work with 2-bit pixels */
582     codecInfoDoes4              = (1L << 2),                    /* codec can work with 4-bit pixels */
583     codecInfoDoes8              = (1L << 3),                    /* codec can work with 8-bit pixels */
584     codecInfoDoes16             = (1L << 4),                    /* codec can work with 16-bit pixels */
585     codecInfoDoes32             = (1L << 5),                    /* codec can work with 32-bit pixels */
586     codecInfoDoesDither         = (1L << 6),                    /* codec can do ditherMode */
587     codecInfoDoesStretch        = (1L << 7),                    /* codec can stretch to arbitrary sizes */
588     codecInfoDoesShrink         = (1L << 8),                    /* codec can shrink to arbitrary sizes */
589     codecInfoDoesMask           = (1L << 9),                    /* codec can mask to clipping regions */
590     codecInfoDoesTemporal       = (1L << 10),                   /* codec can handle temporal redundancy */
591     codecInfoDoesDouble         = (1L << 11),                   /* codec can stretch to double size exactly */
592     codecInfoDoesQuad           = (1L << 12),                   /* codec can stretch to quadruple size exactly */
593     codecInfoDoesHalf           = (1L << 13),                   /* codec can shrink to half size */
594     codecInfoDoesQuarter        = (1L << 14),                   /* codec can shrink to quarter size */
595     codecInfoDoesRotate         = (1L << 15),                   /* codec can rotate on decompress */
596     codecInfoDoesHorizFlip      = (1L << 16),                   /* codec can flip horizontally on decompress */
597     codecInfoDoesVertFlip       = (1L << 17),                   /* codec can flip vertically on decompress */
598     codecInfoHasEffectParameterList = (1L << 18),               /* codec implements get effects parameter list call, once was codecInfoDoesSkew */
599     codecInfoDoesBlend          = (1L << 19),                   /* codec can blend on decompress */
600     codecInfoDoesWarp           = (1L << 20),                   /* codec can warp arbitrarily on decompress */
601     codecInfoDoesRecompress     = (1L << 21),                   /* codec can recompress image without accumulating errors */
602     codecInfoDoesSpool          = (1L << 22),                   /* codec can spool image data */
603     codecInfoDoesRateConstrain  = (1L << 23)                    /* codec can data rate constrain */
604 };
605 
606 
607 enum {
608     codecInfoDepth1             = (1L << 0),                    /* compressed data at 1 bpp depth available */
609     codecInfoDepth2             = (1L << 1),                    /* compressed data at 2 bpp depth available */
610     codecInfoDepth4             = (1L << 2),                    /* compressed data at 4 bpp depth available */
611     codecInfoDepth8             = (1L << 3),                    /* compressed data at 8 bpp depth available */
612     codecInfoDepth16            = (1L << 4),                    /* compressed data at 16 bpp depth available */
613     codecInfoDepth32            = (1L << 5),                    /* compressed data at 32 bpp depth available */
614     codecInfoDepth24            = (1L << 6),                    /* compressed data at 24 bpp depth available */
615     codecInfoDepth33            = (1L << 7),                    /* compressed data at 1 bpp monochrome depth  available */
616     codecInfoDepth34            = (1L << 8),                    /* compressed data at 2 bpp grayscale depth available */
617     codecInfoDepth36            = (1L << 9),                    /* compressed data at 4 bpp grayscale depth available */
618     codecInfoDepth40            = (1L << 10),                   /* compressed data at 8 bpp grayscale depth available */
619     codecInfoStoresClut         = (1L << 11),                   /* compressed data can have custom cluts */
620     codecInfoDoesLossless       = (1L << 12),                   /* compressed data can be stored in lossless format */
621     codecInfoSequenceSensitive  = (1L << 13)                    /* compressed data is sensitive to out of sequence decoding */
622 };
623 
624 struct __attribute__((__packed__)) CodecInfo {
625     Str31                           typeName;                   /* name of the codec type i.e.: 'Apple Image Compression' */
626     short                           version;                    /* version of the codec data that this codec knows about */
627     short                           revisionLevel;              /* revision level of this codec i.e: 0x00010001 (1.0.1) */
628     long                            vendor;                     /* Maker of this codec i.e: 'appl' */
629     long                            decompressFlags;            /* codecInfo flags for decompression capabilities */
630     long                            compressFlags;              /* codecInfo flags for compression capabilities */
631     long                            formatFlags;                /* codecInfo flags for compression format details */
632     UInt8                           compressionAccuracy;        /* measure (1-255) of accuracy of this codec for compress (0 if unknown) */
633     UInt8                           decompressionAccuracy;      /* measure (1-255) of accuracy of this codec for decompress (0 if unknown) */
634     unsigned short                  compressionSpeed;           /* ( millisecs for compressing 320x240 on base mac II) (0 if unknown)  */
635     unsigned short                  decompressionSpeed;         /* ( millisecs for decompressing 320x240 on mac II)(0 if unknown)  */
636     UInt8                           compressionLevel;           /* measure (1-255) of compression level of this codec (0 if unknown)  */
637     UInt8                           resvd;                      /* pad */
638     short                           minimumHeight;              /* minimum height of image (block size) */
639     short                           minimumWidth;               /* minimum width of image (block size) */
640     short                           decompressPipelineLatency;  /* in milliseconds ( for asynchronous codecs ) */
641     short                           compressPipelineLatency;    /* in milliseconds ( for asynchronous codecs ) */
642     long                            privateData;
643 };
644 typedef struct CodecInfo                CodecInfo;
645 
dump_ImageDescription(void * xxx)646 static inline void dump_ImageDescription(void* xxx){
647     ImageDescription* id=(ImageDescription*)xxx;
648     unsigned char* x;
649     int i;
650 
651     for(i=0;i<id->idSize;i++){
652 	printf(" %02X",((unsigned char*)id)[i]);
653 	if((i%16)==15) printf("\n");
654     }
655     printf("\n");
656 
657 
658     printf("=============== ImageDescription at %p ==================\n",xxx);
659     printf("idSize=0x%lX  fourcc=0x%08X\n",id->idSize,id->cType);
660     printf("ver=%d rev=%d vendor=0x%08lX\n",id->version,id->revisionLevel,id->vendor);
661     printf("tempQ=%ld spatQ=%ld  dim: %d x %d  dpi: %ld x %ld  depth: %d\n",
662 	id->temporalQuality,id->spatialQuality,
663 	id->width, id->height,
664 	id->hRes, id->vRes,
665 	id->depth);
666     printf("dataSize=%ld frameCount=%d clutID=%d\n",id->dataSize, id->frameCount, id->clutID);
667     printf("name='%.*s'\n",((char*)(&id->name))[0],((char*)(&id->name))+1);
668     x=((char*)(&id->clutID))+2;
669     if(id->idSize>(int)sizeof(ImageDescription)){
670 	printf("%02X %02X %02X %02X | %02X %02X %02X %02X | %02X %02X %02X %02X | %02X %02X %02X %02X\n",
671 	x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10],x[11],x[12],x[13],x[14],x[15]);
672     }
673     printf("=========================================================\n");
674 }
675 
dump_Rect(const char * title,Rect * r)676 static inline void dump_Rect(const char* title,Rect *r){
677     printf("%s: %d;%d - %d;%d\n",title,
678         (int)r->top,(int)r->left,(int)r->bottom,(int)r->right);
679 }
680 
dump_MatrixRecord(const char * title,MatrixRecord * m)681 static inline void dump_MatrixRecord(const char* title, MatrixRecord *m){
682     printf("%s: [%ld %ld %ld][%ld %ld %ld][%ld %ld %ld]\n",title,
683 	m->matrix[0][0],m->matrix[0][1],m->matrix[0][2],
684 	m->matrix[1][0],m->matrix[1][1],m->matrix[1][2],
685 	m->matrix[2][0],m->matrix[2][1],m->matrix[2][2]);
686 }
687 
dump_PixMap(void * xxx)688 static inline void dump_PixMap(void* xxx){
689     PixMap *p=xxx;
690     printf("=============== PixMap at %p ==================\n",xxx);
691     printf("base=%p  stride=%d\n",p->baseAddr, p->rowBytes);
692     dump_Rect("bounds",&p->bounds);
693     printf("pmVersion=0x%X packType=0x%X\n packSize=0x%lX\n",
694 	p->pmVersion,p->packType, p->packSize);
695     printf("hRes=0x%lX vRes=0x%lX pixelType=0x%X pixelSize=0x%X\n",
696 	p->hRes,p->vRes,p->pixelType,p->pixelSize);
697     printf("cmpCount=0x%X cmpSize=0x%X pixelFormat=0x%X\n",
698 	p->cmpCount,p->cmpSize,p->pixelFormat);
699     printf("pmTable=%p pmExt=%p\n",p->pmTable,p->pmExt);
700     printf("=========================================================\n");
701 }
702 
dump_CodecCapabilities(void * xxx)703 static inline void dump_CodecCapabilities(void* xxx){
704     CodecCapabilities* cc=xxx;
705     if(!xxx) return;
706     printf("=============== CodecCapabilities at %p =================\n",xxx);
707     printf("flags=0x%lX  flags2=0x%lX\n",cc->flags,cc->flags2);
708     printf("wantedPixelSize=%d extendWidth=%d extendHeight=%d band=%d+%d\n",
709 	cc->wantedPixelSize,cc->extendWidth,cc->extendHeight,
710 	cc->bandMin,cc->bandInc);
711     printf("pad=0x%X  time=0x%lX\n",cc->pad,cc->time);
712     printf("=========================================================\n");
713 }
714 
dump_CodecDecompressParams(void * xxx)715 static inline void dump_CodecDecompressParams(void* xxx){
716     CodecDecompressParams* cd=xxx;
717     ImageDescription **idh;
718     int i;
719     if(!xxx) return;
720     printf("=============== CodecDecompressParams at %p ==================\n",xxx);
721     printf("sequenceID=%ld\n",cd->sequenceID);
722     idh=cd->imageDescription;
723     if(idh && idh[0]) dump_ImageDescription(idh[0]);
724 
725     for(i=0;i<(int)sizeof(CodecDecompressParams);i++){
726 	printf(" %02X",((unsigned char*)cd)[i]);
727 	if((i%16)==15) printf("\n");
728     }
729     printf("\n");
730 
731     printf("data=%p  size=%ld\n",cd->data,cd->bufferSize);
732     printf("frameno=%ld  lines: %ld .. %ld   condflags=0x%lX  callerflags=0x%X\n",
733 	cd->frameNumber, cd->startLine, cd->stopLine, cd->conditionFlags,cd->callerFlags);
734 //    printf("maskBits=%p mattePixMap=%p\n",
735 //	cd->maskBits,cd->mattePixMap);
736     dump_PixMap(&cd->dstPixMap);
737 //    if(cd->mattePixMap) dump_PixMap(cd->mattePixMap);
738     if(cd->matrix) dump_MatrixRecord("matrix",cd->matrix);
739     if(cd->capabilities) dump_CodecCapabilities(cd->capabilities);
740     printf("accuracy=%d  transferMode=%d  matrixFlags=0x%X matrixType=%d\n",
741 	(int)cd->accuracy, (int)cd->transferMode, (int)cd->matrixFlags, (int)cd->matrixType);
742     printf("srcrect: %d;%d - %d;%d\n",cd->srcRect.top,cd->srcRect.left,cd->srcRect.bottom,cd->srcRect.right);
743     printf("dstrect: %d;%d - %d;%d\n",cd->dstRect.top,cd->dstRect.left,cd->dstRect.bottom,cd->dstRect.right);
744     printf("wantedDestinationPixelTypes=%p\n",cd->wantedDestinationPixelTypes);
745     if(cd->wantedDestinationPixelTypes){
746 	OSType **p=cd->wantedDestinationPixelTypes;
747 	while(p[0]){
748 	    printf("  0x%p %d\n",p[0],*p[0]);
749 	    ++p;
750 	}
751     }
752     printf("screenFloodMethod=%ld value=%ld  preferredOffscreenPixelSize=%d\n",
753 	cd->screenFloodMethod, cd->screenFloodValue, cd->preferredOffscreenPixelSize);
754     printf("callbacks: progress=0x%08llX compl=0x%08llX data=0x%08llX ftime=%p srcdata=%p sync=%p\n",
755      cd->progressProcRecord, cd->completionProcRecord,
756      cd->dataProcRecord, cd->frameTime, cd->sourceData, cd->syncFrameTime);
757 //    printf("\n");
758 
759     printf("=========================================================\n");
760 
761 
762 }
763 
764