📄 fauxcodec.cpp
字号:
/* ***** BEGIN LICENSE BLOCK *****
* Version: RCSL 1.0/RPSL 1.0
*
* Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
*
* The contents of this file, and the files included with this file, are
* subject to the current version of the RealNetworks Public Source License
* Version 1.0 (the "RPSL") available at
* http://www.helixcommunity.org/content/rpsl unless you have licensed
* the file under the RealNetworks Community Source License Version 1.0
* (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
* in which case the RCSL will apply. You may also obtain the license terms
* directly from RealNetworks. You may not use this file except in
* compliance with the RPSL or, if you have a valid RCSL with RealNetworks
* applicable to this file, the RCSL. Please see the applicable RPSL or
* RCSL for the rights, obligations and limitations governing use of the
* contents of the file.
*
* This file is part of the Helix DNA Technology. RealNetworks is the
* developer of the Original Code and owns the copyrights in the portions
* it created.
*
* This file, and the files included with this file, is distributed and made
* available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
*
* Technology Compatibility Kit Test Suite(s) Location:
* http://www.helixcommunity.org/content/tck
*
* Contributor(s):
*
* ***** END LICENSE BLOCK ***** */
/****************************************************************************
*
* This program contains proprietary
* information of RealNetworks, Inc, and is licensed
* subject to restrictions on use and distribution.
*
* Platform-specific hardware acceleration (overlay)
* implementation for Macintosh.
*
* On the Macintosh, in order to access accelerated
* video hardware, we must pretend we're an Image
* Compression Manager codec. It's a pretty trivial
* codec since all we need to do is advertise that
* we output yuv data. Then we "register" ourself and
* that automagically inserts us into the codec chain
* and the OS will take our yuv "output" and blit it
* however it thinks best. Which is to accelerated
* hardware on both ATI and nVidia on OS 9, and ought
* to work on OS X as well, although OS X's success
* hasn't been verified as of this writing.
*
* See the ElectricImageComponent sample code sample
* at <http://developer.apple.com/samplecode/Sample_Code/
* QuickTime/Importers_and_Exporters/ElectricImageComponent.htm>
* for more information about how this fake codec was
* constructed.
*/
#include "fauxcodec.h"
#include "platform/mac/hx_moreprocesses.h"
// xxxbobclark all these includes are simply to
// call the static CMacSurface::CleanUpOverlay.
#include "hxcom.h"
#include "hxwintyp.h"
#include "hxthread.h"
#include "platform/mac/macsurf.h"
// The high word is the codecInterfaceVersion
#define kFauxCodecVersion (0x00020001)
#define kFauxCodecVersionPPC (0x00020002) // PPC is +1
// Data structures
#pragma options align=mac68k
typedef struct {
ComponentInstance self;
ComponentInstance delegateComponent;
ComponentInstance target;
ImageCodecMPDrawBandUPP drawBandUPP;
} Codec_GlobalsRecord, *Codec_Globals;
typedef struct {
long width;
long height;
long depth;
} FauxCodecDecompressRecord;
typedef struct {
UInt16 imageVersion; /* Image file version (5) */
UInt32 imageFrames; /* Number of frames in the file (1..?) */
} ImageHeader, *ImageHeaderPtr;
typedef struct {
QTFloatSingle frameTime; /* Time of frame (0.0) */
Rect frameRect; /* Frame Rectangle */
UInt8 frameBitDepth; /* Bits Per Pixel (not including alpha) */
UInt8 frameType; /* Pixel Type (0=Direct; 1=Indexed) */
Rect framePackRect; /* Packing rectangle */
UInt8 framePacking; /* Packing Mode (0=Not Packed; 1=RL Encoding) */
UInt8 frameAlpha; /* Alpha Bits per pixel */
UInt32 frameSize; /* Size in bytes of the body of the image */
UInt16 framePalettes; /* Number of entries in the color table (1..256) */
UInt16 frameBackground; /* The index of the background color (0) */
} ImageFrame, *ImageFramePtr;
#pragma options align=reset
Handle gWantedDestinationPixelTypes = nil;
// Setup required for ComponentDispatchHelper.c
#define IMAGECODEC_BASENAME() FauxCodecImageCodec
#define IMAGECODEC_GLOBALS() Codec_Globals storage
#define CALLCOMPONENT_BASENAME() IMAGECODEC_BASENAME()
#define CALLCOMPONENT_GLOBALS() IMAGECODEC_GLOBALS()
#define COMPONENT_UPP_PREFIX() uppImageCodec
#define COMPONENT_DISPATCH_FILE "FauxCodecDispatch.h"
#define COMPONENT_SELECT_PREFIX() kImageCodec
#define GET_DELEGATE_COMPONENT() (storage->delegateComponent)
//#include "ImageCodec.k.h"
// was in components.k.h
#ifdef CALLCOMPONENT_BASENAME
#ifndef CALLCOMPONENT_GLOBALS
#define CALLCOMPONENT_GLOBALS()
#define ADD_CALLCOMPONENT_COMMA
#else
#define ADD_CALLCOMPONENT_COMMA ,
#endif
#define CALLCOMPONENT_GLUE(a,b) a##b
#define CALLCOMPONENT_STRCAT(a,b) CALLCOMPONENT_GLUE(a,b)
#define ADD_CALLCOMPONENT_BASENAME(name) CALLCOMPONENT_STRCAT(CALLCOMPONENT_BASENAME(),name)
EXTERN_API( ComponentResult ) ADD_CALLCOMPONENT_BASENAME(Open) (CALLCOMPONENT_GLOBALS() ADD_CALLCOMPONENT_COMMA ComponentInstance self);
EXTERN_API( ComponentResult ) ADD_CALLCOMPONENT_BASENAME(Close) (CALLCOMPONENT_GLOBALS() ADD_CALLCOMPONENT_COMMA ComponentInstance self);
EXTERN_API( ComponentResult ) ADD_CALLCOMPONENT_BASENAME(CanDo) (CALLCOMPONENT_GLOBALS() ADD_CALLCOMPONENT_COMMA short ftnNumber);
EXTERN_API( ComponentResult ) ADD_CALLCOMPONENT_BASENAME(Version) (CALLCOMPONENT_GLOBALS());
EXTERN_API( ComponentResult ) ADD_CALLCOMPONENT_BASENAME(Register) (CALLCOMPONENT_GLOBALS());
EXTERN_API( ComponentResult ) ADD_CALLCOMPONENT_BASENAME(Target) (CALLCOMPONENT_GLOBALS() ADD_CALLCOMPONENT_COMMA ComponentInstance target);
EXTERN_API( ComponentResult ) ADD_CALLCOMPONENT_BASENAME(Unregister) (CALLCOMPONENT_GLOBALS());
EXTERN_API( ComponentResult ) ADD_CALLCOMPONENT_BASENAME(GetMPWorkFunction) (CALLCOMPONENT_GLOBALS() ADD_CALLCOMPONENT_COMMA ComponentMPWorkFunctionUPP * workFunction, void ** refCon);
EXTERN_API( ComponentResult ) ADD_CALLCOMPONENT_BASENAME(GetPublicResource) (CALLCOMPONENT_GLOBALS() ADD_CALLCOMPONENT_COMMA OSType resourceType, short resourceID, Handle * resource);
#endif /* CALLCOMPONENT_BASENAME */
// was in ImageCodec.k.h
#ifdef IMAGECODEC_BASENAME
#ifndef IMAGECODEC_GLOBALS
#define IMAGECODEC_GLOBALS()
#define ADD_IMAGECODEC_COMMA
#else
#define ADD_IMAGECODEC_COMMA ,
#endif
#define IMAGECODEC_GLUE(a,b) a##b
#define IMAGECODEC_STRCAT(a,b) IMAGECODEC_GLUE(a,b)
#define ADD_IMAGECODEC_BASENAME(name) IMAGECODEC_STRCAT(IMAGECODEC_BASENAME(),name)
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(GetCodecInfo) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA CodecInfo * info);
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);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(GetMaxCompressionSize) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA PixMapHandle src, const Rect * srcRect, short depth, CodecQ quality, long * size);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(PreCompress) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA CodecCompressParams * params);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(BandCompress) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA CodecCompressParams * params);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(PreDecompress) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA CodecDecompressParams * params);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(BandDecompress) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA CodecDecompressParams * params);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(Busy) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA ImageSequence seq);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(GetCompressedImageSize) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA ImageDescriptionHandle desc, Ptr data, long bufferSize, ICMDataProcRecordPtr dataProc, long * dataSize);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(GetSimilarity) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA PixMapHandle src, const Rect * srcRect, ImageDescriptionHandle desc, Ptr data, Fixed * similarity);
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);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(RequestSettings) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA Handle settings, Rect * rp, ModalFilterUPP filterProc);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(GetSettings) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA Handle settings);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(SetSettings) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA Handle settings);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(Flush) (IMAGECODEC_GLOBALS());
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(SetTimeCode) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA void * timeCodeFormat, void * timeCodeTime);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(IsImageDescriptionEquivalent) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA ImageDescriptionHandle newDesc, Boolean * equivalent);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(NewMemory) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA Ptr * data, Size dataSize, long dataUse, ICMMemoryDisposedUPP memoryGoneProc, void * refCon);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(DisposeMemory) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA Ptr data);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(HitTestData) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA ImageDescriptionHandle desc, void * data, Size dataSize, Point where, Boolean * hit);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(NewImageBufferMemory) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA CodecDecompressParams * params, long flags, ICMMemoryDisposedUPP memoryGoneProc, void * refCon);
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);
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);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(SetTimeBase) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA void * base);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(SourceChanged) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA UInt32 majorSourceChangeSeed, UInt32 minorSourceChangeSeed, CDSequenceDataSourcePtr sourceData, long * flagsOut);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(FlushFrame) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA UInt32 flags);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(GetSettingsAsText) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA Handle * text);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(GetParameterListHandle) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA Handle * parameterDescriptionHandle);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(GetParameterList) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA QTAtomContainer * parameterDescription);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(CreateStandardParameterDialog) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA QTAtomContainer parameterDescription, QTAtomContainer parameters, QTParameterDialogOptions dialogOptions, DialogPtr existingDialog, short existingUserItem, QTParameterDialog * createdDialog);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(IsStandardParameterDialogEvent) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA EventRecord * pEvent, QTParameterDialog createdDialog);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(DismissStandardParameterDialog) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA QTParameterDialog createdDialog);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(StandardParameterDialogDoAction) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA QTParameterDialog createdDialog, long action, void * params);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(NewImageGWorld) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA CodecDecompressParams * params, GWorldPtr * newGW, long flags);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(DisposeImageGWorld) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA GWorldPtr theGW);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(HitTestDataWithFlags) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA ImageDescriptionHandle desc, void * data, Size dataSize, Point where, long * hit, long hitFlags);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(ValidateParameters) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA QTAtomContainer parameters, QTParameterValidationOptions validationFlags, StringPtr errorString);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(GetBaseMPWorkFunction) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA ComponentMPWorkFunctionUPP * workFunction, void ** refCon, ImageCodecMPDrawBandUPP drawProc, void * drawProcRefCon);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(RequestGammaLevel) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA Fixed srcGammaLevel, Fixed dstGammaLevel, long * codecCanMatch);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(GetSourceDataGammaLevel) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA Fixed * sourceDataGammaLevel);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(GetDecompressLatency) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA TimeRecord * latency);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(Preflight) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA CodecDecompressParams * params);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(Initialize) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA ImageSubCodecDecompressCapabilities * cap);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(BeginBand) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA CodecDecompressParams * params, ImageSubCodecDecompressRecord * drp, long flags);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(DrawBand) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA ImageSubCodecDecompressRecord * drp);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(EndBand) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA ImageSubCodecDecompressRecord * drp, OSErr result, long flags);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(QueueStarting) (IMAGECODEC_GLOBALS());
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(QueueStopping) (IMAGECODEC_GLOBALS());
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(DroppingFrame) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA const ImageSubCodecDecompressRecord * drp);
// EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(ScheduleFrame) (IMAGECODEC_GLOBALS() ADD_IMAGECODEC_COMMA const ImageSubCodecDecompressRecord * drp, ImageCodecTimeTriggerUPP triggerProc, void * triggerProcRefCon);
EXTERN_API( ComponentResult ) ADD_IMAGECODEC_BASENAME(CancelTrigger) (IMAGECODEC_GLOBALS());
/* MixedMode ProcInfo constants for component calls */
enum {
uppImageCodecGetCodecInfoProcInfo = 0x000003F0,
uppImageCodecGetCompressionTimeProcInfo = 0x000FEFF0,
uppImageCodecGetMaxCompressionSizeProcInfo = 0x0003EFF0,
uppImageCodecPreCompressProcInfo = 0x000003F0,
uppImageCodecBandCompressProcInfo = 0x000003F0,
uppImageCodecPreDecompressProcInfo = 0x000003F0,
uppImageCodecBandDecompressProcInfo = 0x000003F0,
uppImageCodecBusyProcInfo = 0x000003F0,
uppImageCodecGetCompressedImageSizeProcInfo = 0x0003FFF0,
uppImageCodecGetSimilarityProcInfo = 0x0003FFF0,
uppImageCodecTrimImageProcInfo = 0x03FFFFF0,
uppImageCodecRequestSettingsProcInfo = 0x00003FF0,
uppImageCodecGetSettingsProcInfo = 0x000003F0,
uppImageCodecSetSettingsProcInfo = 0x000003F0,
uppImageCodecFlushProcInfo = 0x000000F0,
uppImageCodecSetTimeCodeProcInfo = 0x00000FF0,
uppImageCodecIsImageDescriptionEquivalentProcInfo = 0x00000FF0,
uppImageCodecNewMemoryProcInfo = 0x0003FFF0,
uppImageCodecDisposeMemoryProcInfo = 0x000003F0,
uppImageCodecHitTestDataProcInfo = 0x0003FFF0,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -