Retired Document
Important: This sample code may not represent best practices for current development. The project may use deprecated symbols and illustrate technologies and techniques that are no longer recommended.
softVdig.h
/* |
File: softVdig.c |
Contains: Software video digitzer header file (constants, structs, prototypes) |
Written by: Peter Hoddie (mostly) and Casey King and Gary Woodcock |
Refer to develop Issue 14, "Video Digitizing Under QuickTime", |
for details on this code. |
This code requires QuickTime 1.5. |
Copyright: © 1993 by Apple Computer, Inc. |
Change History (most recent first): |
*/ |
//----------------------------------------------------------------------- |
// includes |
#ifndef _SOFTVDIG_ |
#define _SOFTVDIG_ |
#include <Components.h> |
#include "QuickTimeComponents.h" |
#include <QDOffscreen.h> |
// Comment out this line if you are building a standalone component |
//#define DEBUG_IT |
#ifdef DEBUG_IT |
pascal ComponentResult softVdig (ComponentParameters *params, Handle storage); |
Component RegisterSoftVdig(void); |
#endif DEBUG_IT |
// constants which define the characteristics of this vdig |
// there are 2 other global controls which are initialized in vdigOpen |
// these global controls are gAttachedGDevice and gAuxBufferRect |
#define kMaxHorNTSCIn 320 // maps to the MaxSrcRect width |
#define kMaxVerNTSCIn 240 // maps to the MaxSrcRect height |
#define kVerBlank 0 // would map to VerBlankRect, but unused here |
#define gMaxSoftVdigCount 1 // how many can be open at once |
#define gDoesDepths 0 // what output depth can the device output to |
#define gDoesPlaythru false // will respond to VDSetPlayThruOnOff |
#define gHasAuxBuffer false // simulates local buffering |
#define gAuxDepth 16 // for use in simulating local buffering |
#define gCanAsync true // simulates async grab capability |
#define gCanClip true // clipping can be applied |
#define gCanScale true // supports stretch & shrink |
#define gCanDMA true // simulates the "go anywhere" vdig |
#define gDMADepths 16 | 8 // depths that DMA works |
#define gMaxHeight 240 // maximum scalable height |
#define gMaxWidth 320 // maximum scalable width |
#define gMinHeight 10 // minimum scalable height |
#define gMinWidth 10 // minimum scalable width |
#define gDoesFrameRate false // simulates controllable frame rate grabs |
#define gVideoTimeScale 2997 |
#define gDoesCompress false // capable of producing compressed data |
#define gOnlyDoesCompress false // can't provide image data |
#define gOnlyCompressType 'rpza' // set to zero to support all compression types |
// softvdig global variables |
typedef struct { |
ComponentInstance self; // this instance |
long frameNumber; // frame counter |
GWorldPtr tempPort; // use for drawing simulated video frames |
Rect maxSrcRect; // for VDGetMaxSrcRect |
Rect digiRect; // part of frame to use |
Boolean playThruOn; // draw during idle |
Rect playThruRect; |
PixMapHandle playThruPixMap; |
GWorldPtr auxBuffer; // the auxbuffer, if using one |
MatrixRecord matrix; // display matrix |
RgnHandle clipRgn; // current clip |
Point clipOrigin; // top left of display when clip set |
VdigBufferRecListHandle bufferList; // buffer list for async stuff |
short pendingAsyncBuffer; // pending grab request... -1 if none. |
// compressed source stuff |
OSType compressType; |
short compressDepth; |
Rect compressRect; |
CodecQ spatialQuality; |
CodecQ temporalQuality; |
long keyFrameRate; |
ImageDescriptionHandle desc; |
Ptr compressBuffer; |
GWorldPtr compressGW; |
Boolean forceKeyFrame; |
Boolean compressOn; |
ImageSequence compressSeq; |
TimeBase timeBase; |
TimeValue nextFrameTime; // next time if doing frame rate limiting |
TimeValue frameTimeStep; // increment for stepping, non-zero means do limiting |
// more globals |
long inputCurrentFlags; |
long outputCurrentFlags; |
unsigned short blackLevel; |
unsigned short whiteLevel; |
unsigned short brightness; |
unsigned short hue; |
unsigned short saturation; |
unsigned short contrast; |
unsigned short sharpness; |
Rect gAuxBufferRect; |
GDHandle gAttachedGDevice; |
} vdigGlobalsRecord, *vdigGlobalsPtr, **vdigGlobals; |
// prototypes that map to VD API calls |
pascal ComponentResult vdigOpen(vdigGlobals storage, ComponentInstance self); |
pascal ComponentResult vdigClose(vdigGlobals storage, ComponentInstance self); |
pascal ComponentResult vdigCanDo(vdigGlobals storage, short ftnNumber); |
pascal ComponentResult vdigVersion(vdigGlobals storage); |
pascal VideoDigitizerError vdigGetMaxSrcRect(vdigGlobals storage, short inputStd, Rect *maxSrcRect); |
pascal VideoDigitizerError vdigGetActiveSrcRect(vdigGlobals storage, short inputStd, Rect *activeSrcRect); |
pascal VideoDigitizerError vdigSetDigitizerRect(vdigGlobals storage, Rect *digiRect); |
pascal VideoDigitizerError vdigGetDigitizerRect(vdigGlobals storage, Rect *digiRect); |
pascal VideoDigitizerError vdigUseThisCLUT(vdigGlobals storage, CTabHandle colorTableHandle); |
pascal VideoDigitizerError vdigGrabOneFrame(vdigGlobals storage); |
pascal VideoDigitizerError vdigSetContrast(vdigGlobals storage, unsigned short *contrast); |
pascal VideoDigitizerError vdigSetHue(vdigGlobals storage, unsigned short *hue); |
pascal VideoDigitizerError vdigSetBrightness(vdigGlobals storage, unsigned short *brightness); |
pascal VideoDigitizerError vdigSetSaturation(vdigGlobals storage, unsigned short *saturation); |
pascal VideoDigitizerError vdigSetSharpness(vdigGlobals storage, unsigned short *sharpness); |
pascal VideoDigitizerError vdigSetBlackLevel(vdigGlobals storage, unsigned short *blackLevel); |
pascal VideoDigitizerError vdigSetWhiteLevel(vdigGlobals storage, unsigned short *whiteLevel); |
pascal VideoDigitizerError vdigGetContrast(vdigGlobals storage, unsigned short *contrast); |
pascal VideoDigitizerError vdigGetHue(vdigGlobals storage, unsigned short *hue); |
pascal VideoDigitizerError vdigGetBrightness(vdigGlobals storage, unsigned short *brightness); |
pascal VideoDigitizerError vdigGetSaturation(vdigGlobals storage, unsigned short *saturation); |
pascal VideoDigitizerError vdigGetSharpness(vdigGlobals storage, unsigned short *sharpness); |
pascal VideoDigitizerError vdigGetBlackLevel(vdigGlobals storage, unsigned short *blackLevel); |
pascal VideoDigitizerError vdigGetWhiteLevel(vdigGlobals storage, unsigned short *whiteLevel); |
pascal VideoDigitizerError vdigGetVideoDefaults(vdigGlobals storage, |
unsigned short *blackLevel, unsigned short *whiteLevel, |
unsigned short *brightness, unsigned short *hue, unsigned short *saturation, |
unsigned short *contrast, unsigned short *sharpness); |
pascal VideoDigitizerError vdigGetMaxAuxBuffer(vdigGlobals storage, PixMapHandle *pm, Rect *r); |
pascal VideoDigitizerError vdigGetDigitizerInfo(vdigGlobals storage, DigitizerInfo *info); |
pascal VideoDigitizerError vdigGetCurrentFlags(vdigGlobals storage, long *inputCurrentFlag, long *outputCurrentFlag); |
pascal VideoDigitizerError vdigSetPlayThruOnOff(vdigGlobals storage, short state); |
pascal VideoDigitizerError vdigSetPlayThruDestination(vdigGlobals storage, PixMapHandle dest, Rect *destRect, MatrixRecord *m, RgnHandle mask); |
pascal VideoDigitizerError vdigSetupBuffers(vdigGlobals storage, VdigBufferRecListHandle bufferList); |
pascal VideoDigitizerError vdigPreflightDestination(vdigGlobals storage, Rect *digitizerRect, PixMap **dest, Rect *destRect, MatrixRecord *m); |
pascal VideoDigitizerError vdigGrabOneFrameAsync(vdigGlobals storage, short buffer); |
pascal long vdigDone(vdigGlobals storage, short buffer); |
pascal VideoDigitizerError vdigGetNumberOfInputs(vdigGlobals storage, short *inputs); |
pascal VideoDigitizerError vdigGetInputFormat(vdigGlobals storage, short input, short *format); |
pascal VideoDigitizerError vdigSetInput(vdigGlobals storage, short input); |
pascal VideoDigitizerError vdigGetInput(vdigGlobals storage, short *input); |
pascal VideoDigitizerError vdigSetCompression(vdigGlobals storage, OSType compressType, short depth, Rect *bounds, |
CodecQ spatialQuality, CodecQ temporalQuality, long keyFrameRate); |
pascal VideoDigitizerError vdigCompressOneFrameAsync(vdigGlobals storage); |
pascal VideoDigitizerError vdigCompressDone(vdigGlobals storage, Boolean *done, Ptr *theData, long *dataSize, unsigned char *similarity, TimeRecord *tr); |
pascal VideoDigitizerError vdigReleaseCompressBuffer(vdigGlobals storage, Ptr theBufffer); |
pascal VideoDigitizerError vdigGetImageDescription(vdigGlobals storage, ImageDescriptionHandle desc); |
pascal VideoDigitizerError vdigResetCompressSequence(vdigGlobals storage); |
pascal VideoDigitizerError vdigSetCompressionOnOff(vdigGlobals storage, Boolean newState); |
pascal VideoDigitizerError vdigGetCompressionTypes(vdigGlobals storage, VDCompressionListHandle h); |
pascal VideoDigitizerError vdigSetTimeBase(vdigGlobals storage, TimeBase t); |
pascal VideoDigitizerError vdigSetFrameRate(vdigGlobals storage, Fixed framesPerSecond); |
pascal VideoDigitizerError vdigGetDMADepths(vdigGlobals storage, long *depthArray, long *preferredDepth); |
pascal VideoDigitizerError vdigGetPreferredTimeScale(vdigGlobals storage, TimeScale *preferred); |
// prototypes for utility functions |
void makeOffscreen(vdigGlobals storage); |
void tossOffscreen(vdigGlobals storage); |
void drawVideoFrame(vdigGlobals storage, Point where, PixMapHandle destPixMap); |
Boolean validatePixMap(vdigGlobals storage, PixMapHandle p); |
void tossCompressStuff(vdigGlobals storage); |
#endif _MATHCOMPONENT_ |
Copyright © 2003 Apple Computer, Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2003-08-29