fauxcodec.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:55k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: fauxcodec.cpp,v 1.3.20.1 2004/07/09 01:59:02 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. /****************************************************************************
  50.  * 
  51.  *  This program contains proprietary 
  52.  *  information of RealNetworks, Inc, and is licensed
  53.  *  subject to restrictions on use and distribution.
  54.  *
  55.  *  Platform-specific hardware acceleration (overlay)
  56.  *  implementation for Macintosh.
  57.  *
  58.  *  On the Macintosh, in order to access accelerated
  59.  *  video hardware, we must pretend we're an Image
  60.  *  Compression Manager codec. It's a pretty trivial
  61.  *  codec since all we need to do is advertise that
  62.  *  we output yuv data. Then we "register" ourself and
  63.  *  that automagically inserts us into the codec chain
  64.  *  and the OS will take our yuv "output" and blit it
  65.  *  however it thinks best. Which is to accelerated
  66.  *  hardware on both ATI and nVidia on OS 9, and ought
  67.  *  to work on OS X as well, although OS X's success
  68.  *  hasn't been verified as of this writing.
  69.  *
  70.  *  See the ElectricImageComponent sample code sample
  71.  *  at <http://developer.apple.com/samplecode/Sample_Code/
  72.  *  QuickTime/Importers_and_Exporters/ElectricImageComponent.htm>
  73.  *  for more information about how this fake codec was
  74.  *  constructed.
  75.  */
  76. #include "fauxcodec.h"
  77. #include "platform/mac/hx_moreprocesses.h"
  78. // xxxbobclark all these includes are simply to
  79. // call the static CMacSurface::CleanUpOverlay.
  80. #include "hxcom.h"
  81. #include "hxwintyp.h"
  82. #include "hxthread.h"
  83. #include "platform/mac/macsurf.h"
  84. // The high word is the codecInterfaceVersion
  85. #define kFauxCodecVersion (0x00020001)
  86. #define kFauxCodecVersionPPC (0x00020002) // PPC is +1
  87. // Data structures
  88. #pragma options align=mac68k
  89. typedef struct {
  90. ComponentInstance self;
  91. ComponentInstance delegateComponent;
  92. ComponentInstance target;
  93. ImageCodecMPDrawBandUPP drawBandUPP;
  94. } Codec_GlobalsRecord, *Codec_Globals;
  95. typedef struct {
  96. long width;
  97. long height;
  98. long depth;
  99. } FauxCodecDecompressRecord;
  100. typedef struct {
  101. UInt16 imageVersion; /* Image file version (5) */
  102. UInt32 imageFrames; /* Number of frames in the file (1..?) */
  103. } ImageHeader, *ImageHeaderPtr;
  104. typedef struct {
  105. QTFloatSingle frameTime; /* Time of frame (0.0) */
  106. Rect frameRect; /* Frame Rectangle */
  107. UInt8 frameBitDepth; /* Bits Per Pixel (not including alpha) */
  108. UInt8 frameType; /* Pixel Type (0=Direct; 1=Indexed) */
  109. Rect framePackRect; /* Packing rectangle */
  110. UInt8 framePacking; /* Packing Mode (0=Not Packed; 1=RL Encoding) */
  111. UInt8 frameAlpha; /* Alpha Bits per pixel */
  112. UInt32 frameSize; /* Size in bytes of the body of the image */
  113. UInt16 framePalettes; /* Number of entries in the color table (1..256) */
  114. UInt16 frameBackground; /* The index of the background color (0) */
  115. } ImageFrame, *ImageFramePtr;
  116. #pragma options align=reset
  117. Handle gWantedDestinationPixelTypes = nil;
  118. // Setup required for ComponentDispatchHelper.c
  119. #define IMAGECODEC_BASENAME()  FauxCodecImageCodec
  120. #define IMAGECODEC_GLOBALS()  Codec_Globals storage
  121. #define CALLCOMPONENT_BASENAME() IMAGECODEC_BASENAME()
  122. #define CALLCOMPONENT_GLOBALS() IMAGECODEC_GLOBALS()
  123. #define COMPONENT_UPP_PREFIX() uppImageCodec
  124. #define COMPONENT_DISPATCH_FILE "FauxCodecDispatch.h"
  125. #define COMPONENT_SELECT_PREFIX()   kImageCodec
  126. #define GET_DELEGATE_COMPONENT() (storage->delegateComponent)
  127. //#include "ImageCodec.k.h"
  128. // was in components.k.h
  129. #ifdef CALLCOMPONENT_BASENAME
  130. #ifndef CALLCOMPONENT_GLOBALS
  131. #define CALLCOMPONENT_GLOBALS() 
  132. #define ADD_CALLCOMPONENT_COMMA 
  133. #else
  134. #define ADD_CALLCOMPONENT_COMMA ,
  135. #endif
  136. #define CALLCOMPONENT_GLUE(a,b) a##b
  137. #define CALLCOMPONENT_STRCAT(a,b) CALLCOMPONENT_GLUE(a,b)
  138. #define ADD_CALLCOMPONENT_BASENAME(name) CALLCOMPONENT_STRCAT(CALLCOMPONENT_BASENAME(),name)
  139. EXTERN_API( ComponentResult  ) ADD_CALLCOMPONENT_BASENAME(Open) (CALLCOMPONENT_GLOBALS() ADD_CALLCOMPONENT_COMMA ComponentInstance  self);
  140. EXTERN_API( ComponentResult  ) ADD_CALLCOMPONENT_BASENAME(Close) (CALLCOMPONENT_GLOBALS() ADD_CALLCOMPONENT_COMMA ComponentInstance  self);
  141. EXTERN_API( ComponentResult  ) ADD_CALLCOMPONENT_BASENAME(CanDo) (CALLCOMPONENT_GLOBALS() ADD_CALLCOMPONENT_COMMA short  ftnNumber);
  142. EXTERN_API( ComponentResult  ) ADD_CALLCOMPONENT_BASENAME(Version) (CALLCOMPONENT_GLOBALS());
  143. EXTERN_API( ComponentResult  ) ADD_CALLCOMPONENT_BASENAME(Register) (CALLCOMPONENT_GLOBALS());
  144. EXTERN_API( ComponentResult  ) ADD_CALLCOMPONENT_BASENAME(Target) (CALLCOMPONENT_GLOBALS() ADD_CALLCOMPONENT_COMMA ComponentInstance  target);
  145. EXTERN_API( ComponentResult  ) ADD_CALLCOMPONENT_BASENAME(Unregister) (CALLCOMPONENT_GLOBALS());
  146. EXTERN_API( ComponentResult  ) ADD_CALLCOMPONENT_BASENAME(GetMPWorkFunction) (CALLCOMPONENT_GLOBALS() ADD_CALLCOMPONENT_COMMA ComponentMPWorkFunctionUPP * workFunction, void ** refCon);
  147. EXTERN_API( ComponentResult  ) ADD_CALLCOMPONENT_BASENAME(GetPublicResource) (CALLCOMPONENT_GLOBALS() ADD_CALLCOMPONENT_COMMA OSType  resourceType, short  resourceID, Handle * resource);
  148. #endif /* CALLCOMPONENT_BASENAME */
  149. // was in ImageCodec.k.h
  150. #ifdef IMAGECODEC_BASENAME
  151. #ifndef IMAGECODEC_GLOBALS
  152. #define IMAGECODEC_GLOBALS() 
  153. #define ADD_IMAGECODEC_COMMA 
  154. #else
  155. #define ADD_IMAGECODEC_COMMA ,
  156. #endif
  157. #define IMAGECODEC_GLUE(a,b) a##b
  158. #define IMAGECODEC_STRCAT(a,b) IMAGECODEC_GLUE(a,b)
  159. #define ADD_IMAGECODEC_BASENAME(name) IMAGECODEC_STRCAT(IMAGECODEC_BASENAME(),name)
  160. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(GetCodecInfo) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA CodecInfo * info);
  161. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(GetCompressionTime) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA PixMapHandle  src, const Rect * srcRect, short  depth, CodecQ * spatialQuality, CodecQ * temporalQuality, unsigned long * time);
  162. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(GetMaxCompressionSize) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA PixMapHandle  src, const Rect * srcRect, short  depth, CodecQ  quality, long * size);
  163. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(PreCompress) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA CodecCompressParams * params);
  164. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(BandCompress) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA CodecCompressParams * params);
  165. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(PreDecompress) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA CodecDecompressParams * params);
  166. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(BandDecompress) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA CodecDecompressParams * params);
  167. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(Busy) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA ImageSequence  seq);
  168. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(GetCompressedImageSize) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA ImageDescriptionHandle  desc, Ptr  data, long  bufferSize, ICMDataProcRecordPtr  dataProc, long * dataSize);
  169. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(GetSimilarity) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA PixMapHandle  src, const Rect * srcRect, ImageDescriptionHandle  desc, Ptr  data, Fixed * similarity);
  170. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(TrimImage) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA ImageDescriptionHandle  Desc, Ptr  inData, long  inBufferSize, ICMDataProcRecordPtr  dataProc, Ptr  outData, long  outBufferSize, ICMFlushProcRecordPtr  flushProc, Rect * trimRect, ICMProgressProcRecordPtr  progressProc);
  171. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(RequestSettings) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA Handle  settings, Rect * rp, ModalFilterUPP  filterProc);
  172. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(GetSettings) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA Handle  settings);
  173. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(SetSettings) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA Handle  settings);
  174. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(Flush) (IMAGECODEC_GLOBALS());
  175. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(SetTimeCode) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA void * timeCodeFormat, void * timeCodeTime);
  176. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(IsImageDescriptionEquivalent) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA ImageDescriptionHandle  newDesc, Boolean * equivalent);
  177. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(NewMemory) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA Ptr * data, Size  dataSize, long  dataUse, ICMMemoryDisposedUPP  memoryGoneProc, void * refCon);
  178. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(DisposeMemory) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA Ptr  data);
  179. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(HitTestData) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA ImageDescriptionHandle  desc, void * data, Size  dataSize, Point  where, Boolean * hit);
  180. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(NewImageBufferMemory) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA CodecDecompressParams * params, long  flags, ICMMemoryDisposedUPP  memoryGoneProc, void * refCon);
  181. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(ExtractAndCombineFields) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA long  fieldFlags, void * data1, long  dataSize1, ImageDescriptionHandle  desc1, void * data2, long  dataSize2, ImageDescriptionHandle  desc2, void * outputData, long * outDataSize, ImageDescriptionHandle  descOut);
  182. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(GetMaxCompressionSizeWithSources) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA PixMapHandle  src, const Rect * srcRect, short  depth, CodecQ  quality, CDSequenceDataSourcePtr  sourceData, long * size);
  183. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(SetTimeBase) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA void * base);
  184. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(SourceChanged) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA UInt32  majorSourceChangeSeed, UInt32  minorSourceChangeSeed, CDSequenceDataSourcePtr  sourceData, long * flagsOut);
  185. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(FlushFrame) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA UInt32  flags);
  186. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(GetSettingsAsText) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA Handle * text);
  187. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(GetParameterListHandle) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA Handle * parameterDescriptionHandle);
  188. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(GetParameterList) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA QTAtomContainer * parameterDescription);
  189. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(CreateStandardParameterDialog) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA QTAtomContainer  parameterDescription, QTAtomContainer  parameters, QTParameterDialogOptions  dialogOptions, DialogPtr  existingDialog, short  existingUserItem, QTParameterDialog * createdDialog);
  190. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(IsStandardParameterDialogEvent) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA EventRecord * pEvent, QTParameterDialog  createdDialog);
  191. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(DismissStandardParameterDialog) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA QTParameterDialog  createdDialog);
  192. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(StandardParameterDialogDoAction) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA QTParameterDialog  createdDialog, long  action, void * params);
  193. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(NewImageGWorld) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA CodecDecompressParams * params, GWorldPtr * newGW, long  flags);
  194. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(DisposeImageGWorld) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA GWorldPtr  theGW);
  195. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(HitTestDataWithFlags) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA ImageDescriptionHandle  desc, void * data, Size  dataSize, Point  where, long * hit, long  hitFlags);
  196. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(ValidateParameters) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA QTAtomContainer  parameters, QTParameterValidationOptions  validationFlags, StringPtr  errorString);
  197. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(GetBaseMPWorkFunction) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA ComponentMPWorkFunctionUPP * workFunction, void ** refCon, ImageCodecMPDrawBandUPP  drawProc, void * drawProcRefCon);
  198. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(RequestGammaLevel) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA Fixed  srcGammaLevel, Fixed  dstGammaLevel, long * codecCanMatch);
  199. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(GetSourceDataGammaLevel) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA Fixed * sourceDataGammaLevel);
  200. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(GetDecompressLatency) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA TimeRecord * latency);
  201. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(Preflight) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA CodecDecompressParams * params);
  202. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(Initialize) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA ImageSubCodecDecompressCapabilities * cap);
  203. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(BeginBand) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA CodecDecompressParams * params, ImageSubCodecDecompressRecord * drp, long  flags);
  204. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(DrawBand) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA ImageSubCodecDecompressRecord * drp);
  205. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(EndBand) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA ImageSubCodecDecompressRecord * drp, OSErr  result, long  flags);
  206. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(QueueStarting) (IMAGECODEC_GLOBALS());
  207. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(QueueStopping) (IMAGECODEC_GLOBALS());
  208. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(DroppingFrame) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA const ImageSubCodecDecompressRecord * drp);
  209. // EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(ScheduleFrame) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA const ImageSubCodecDecompressRecord * drp, ImageCodecTimeTriggerUPP  triggerProc, void * triggerProcRefCon);
  210. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(CancelTrigger) (IMAGECODEC_GLOBALS());
  211. /* MixedMode ProcInfo constants for component calls */
  212. enum {
  213. uppImageCodecGetCodecInfoProcInfo = 0x000003F0,
  214. uppImageCodecGetCompressionTimeProcInfo = 0x000FEFF0,
  215. uppImageCodecGetMaxCompressionSizeProcInfo = 0x0003EFF0,
  216. uppImageCodecPreCompressProcInfo = 0x000003F0,
  217. uppImageCodecBandCompressProcInfo = 0x000003F0,
  218. uppImageCodecPreDecompressProcInfo = 0x000003F0,
  219. uppImageCodecBandDecompressProcInfo = 0x000003F0,
  220. uppImageCodecBusyProcInfo = 0x000003F0,
  221. uppImageCodecGetCompressedImageSizeProcInfo = 0x0003FFF0,
  222. uppImageCodecGetSimilarityProcInfo = 0x0003FFF0,
  223. uppImageCodecTrimImageProcInfo = 0x03FFFFF0,
  224. uppImageCodecRequestSettingsProcInfo = 0x00003FF0,
  225. uppImageCodecGetSettingsProcInfo = 0x000003F0,
  226. uppImageCodecSetSettingsProcInfo = 0x000003F0,
  227. uppImageCodecFlushProcInfo = 0x000000F0,
  228. uppImageCodecSetTimeCodeProcInfo = 0x00000FF0,
  229. uppImageCodecIsImageDescriptionEquivalentProcInfo = 0x00000FF0,
  230. uppImageCodecNewMemoryProcInfo = 0x0003FFF0,
  231. uppImageCodecDisposeMemoryProcInfo = 0x000003F0,
  232. uppImageCodecHitTestDataProcInfo = 0x0003FFF0,
  233. uppImageCodecNewImageBufferMemoryProcInfo = 0x0000FFF0,
  234. uppImageCodecExtractAndCombineFieldsProcInfo = 0x0FFFFFF0,
  235. uppImageCodecGetMaxCompressionSizeWithSourcesProcInfo = 0x000FEFF0,
  236. uppImageCodecSetTimeBaseProcInfo = 0x000003F0,
  237. uppImageCodecSourceChangedProcInfo = 0x0000FFF0,
  238. uppImageCodecFlushFrameProcInfo = 0x000003F0,
  239. uppImageCodecGetSettingsAsTextProcInfo = 0x000003F0,
  240. uppImageCodecGetParameterListHandleProcInfo = 0x000003F0,
  241. uppImageCodecGetParameterListProcInfo = 0x000003F0,
  242. uppImageCodecCreateStandardParameterDialogProcInfo = 0x000EFFF0,
  243. uppImageCodecIsStandardParameterDialogEventProcInfo = 0x00000FF0,
  244. uppImageCodecDismissStandardParameterDialogProcInfo = 0x000003F0,
  245. uppImageCodecStandardParameterDialogDoActionProcInfo = 0x00003FF0,
  246. uppImageCodecNewImageGWorldProcInfo = 0x00003FF0,
  247. uppImageCodecDisposeImageGWorldProcInfo = 0x000003F0,
  248. uppImageCodecHitTestDataWithFlagsProcInfo = 0x000FFFF0,
  249. uppImageCodecValidateParametersProcInfo = 0x00003FF0,
  250. uppImageCodecGetBaseMPWorkFunctionProcInfo = 0x0000FFF0,
  251. uppImageCodecRequestGammaLevelProcInfo = 0x00003FF0,
  252. uppImageCodecGetSourceDataGammaLevelProcInfo = 0x000003F0,
  253. uppImageCodecGetDecompressLatencyProcInfo = 0x000003F0,
  254. uppImageCodecPreflightProcInfo = 0x000003F0,
  255. uppImageCodecInitializeProcInfo = 0x000003F0,
  256. uppImageCodecBeginBandProcInfo = 0x00003FF0,
  257. uppImageCodecDrawBandProcInfo = 0x000003F0,
  258. uppImageCodecEndBandProcInfo = 0x00003BF0,
  259. uppImageCodecQueueStartingProcInfo = 0x000000F0,
  260. uppImageCodecQueueStoppingProcInfo = 0x000000F0,
  261. uppImageCodecDroppingFrameProcInfo = 0x000003F0,
  262. uppImageCodecScheduleFrameProcInfo = 0x00003FF0,
  263. uppImageCodecCancelTriggerProcInfo = 0x000000F0
  264. };
  265. #endif /* IMAGECODEC_BASENAME */
  266. /*
  267. Example usage:
  268. #define QTPHOTO_BASENAME() Fred
  269. #define QTPHOTO_GLOBALS() FredGlobalsHandle
  270. #include <ImageCodec.k.h>
  271. To specify that your component implementation does not use globals, do not #define QTPHOTO_GLOBALS
  272. */
  273. #ifdef QTPHOTO_BASENAME
  274. #ifndef QTPHOTO_GLOBALS
  275. #define QTPHOTO_GLOBALS() 
  276. #define ADD_QTPHOTO_COMMA 
  277. #else
  278. #define ADD_QTPHOTO_COMMA ,
  279. #endif
  280. #define QTPHOTO_GLUE(a,b) a##b
  281. #define QTPHOTO_STRCAT(a,b) QTPHOTO_GLUE(a,b)
  282. #define ADD_QTPHOTO_BASENAME(name) QTPHOTO_STRCAT(QTPHOTO_BASENAME(),name)
  283. EXTERN_API( ComponentResult  ) ADD_QTPHOTO_BASENAME(SetSampling) (QTPHOTO_GLOBALS() ADD_QTPHOTO_COMMA short  yH, short  yV, short  cbH, short  cbV, short  crH, short  crV);
  284. EXTERN_API( ComponentResult  ) ADD_QTPHOTO_BASENAME(SetRestartInterval) (QTPHOTO_GLOBALS() ADD_QTPHOTO_COMMA unsigned short  restartInterval);
  285. EXTERN_API( ComponentResult  ) ADD_QTPHOTO_BASENAME(DefineHuffmanTable) (QTPHOTO_GLOBALS() ADD_QTPHOTO_COMMA short  componentNumber, Boolean  isDC, unsigned char * lengthCounts, unsigned char * values);
  286. EXTERN_API( ComponentResult  ) ADD_QTPHOTO_BASENAME(DefineQuantizationTable) (QTPHOTO_GLOBALS() ADD_QTPHOTO_COMMA short  componentNumber, unsigned char * table);
  287. /* MixedMode ProcInfo constants for component calls */
  288. enum {
  289. uppQTPhotoSetSamplingProcInfo = 0x000AAAF0,
  290. uppQTPhotoSetRestartIntervalProcInfo = 0x000002F0,
  291. uppQTPhotoDefineHuffmanTableProcInfo = 0x0000F6F0,
  292. uppQTPhotoDefineQuantizationTableProcInfo = 0x00000EF0
  293. };
  294. #endif /* QTPHOTO_BASENAME */
  295. /*
  296. Example usage:
  297. #define IMAGECODEC_BASENAME() Fred
  298. #define IMAGECODEC_GLOBALS() FredGlobalsHandle
  299. #include <ImageCodec.k.h>
  300. To specify that your component implementation does not use globals, do not #define IMAGECODEC_GLOBALS
  301. */
  302. #ifdef IMAGECODEC_BASENAME
  303. #ifndef IMAGECODEC_GLOBALS
  304. #define IMAGECODEC_GLOBALS() 
  305. #define ADD_IMAGECODEC_COMMA 
  306. #else
  307. #define ADD_IMAGECODEC_COMMA ,
  308. #endif
  309. #define IMAGECODEC_GLUE(a,b) a##b
  310. #define IMAGECODEC_STRCAT(a,b) IMAGECODEC_GLUE(a,b)
  311. #define ADD_IMAGECODEC_BASENAME(name) IMAGECODEC_STRCAT(IMAGECODEC_BASENAME(),name)
  312. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(EffectSetup) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA CodecDecompressParams * p);
  313. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(EffectBegin) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA CodecDecompressParams * p, EffectsFrameParamsPtr  ePtr);
  314. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(EffectRenderFrame) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA EffectsFrameParamsPtr  p);
  315. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(EffectConvertEffectSourceToFormat) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA EffectSourcePtr  sourceToConvert, ImageDescriptionHandle  requestedDesc);
  316. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(EffectCancel) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA EffectsFrameParamsPtr  p);
  317. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(EffectGetSpeed) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA QTAtomContainer  parameters, Fixed * pFPS);
  318. #if defined(_CARBON) || defined(_MAC_UNIX)
  319. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(EffectPrepareSMPTEFrame) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA PixMapPtr  destPixMap, SMPTEFrameReference * returnValue);
  320. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(EffectDisposeSMPTEFrame) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA SMPTEFrameReference  frameRef);
  321. EXTERN_API( ComponentResult  ) ADD_IMAGECODEC_BASENAME(EffectRenderSMPTEFrame) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA PixMapPtr  destPixMap, SMPTEFrameReference  frameRef, Fixed  effectPercentageEven, Fixed  effectPercentageOdd, Rect * pSourceRect, MatrixRecord * pMatrix, SMPTEWipeType  effectNumber, long  xRepeat, long  yRepeat, SMPTEFlags  flags, Fixed  penWidth, long  strokeValue);
  322. #endif
  323. /* MixedMode ProcInfo constants for component calls */
  324. enum {
  325. uppImageCodecEffectSetupProcInfo = 0x000003F0,
  326. uppImageCodecEffectBeginProcInfo = 0x00000FF0,
  327. uppImageCodecEffectRenderFrameProcInfo = 0x000003F0,
  328. uppImageCodecEffectConvertEffectSourceToFormatProcInfo = 0x00000FF0,
  329. uppImageCodecEffectCancelProcInfo = 0x000003F0,
  330. uppImageCodecEffectGetSpeedProcInfo = 0x00000FF0,
  331. uppImageCodecEffectPrepareSMPTEFrameProcInfo = 0x00000FF0,
  332. uppImageCodecEffectDisposeSMPTEFrameProcInfo = 0x000003F0,
  333. uppImageCodecEffectRenderSMPTEFrameProcInfo = 0xFFFFFFF0
  334. };
  335. #endif /* IMAGECODEC_BASENAME */
  336. // here's the contents of ComponentDispatchHelper.c
  337. // **** BEGIN: Error Checking the Required Macros
  338. // Make sure BASENAME is defined
  339. #ifndef COMPONENT_BASENAME
  340. #ifdef CALLCOMPONENT_BASENAME
  341. #define COMPONENT_BASENAME()  CALLCOMPONENT_BASENAME()
  342. #else
  343. #error "COMPONENT_BASENAME or CALLCOMPONENT_BASENAME must be defined for ComponentDispatchHelper.c"
  344. #endif
  345. #endif
  346. // Make sure GLOBALS is defined
  347. #ifndef COMPONENT_GLOBALS
  348. #ifdef CALLCOMPONENT_GLOBALS
  349. #define COMPONENT_GLOBALS()  CALLCOMPONENT_GLOBALS()
  350. #else
  351. #error "COMPONENT_GLOBALS or CALLCOMPONENT_GLOBALS must be defined for ComponentDispatchHelper.c"
  352. #endif
  353. #endif
  354. // Make sure DISPATCH_FILE is defined
  355. #ifndef COMPONENT_DISPATCH_FILE
  356. #error "COMPONENT_DISPATCH_FILE must be defined for ComponentDispatchHelper.c"
  357. #endif
  358. // Make sure UPP_PREFIX and SELECT_PREFIX are defined
  359. #if !defined(COMPONENT_UPP_SELECT_ROOT)  && !defined(COMPONENT_UPP_PREFIX) && !defined(COMPONENT_SELECT_PREFIX)
  360. #error "COMPONENT_UPP_SELECT_ROOT or (COMPONENT_UPP_PREFIX and COMPONENT_SELECT_PREFIX) must be defined for ComponentDispatchHelper.c"
  361. #endif
  362. #ifdef COMPONENT_UPP_SELECT_ROOT
  363. #if defined(COMPONENT_UPP_PREFIX) || defined(COMPONENT_SELECT_PREFIX)
  364. #error "use only COMPONENT_UPP_SELECT_ROOT or (COMPONENT_UPP_PREFIX and COMPONENT_SELECT_PREFIX) for ComponentDispatchHelper.c"
  365. #endif
  366. #else
  367. #if !defined(COMPONENT_UPP_PREFIX) || !defined(COMPONENT_SELECT_PREFIX)
  368. #error "COMPONENT_UPP_SELECT_ROOT or (COMPONENT_UPP_PREFIX and COMPONENT_SELECT_PREFIX) must be defined for ComponentDispatchHelper.c"
  369. #endif
  370. #endif
  371. #ifndef COMPONENT_UPP_PREFIX
  372. #ifndef COMPONENT_UPP_SELECT_ROOT
  373. #error "COMPONENT_UPP_SELECT_ROOT or (COMPONENT_UPP_PREFIX and COMPONENT_SELECT_PREFIX) must be defined for ComponentDispatchHelper.c"
  374. #else 
  375. #define COMPONENT_UPP_PREFIX() cdh_GLUE2(upp,COMPONENT_UPP_SELECT_ROOT())
  376. #endif
  377. #endif
  378. #ifndef COMPONENT_SELECT_PREFIX
  379. #ifndef COMPONENT_UPP_SELECT_ROOT
  380. #error "COMPONENT_UPP_SELECT_ROOT or (COMPONENT_UPP_PREFIX and COMPONENT_SELECT_PREFIX) must be defined for ComponentDispatchHelper.c"
  381. #else 
  382. #define COMPONENT_SELECT_PREFIX() cdh_GLUE2(k,COMPONENT_UPP_SELECT_ROOT())
  383. #endif
  384. #endif
  385. // Make sure SUBTYPE UPP_PREFIX and SELECT_PREFIX are defined correctly if they are used at all
  386. #if defined(COMPONENT_SUBTYPE_UPP_SELECT_ROOT) || defined(COMPONENT_SUBTYPE_UPP_PREFIX) || defined(COMPONENT_SUBTYPE_SELECT_PREFIX)
  387. #ifdef COMPONENT_SUBTYPE_UPP_SELECT_ROOT
  388. #if defined(COMPONENT_SUBTYPE_UPP_PREFIX) || defined(COMPONENT_SUBTYPE_SELECT_PREFIX)
  389. #error "use only COMPONENT_SUBTYPE_UPP_PREFIX and COMPONENT_SUBTYPE_SELECT_PREFIX OR COMPONENT_SUBTYPE_UPP_SELECT_ROOT for ComponentDispatchHelper.c"
  390. #endif
  391. #else
  392. #if !defined(COMPONENT_SUBTYPE_UPP_PREFIX) || !defined(COMPONENT_SUBTYPE_SELECT_PREFIX)
  393. #error "COMPONENT_SUBTYPE_UPP_PREFIX and COMPONENT_SUBTYPE_SELECT_PREFIX OR COMPONENT_SUBTYPE_UPP_SELECT_ROOT must be defined for ComponentDispatchHelper.c"
  394. #endif
  395. #endif
  396. #ifndef COMPONENT_SUBTYPE_UPP_PREFIX
  397. #ifndef COMPONENT_SUBTYPE_UPP_SELECT_ROOT
  398. #error "COMPONENT_SUBTYPE_UPP_PREFIX or COMPONENT_SUBTYPE_UPP_SELECT_ROOT must be defined for ComponentDispatchHelper.c"
  399. #else 
  400. #define COMPONENT_SUBTYPE_UPP_PREFIX() cdh_GLUE2(upp,COMPONENT_SUBTYPE_UPP_SELECT_ROOT())
  401. #endif
  402. #endif
  403. #ifndef COMPONENT_SUBTYPE_SELECT_PREFIX
  404. #ifndef COMPONENT_SUBTYPE_UPP_SELECT_ROOT
  405. #error "COMPONENT_SUBTYPE_SELECT_PREFIX or COMPONENT_SUBTYPE_UPP_SELECT_ROOT must be defined for ComponentDispatchHelper.c"
  406. #else 
  407. #define COMPONENT_SUBTYPE_SELECT_PREFIX() cdh_GLUE2(k,COMPONENT_SUBTYPE_UPP_SELECT_ROOT())
  408. #endif
  409. #endif
  410. #endif
  411. // **** END: Error Checking the Required Macros
  412. #if TARGET_API_MAC_OSX
  413. #define CDHCONST const
  414. #else
  415. #define CDHCONST
  416. #endif
  417. #if TARGET_OS_MAC
  418. #define PASCAL_RTN pascal
  419. #else
  420. #define PASCAL_RTN
  421. #endif
  422. #if !TARGET_OS_MAC || TARGET_CPU_PPC
  423. #define C_DISPATCH_WITH_GLOBALS 1
  424. #define C_DISPATCH_WITH_SWITCH 0
  425. #elif TARGET_CPU_68K
  426. #ifdef COMPONENT_C_DISPATCHER
  427. #define C_DISPATCH_WITH_GLOBALS 0
  428. #define C_DISPATCH_WITH_SWITCH 1
  429. #else
  430. #define C_DISPATCH_WITH_GLOBALS 0
  431. #define C_DISPATCH_WITH_SWITCH 0
  432. #endif
  433. #else
  434. #error "I have no idea what kind of machine you are using"
  435. #endif
  436. /*
  437. C_DISPATCH_WITH_GLOBALS implies global storage for dispatch information 
  438. and procinfos returned by COMPONENTSELECTORLOOKUP
  439. C_DISPATCH_WITH_SWITCH  implies no global storage, dispatch by switch
  440. and no procinfos returned by COMPONENTSELECTORLOOKUP
  441. */
  442. #define COMPONENTSELECTORLOOKUP ADD_BASENAME(FindRoutineUPP)
  443. #ifdef COMPONENT_DISPATCH_MAIN
  444. #define COMPONENT_DISPATCH_ENTRY main
  445. #else
  446. #define COMPONENT_DISPATCH_ENTRY ADD_BASENAME(ComponentDispatch)
  447. #endif
  448. #ifndef __COMPONENTS_K__
  449. // #include "Components.k.h"
  450. #endif
  451. #define kCOMPONENT_NOERROR ((ComponentFunctionUPP)-2)
  452. #define kCOMPONENT_ERROR ((ComponentFunctionUPP)-1)
  453. #define kCOMPONENT_DELEGATE ((ComponentFunctionUPP)0)
  454. #ifndef cdh_GLUE
  455. #define cdh_GLUE(a,b) a##b
  456. #endif
  457. #ifndef cdh_GLUE2
  458. #define cdh_GLUE2(a,b) cdh_GLUE(a,b)
  459. #endif
  460. #ifndef cdh_GLUE3
  461. #define cdh_GLUE3(a,b,c) cdh_GLUE2(cdh_GLUE2(a,b),c)
  462. #endif
  463. #if TARGET_RT_LITTLE_ENDIAN
  464. #define ComponentCallLittleEndian  ComponentCall
  465. #else
  466. #define ComponentCallLittleEndian  ComponentDelegate
  467. #endif
  468. #ifdef forPublicQTiRelease
  469. #define ComponentQTiCall(procName) ComponentCall(procName)
  470. #define QTIComponentCall(procName) ComponentCall(procName)
  471. #endif
  472. #define ADD_BASENAME(name) cdh_GLUE2(COMPONENT_BASENAME(),name)
  473. #if C_DISPATCH_WITH_GLOBALS
  474. PASCAL_RTN ComponentResult COMPONENT_DISPATCH_ENTRY(ComponentParameters *params, COMPONENT_GLOBALS());
  475. static ComponentFunctionUPP COMPONENTSELECTORLOOKUP(short selector_num, ProcInfoType *procInfo);
  476. #if TARGET_OS_MAC && TARGET_CPU_PPC && !TARGET_API_MAC_CARBON
  477. // entry point for PowerPC native components
  478. struct RoutineDescriptor ADD_BASENAME(ComponentDispatchRD) =
  479.   BUILD_ROUTINE_DESCRIPTOR((kPascalStackBased | RESULT_SIZE (kFourByteCode) |
  480. STACK_ROUTINE_PARAMETER (1, kFourByteCode) |
  481. STACK_ROUTINE_PARAMETER (2, kFourByteCode)),COMPONENT_DISPATCH_ENTRY);
  482. #endif
  483. PASCAL_RTN ComponentResult COMPONENT_DISPATCH_ENTRY(ComponentParameters *params,COMPONENT_GLOBALS())
  484. {
  485. ComponentFunctionUPP theProc;
  486. ComponentResult result = badComponentSelector;
  487. ProcInfoType theProcInfo;
  488. theProc = COMPONENTSELECTORLOOKUP(params->what, &theProcInfo);
  489. if (theProc) {
  490. if ( (theProc != kCOMPONENT_ERROR) && (theProc != kCOMPONENT_NOERROR) ) {
  491. if (theProcInfo != 0) {
  492. result = CallComponentFunctionWithStorageProcInfo((Handle) storage, params, (ProcPtr)theProc, theProcInfo);
  493. }
  494. }
  495. else if ( theProc == kCOMPONENT_NOERROR ) {
  496. result = noErr;
  497. }
  498. }
  499. #ifdef GET_DELEGATE_COMPONENT
  500. else
  501. return DelegateComponentCall(params, GET_DELEGATE_COMPONENT());
  502. #endif
  503. return result;
  504. }
  505. #elif C_DISPATCH_WITH_SWITCH
  506. PASCAL_RTN ComponentResult COMPONENT_DISPATCH_ENTRY(ComponentParameters *params, COMPONENT_GLOBALS());
  507. static ComponentFunctionUPP COMPONENTSELECTORLOOKUP(short selector_num);
  508. PASCAL_RTN ComponentResult COMPONENT_DISPATCH_ENTRY( ComponentParameters *params, COMPONENT_GLOBALS() )
  509. {
  510. ComponentFunctionUPP theProc;
  511. ComponentResult result = badComponentSelector;
  512. theProc = COMPONENTSELECTORLOOKUP(params->what);
  513. if (theProc) {
  514. if ( (theProc != kCOMPONENT_ERROR) && (theProc != kCOMPONENT_NOERROR) ) {
  515. result = CallComponentFunctionWithStorage((Handle) storage, params, theProc);
  516. }
  517. else if ( theProc == kCOMPONENT_NOERROR ) {
  518. result = noErr;
  519. }
  520. }
  521. #ifdef GET_DELEGATE_COMPONENT
  522. else
  523. result = DelegateComponentCall(params, GET_DELEGATE_COMPONENT());
  524. #endif
  525. return result;
  526. }
  527. #endif
  528. #if C_DISPATCH_WITH_GLOBALS
  529. typedef struct {
  530. ComponentFunctionUPP theProc;
  531. ProcInfoType theProcInfo;
  532. } cdhDispatchInfoRecord;
  533. typedef struct {
  534. short rangeMax;
  535. CDHCONST cdhDispatchInfoRecord *cdhDispatchInfoP;
  536. } cdhRangeDispatchInfoRecord;
  537. #define ComponentSelectorOffset(theOffset) enum {SelOffset = theOffset};
  538. #define ComponentRangeCount(theCount) enum {RangeCount = theCount};
  539. #define ComponentRangeShift(theShift) enum {RangeShift = theShift};
  540. #define ComponentRangeMask(theMask) enum {RangeMask = cdh_GLUE2(0x,theMask)};
  541. #define ComponentStorageType(theType)
  542. #define ComponentDelegateByteOffset(theOffset)
  543. #define StdComponentCall(procName)
  544. (ComponentFunctionUPP)ADD_BASENAME(procName), cdh_GLUE3(uppCallComponent,procName,ProcInfo),
  545. #define ComponentCall(procName)
  546. (ComponentFunctionUPP)ADD_BASENAME(procName), cdh_GLUE3(COMPONENT_UPP_PREFIX(),procName,ProcInfo),
  547. #define ComponentSubTypeCall(procName)
  548. (ComponentFunctionUPP)ADD_BASENAME(procName), cdh_GLUE3(COMPONENT_SUBTYPE_UPP_PREFIX(),procName,ProcInfo),
  549. #define ComponentError(procName) kCOMPONENT_ERROR, 0,
  550. #define StdComponentNoError(procName)  kCOMPONENT_NOERROR, 0,
  551. #define ComponentNoError(procName) kCOMPONENT_NOERROR, 0,
  552. #define ComponentSubTypeNoError(procName)  kCOMPONENT_NOERROR, 0,
  553. #define ComponentDelegate(procName) kCOMPONENT_DELEGATE, 0,
  554. #define ComponentRangeUnused(rangeNum) 
  555. static CDHCONST cdhDispatchInfoRecord cdh_GLUE2(cdhDispatchInfo,rangeNum)[1] = { 0 };
  556. enum {cdh_GLUE2(cdhDispatchMax,rangeNum) = 0};
  557. #define ComponentRangeBegin(rangeNum)
  558. static CDHCONST cdhDispatchInfoRecord cdh_GLUE2(cdhDispatchInfo,rangeNum)[] = {
  559. #define ComponentRangeEnd(rangeNum)
  560. };
  561. enum {cdh_GLUE2(cdhDispatchMax,rangeNum) = sizeof(cdh_GLUE2(cdhDispatchInfo,rangeNum)) / sizeof(cdhDispatchInfoRecord)};
  562. #define ComponentComment(theComment)
  563. // define the static dispatch tables
  564. #include COMPONENT_DISPATCH_FILE
  565. #undef ComponentSelectorOffset
  566. #undef ComponentRangeCount
  567. #undef ComponentRangeShift
  568. #undef ComponentRangeMask
  569. #undef StdComponentCall
  570. #undef ComponentCall
  571. #undef ComponentSubTypeCall
  572. #undef ComponentError
  573. #undef StdComponentNoError
  574. #undef ComponentNoError
  575. #undef ComponentSubTypeNoError
  576. #undef ComponentDelegate
  577. #undef ComponentRangeUnused
  578. #undef ComponentRangeBegin
  579. #undef ComponentRangeEnd
  580. #define ComponentSelectorOffset(theOffset)
  581. #define ComponentRangeCount(theCount)
  582. #define ComponentRangeShift(theShift)
  583. #define ComponentRangeMask(theMask)
  584. #define StdComponentCall(procName)
  585. #define ComponentCall(procName)
  586. #define ComponentSubTypeCall(procName)
  587. #define ComponentError(procName)
  588. #define StdComponentNoError(procName)
  589. #define ComponentNoError(procName)
  590. #define ComponentSubTypeNoError(procName)
  591. #define ComponentDelegate(procName)
  592. #define ComponentRangeUnused(rangeNum) 
  593. { 0, nil },
  594. #define ComponentRangeBegin(rangeNum)
  595. { cdh_GLUE2(cdhDispatchMax,rangeNum), cdh_GLUE2(cdhDispatchInfo,rangeNum) },
  596. #define ComponentRangeEnd(rangeNum)
  597. // define the static range tables (max per range and point to dispatch tables)
  598. static CDHCONST cdhRangeDispatchInfoRecord cdhRangeDispatch[RangeCount+1] = {
  599. #include COMPONENT_DISPATCH_FILE
  600. };
  601. ComponentFunctionUPP COMPONENTSELECTORLOOKUP(short selector_num, ProcInfoType *procInfo)
  602. {
  603. ProcInfoType pinfo = 0;
  604. ComponentFunctionUPP result = kCOMPONENT_DELEGATE;
  605. CDHCONST cdhDispatchInfoRecord *infoP = nil;
  606. short theRange;
  607. theRange = selector_num >> RangeShift;
  608. if (theRange < 0) {
  609. selector_num += SelOffset;
  610. if (selector_num >= 0) {
  611. infoP = &(cdhRangeDispatch[0].cdhDispatchInfoP)[selector_num];
  612. }
  613. } else {
  614. if (theRange < RangeCount) {
  615. selector_num &= RangeMask;
  616. if (selector_num < cdhRangeDispatch[theRange+1].rangeMax)
  617. infoP = &(cdhRangeDispatch[theRange+1].cdhDispatchInfoP)[selector_num];
  618. }
  619. }
  620. if (infoP) {
  621. *procInfo = infoP->theProcInfo;
  622. result = infoP->theProc;
  623. return result;
  624. }
  625. #elif C_DISPATCH_WITH_SWITCH
  626. ComponentFunctionUPP COMPONENTSELECTORLOOKUP( short selector_num )
  627. {
  628. ComponentFunctionUPP aProc = (ComponentFunctionUPP) kCOMPONENT_DELEGATE;
  629. #define ComponentSelectorOffset(theOffset)
  630. #define case_ComponentCall(kPrefix,procName) case cdh_GLUE3(kPrefix,procName,Select): aProc = (ComponentFunctionUPP)ADD_BASENAME(procName); break;
  631. #define StdComponentCall(procName) case_ComponentCall(kComponent,procName)
  632. #define ComponentCall(procName) case_ComponentCall(COMPONENT_SELECT_PREFIX(),procName)
  633. #define ComponentSubTypeCall(procName) case_ComponentCall(COMPONENT_SUBTYPE_SELECT_PREFIX(),procName)
  634. #define case_ComponentNoError(kPrefix,procName) case cdh_GLUE3(kPrefix,procName,Select): aProc = (ComponentFunctionUPP)kCOMPONENT_NOERROR; break;
  635. #define StdComponentNoError(procName) case_ComponentNoError(kComponent,procName)
  636. #define ComponentNoError(procName) case_ComponentNoError(COMPONENT_SELECT_PREFIX(),procName)
  637. #define ComponentSubTypeNoError(procName) case_ComponentNoError(COMPONENT_SUBTYPE_SELECT_PREFIX(),procName)
  638. #define ComponentError(procName) //ComponentError for C_DISPATCH_WITH_SWITCH uses default case (delegate if we can)
  639. #define ComponentDelegate(procName) //The default case for C_DISPATCH_WITH_SWITCH is to delegate if we can, error if we can't
  640. #define ComponentRangeCount(theCount)
  641. #define ComponentRangeShift(theShift)
  642. #define ComponentRangeMask(theMask)
  643. #define ComponentRangeBegin(rangeNum)
  644. #define ComponentRangeEnd(rangeNum)
  645. #define ComponentRangeUnused(rangeNum)
  646. #define ComponentStorageType(theType)
  647. #define ComponentDelegateByteOffset(theOffset)
  648. #define ComponentComment(theComment)
  649. switch (selector_num) {
  650. #include COMPONENT_DISPATCH_FILE
  651. }
  652. return aProc;
  653. }
  654. #endif
  655. #ifdef OVERRIDE_CANDO
  656. ComponentResult OVERRIDE_CANDO( COMPONENT_GLOBALS(), short ftnNumber, ComponentResult result);
  657. #endif
  658. #ifndef TOUCH_UNUSED_ARG
  659. // a macro to avoid "unused variable" warnings
  660. #define TOUCH_UNUSED_ARG(arg) ((void)arg)
  661. #endif
  662. PASCAL_RTN ComponentResult ADD_BASENAME(CanDo)( COMPONENT_GLOBALS(), short ftnNumber );
  663. PASCAL_RTN ComponentResult ADD_BASENAME(CanDo)( COMPONENT_GLOBALS(), short ftnNumber )
  664. {
  665. ComponentResult result;
  666. #if C_DISPATCH_WITH_GLOBALS
  667. ProcInfoType ignore;
  668. result = (ComponentResult) COMPONENTSELECTORLOOKUP(ftnNumber, &ignore);
  669. #else
  670. result = (ComponentResult) COMPONENTSELECTORLOOKUP(ftnNumber);
  671. #endif
  672. /* check for a ComponentError */
  673. if ( result == (ComponentResult) kCOMPONENT_ERROR )
  674. result = false;
  675. else if ( result == (ComponentResult) kCOMPONENT_DELEGATE )
  676. result = false;
  677. else
  678. result = true;
  679. #ifdef GET_DELEGATE_COMPONENT
  680. /* if we're delegated, then keep looking */
  681. if (!result)
  682. {
  683. if (GET_DELEGATE_COMPONENT())
  684. result = CallComponentCanDo( GET_DELEGATE_COMPONENT(), ftnNumber );
  685. }
  686. #endif
  687. #ifdef OVERRIDE_CANDO
  688. result = OVERRIDE_CANDO( storage, ftnNumber, result);
  689. #else
  690. TOUCH_UNUSED_ARG(storage);
  691. #endif
  692. return result;
  693. }
  694. /* -- This Image Decompressor User the Base Image Decompressor Component --
  695. The base image decompressor is an Apple-supplied component
  696. that makes it easier for developers to create new decompressors.
  697. The base image decompressor does most of the housekeeping and
  698. interface functions required for a QuickTime decompressor component,
  699. including scheduling for asynchronous decompression.
  700. */
  701. // Component Open Request - Required
  702. pascal ComponentResult FauxCodecImageCodecOpen(Codec_Globals glob, ComponentInstance self)
  703. {
  704. ComponentResult err;
  705. // Allocate memory for our globals, set them up and inform the component manager that we've done so
  706. glob = (Codec_Globals)NewPtrClear(sizeof(Codec_GlobalsRecord));
  707. err = MemError();
  708. if (err) goto bail;
  709. SetComponentInstanceStorage(self, (Handle)glob);
  710. glob->self = self;
  711. glob->target = self;
  712. glob->drawBandUPP = NULL;
  713. // Open and target an instance of the base decompressor as we delegate
  714. // most of our calls to the base decompressor instance
  715. err = OpenADefaultComponent(decompressorComponentType, kBaseCodecType, &glob->delegateComponent);
  716. if (err) goto bail;
  717. ComponentSetTarget(glob->delegateComponent, self);
  718. bail:
  719. return err;
  720. }
  721. // Component Close Request - Required
  722. pascal ComponentResult FauxCodecImageCodecClose(Codec_Globals glob, ComponentInstance self)
  723. {
  724. // Make sure to close the base component and dealocate our storage
  725. if (glob) {
  726. if (glob->delegateComponent) {
  727. CloseComponent(glob->delegateComponent);
  728. }
  729. if (glob->drawBandUPP) {
  730. #if defined(_CARBON) || defined(_MAC_UNIX)
  731. DisposeImageCodecMPDrawBandUPP(glob->drawBandUPP);
  732. #else
  733. DisposeRoutineDescriptor(glob->drawBandUPP);
  734. #endif
  735. }
  736. DisposePtr((Ptr)glob);
  737. }
  738. return noErr;
  739. }
  740. // Component Version Request - Required
  741. pascal ComponentResult FauxCodecImageCodecVersion(Codec_Globals glob)
  742. {
  743. #pragma unused(glob)
  744. #if TARGET_CPU_68K || TARGET_OS_WIN32
  745. return kFauxCodecVersion;
  746. #else
  747. return kFauxCodecVersionPPC;
  748. #endif
  749. }
  750. // Component Target Request
  751. //  Allows another component to "target" you i.e., you call another component whenever
  752. // you would call yourself (as a result of your component being used by another component)
  753. pascal ComponentResult FauxCodecImageCodecTarget(Codec_Globals glob, ComponentInstance target)
  754. {
  755. glob->target = target;
  756. return noErr;
  757. }
  758. // Component GetMPWorkFunction Request
  759. // Allows your image decompressor component to perform asynchronous decompression
  760. // in a single MP task by taking advantage of the Base Decompressor. If you implement
  761. // this selector, your DrawBand function must be MP-safe. MP safety means not
  762. // calling routines that may move or purge memory and not calling any routines which
  763. // might cause 68K code to be executed. Ideally, your DrawBand function should not make
  764. // any API calls whatsoever. Obviously don't implement this if you're building a 68k component.
  765. #if !TARGET_CPU_68K
  766. pascal ComponentResult FauxCodecImageCodecGetMPWorkFunction(Codec_Globals glob, ComponentMPWorkFunctionUPP *workFunction, void **refCon)
  767. {
  768. if (NULL == glob->drawBandUPP)
  769. #if !TARGET_API_MAC_CARBON
  770. glob->drawBandUPP = NewImageCodecMPDrawBandProc(FauxCodecImageCodecDrawBand);
  771. #else
  772. glob->drawBandUPP = NewImageCodecMPDrawBandUPP((ImageCodecMPDrawBandProcPtr)FauxCodecImageCodecDrawBand);
  773. #endif
  774. return ImageCodecGetBaseMPWorkFunction(glob->delegateComponent, workFunction, refCon, glob->drawBandUPP, glob);
  775. }
  776. #endif // !TARGET_CPU_68K
  777. #pragma mark-
  778. // ImageCodecInitialize
  779. // The first function call that your image decompressor component receives from the base image
  780. // decompressor is always a call to ImageCodecInitialize . In response to this call, your image decompressor
  781. // component returns an ImageSubCodecDecompressCapabilities structure that specifies its capabilities.
  782. pascal ComponentResult FauxCodecImageCodecInitialize(Codec_Globals glob, ImageSubCodecDecompressCapabilities *cap)
  783. {
  784. #pragma unused(glob)
  785. // Secifies the size of the ImageSubCodecDecompressRecord structure
  786. // and say we can support asyncronous decompression
  787. // With the help of the base image decompressor, any image decompressor
  788. // that uses only interrupt-safe calls for decompression operations can
  789. // support asynchronous decompression.
  790. cap->decompressRecordSize = sizeof(FauxCodecDecompressRecord);
  791. cap->canAsync = true;
  792. return noErr;
  793. }
  794. long gCodecFrameWidth = 0;
  795. long gCodecFrameHeight = 0;
  796. // ImageCodecPreflight
  797. //  The base image decompressor gets additional information about the capabilities of your image
  798. // decompressor component by calling ImageCodecPreflight. The base image decompressor uses this
  799. // information when responding to a call to the ImageCodecPredecompress function,
  800. // which the ICM makes before decompressing an image. You are required only to provide values for
  801. // the wantedDestinationPixelSize and wantedDestinationPixelTypes fields and can also modify other
  802. // fields if necessary.
  803. pascal ComponentResult FauxCodecImageCodecPreflight(Codec_Globals glob, CodecDecompressParams *p)
  804. {
  805. #pragma unused(glob)
  806.     CodecCapabilities *capabilities = p->capabilities;
  807.     if (!p->wantedDestinationPixelTypes)
  808.     {
  809. if (!IsMacInCooperativeThread())
  810. {
  811.     p->wantedDestinationPixelTypes = (unsigned long**)gWantedDestinationPixelTypes;
  812. }
  813. else
  814. {
  815.     p->wantedDestinationPixelTypes = (unsigned long**)NewHandle(8);
  816.     (*p->wantedDestinationPixelTypes)[0] = 'yuvs';
  817.     (*p->wantedDestinationPixelTypes)[1] = 0;
  818. }
  819.     }
  820.     capabilities->bandMin = (**p->imageDescription).height;
  821.     capabilities->bandInc = capabilities->bandMin;
  822.     // Specify the number of pixels the image must be extended in width and height if
  823.     // the component cannot accommodate the image at its given width and height
  824.     capabilities->extendWidth = 0;
  825.     capabilities->extendHeight = 0;
  826.     // xxxbobclark VERY IMPORTANT! This MUST be zero. Otherwise it will try
  827.     // to hook itself in to an RGB codec chain. Only if this is zero will
  828.     // it successfully hook itself in to a YUV codec chain.
  829.     capabilities->wantedPixelSize = 0;
  830.     return noErr;
  831. }
  832. // ImageCodecBeginBand
  833. //  The ImageCodecBeginBand function allows your image decompressor component to save information about
  834. // a band before decompressing it. This function is never called at interrupt time. The base image decompressor
  835. // preserves any changes your component makes to any of the fields in the ImageSubCodecDecompressRecord
  836. // or CodecDecompressParams structures. If your component supports asynchronous scheduled decompression, it
  837. // may receive more than one ImageCodecBeginBand call before receiving an ImageCodecDrawBand call.
  838. pascal ComponentResult FauxCodecImageCodecBeginBand(Codec_Globals glob, CodecDecompressParams *p, ImageSubCodecDecompressRecord *drp, long flags)
  839. {
  840. #pragma unused(glob)
  841. long offsetH, offsetV;
  842. FauxCodecDecompressRecord *myDrp = (FauxCodecDecompressRecord *)drp->userDecompressRecord;
  843. offsetH = (long)(p->dstRect.left - p->dstPixMap.bounds.left) * (long)(p->dstPixMap.pixelSize >> 3);
  844. offsetV = (long)(p->dstRect.top - p->dstPixMap.bounds.top) * (long)drp->rowBytes;
  845. drp->baseAddr = p->dstPixMap.baseAddr + offsetH + offsetV;
  846. myDrp->width = (**p->imageDescription).width;
  847. myDrp->height = (**p->imageDescription).height;
  848. myDrp->depth = (**p->imageDescription).depth;
  849. return noErr;
  850. }
  851. // ImageCodecDrawBand
  852. // The base image decompressor calls your image decompressor component's ImageCodecDrawBand function
  853. // to decompress a band or frame. Your component must implement this function. If the ImageSubCodecDecompressRecord
  854. // structure specifies a progress function or data-loading function, the base image decompressor will never call ImageCodecDrawBand
  855. // at interrupt time. If the ImageSubCodecDecompressRecord structure specifies a progress function, the base image decompressor
  856. // handles codecProgressOpen and codecProgressClose calls, and your image decompressor component must not implement these functions.
  857. // If not, the base image decompressor may call the ImageCodecDrawBand function at interrupt time.
  858. // When the base image decompressor calls your ImageCodecDrawBand function, your component must perform the decompression specified
  859. // by the fields of the ImageSubCodecDecompressRecord structure. The structure includes any changes your component made to it
  860. // when performing the ImageCodecBeginBand function. If your component supports asynchronous scheduled decompression,
  861. // it may receive more than one ImageCodecBeginBand call before receiving an ImageCodecDrawBand call.
  862. pascal ComponentResult FauxCodecImageCodecDrawBand(Codec_Globals glob, ImageSubCodecDecompressRecord *drp)
  863. {
  864. #pragma unused(glob)
  865.     OSErr err = noErr;
  866.     FauxCodecDecompressRecord *myDrp = (FauxCodecDecompressRecord *)drp->userDecompressRecord;
  867.     unsigned char *dataPtr = (unsigned char *)drp->codecData;
  868.     ICMDataProcRecordPtr dataProc = drp->dataProcRecord.dataProc ? &drp->dataProcRecord : NULL;
  869.     ImageFramePtr framePtr = (ImageFramePtr)dataPtr;
  870.     for (long i = 0; i < myDrp->height; i++)
  871.     {
  872. void* srcP = (void*)((long)dataPtr + i * myDrp->width * 2);
  873. void* dstP = (void*)((long)drp->baseAddr + i * drp->rowBytes);
  874. BlockMoveData(srcP, dstP, myDrp->width*2);
  875.     }
  876.     return noErr;
  877. }
  878. // ImageCodecEndBand
  879. // The ImageCodecEndBand function notifies your image decompressor component that decompression of a band has finished or
  880. // that it was terminated by the Image Compression Manager. Your image decompressor component is not required to implement
  881. // the ImageCodecEndBand function. The base image decompressor may call the ImageCodecEndBand function at interrupt time.
  882. // After your image decompressor component handles an ImageCodecEndBand call, it can perform any tasks that are required
  883. // when decompression is finished, such as disposing of data structures that are no longer needed. Because this function
  884. // can be called at interrupt time, your component cannot use this function to dispose of data structures; this
  885. // must occur after handling the function. The value of the result parameter should be set to noErr if the band or frame was
  886. // drawn successfully. If it is any other value, the band or frame was not drawn.
  887. pascal ComponentResult FauxCodecImageCodecEndBand(Codec_Globals glob, ImageSubCodecDecompressRecord *drp, OSErr result, long flags)
  888. {
  889. #pragma unused(glob, drp,result, flags)
  890.     return noErr;
  891. }
  892. // ImageCodecQueueStarting
  893. //  If your component supports asynchronous scheduled decompression, the base image decompressor calls your image decompressor component's
  894. // ImageCodecQueueStarting function before decompressing the frames in the queue. Your component is not required to implement this function.
  895. // It can implement the function if it needs to perform any tasks at this time, such as locking data structures.
  896. // The base image decompressor never calls the ImageCodecQueueStarting function at interrupt time.
  897. pascal ComponentResult FauxCodecImageCodecQueueStarting(Codec_Globals glob)
  898. {
  899. #pragma unused(glob)
  900. return noErr;
  901. }
  902. // ImageCodecQueueStopping
  903. //  If your image decompressor component supports asynchronous scheduled decompression, the ImageCodecQueueStopping function notifies
  904. // your component that the frames in the queue have been decompressed. Your component is not required to implement this function.
  905. // After your image decompressor component handles an ImageCodecQueueStopping call, it can perform any tasks that are required when decompression
  906. // of the frames is finished, such as disposing of data structures that are no longer needed. 
  907. // The base image decompressor never calls the ImageCodecQueueStopping function at interrupt time.
  908. pascal ComponentResult FauxCodecImageCodecQueueStopping(Codec_Globals glob)
  909. {
  910. #pragma unused(glob)
  911. return noErr;
  912. }
  913. // ImageCodecGetCompressedImageSize
  914. //  Your component receives the ImageCodecGetCompressedImageSize request whenever an application calls the ICM's GetCompressedImageSize function.
  915. // You can use the ImageCodecGetCompressedImageSize function when you are extracting a single image from a sequence; therefore, you don't have an
  916. // image description structure and don't know the exact size of one frame. In this case, the Image Compression Manager calls the component to determine
  917. // the size of the data. Your component should return a long integer indicating the number of bytes of data in the compressed image. You may want to store
  918. // the image size somewhere in the image description structure, so that you can respond to this request quickly. Only decompressors receive this request.
  919. pascal ComponentResult FauxCodecImageCodecGetCompressedImageSize(Codec_Globals glob, ImageDescriptionHandle desc, Ptr data, long dataSize, ICMDataProcRecordPtr dataProc, long *size)
  920. {
  921. #pragma unused(glob,dataSize,dataProc)
  922. ImageFramePtr framePtr = (ImageFramePtr)data;
  923. if (size == NULL) 
  924. return paramErr;
  925. // xxxbobclark gotta fix this
  926. *size = EndianU32_BtoN(framePtr->frameSize) + sizeof(ImageFrame);
  927. return noErr;
  928. }
  929. // ImageCodecGetCodecInfo
  930. // Your component receives the ImageCodecGetCodecInfo request whenever an application calls the Image Compression Manager's GetCodecInfo function.
  931. // Your component should return a formatted compressor information structure defining its capabilities.
  932. // Both compressors and decompressors may receive this request.
  933. pascal ComponentResult FauxCodecImageCodecGetCodecInfo(Codec_Globals glob, CodecInfo *info)
  934. {
  935.     OSErr err = noErr;
  936.     if (info == NULL)
  937.     {
  938. err = paramErr;
  939.     }
  940.     else
  941.     {
  942. BlockMoveData("pRealNetworks", info->typeName, 13);
  943. info->version = 1;
  944. info->revisionLevel = 1;
  945. info->vendor = 'RNWK';
  946. info->decompressFlags = 0; // no flags for YUV-type of pixel maps
  947. info->formatFlags = 0; // no flags for YUV-type of pixel maps
  948. info->compressionAccuracy = 128;
  949. info->decompressionAccuracy = 128;
  950. info->compressionSpeed = 200;
  951. info->decompressionSpeed = 200;
  952. info->compressionLevel = 128;
  953. info->resvd = 0;
  954. info->minimumHeight = 2;
  955. info->minimumWidth = 2;
  956. info->decompressPipelineLatency = 0;
  957. info->compressPipelineLatency = 0;
  958. info->privateData = 0;
  959.     }
  960.     return err;
  961. }
  962. #pragma mark-
  963. Component gFauxCodecComponent = NULL;
  964. // When building the *Application Version Only* make our component available for use by applications (or other clients).
  965. // Once the Component Manager has registered a component, applications can find and open the component using standard
  966. // Component Manager routines.
  967. void FauxCodecRegister(void)
  968. {
  969.     ComponentDescription td;
  970. #if defined(_CARBON) || defined(_MAC_UNIX)
  971.     ComponentRoutineUPP componentEntryPoint = NewComponentRoutineUPP((ComponentRoutineProcPtr)FauxCodecImageCodecComponentDispatch);
  972. #else
  973.     ComponentRoutineUPP componentEntryPoint = NewComponentRoutineProc(FauxCodecImageCodecComponentDispatch);
  974. #endif
  975.     td.componentType = decompressorComponentType;
  976.     td.componentSubType = FOUR_CHAR_CODE('yuvs');
  977.     td.componentManufacturer = 'RNWK';
  978.     td.componentFlags = codecInfoDoes32;
  979.     td.componentFlagsMask = 0;
  980.     gFauxCodecComponent = RegisterComponent(&td,componentEntryPoint, 0, NULL, NULL, NULL);
  981.     // xxxbobclark set up a wanted destination pixel types handle in
  982.     // case I need an existing one at interrupt time.
  983.     gWantedDestinationPixelTypes = NewHandle(8);
  984.     unsigned long* typeArray = (unsigned long*)gWantedDestinationPixelTypes;
  985.     
  986.     // end the type array with zero
  987.     
  988.     //typeArray[0] = '2vuy';
  989.     typeArray[0] = 'yuvs';
  990.     typeArray[1] = 0;
  991. }
  992. void FauxCodecUnregister(void)
  993. {
  994.     if (gFauxCodecComponent)
  995.     {
  996.         // be sure that the sequence ID has been deallocated!
  997.         CMacSurface::CleanUpOverlay();
  998.         
  999.         UnregisterComponent(gFauxCodecComponent);
  1000.         gFauxCodecComponent = NULL;
  1001.     }
  1002. }