fauxcodec.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:54k
源码类别:

Symbian

开发平台:

C/C++

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