/**************************************************************************** * * avicapi.h * * Internal, private definitions. * * Microsoft Video for Windows Sample Capture Class * * Copyright (c) 1992, 1993 Microsoft Corporation. All Rights Reserved. * * You have a royalty-free right to use, modify, reproduce and * distribute the Sample Files (and/or any modified version) in * any way you find useful, provided that you agree that * Microsoft has no warranty obligations or liability for any * Sample Application Files which are modified. * ***************************************************************************/ #ifndef _INC_AVICAP_INTERNAL #define _INC_AVICAP_INTERNAL #include #include #include "iaverage.h" #ifdef __cplusplus extern "C" { /* Assume C declarations for C++ */ #endif /* __cplusplus */ #ifndef RC_INVOKED #pragma pack(1) /* Assume byte packing throughout */ #endif /* RC_INVOKED */ /* c8 uses underscores on all defines */ #ifdef DEBUG #ifndef _DEBUG #define _DEBUG #endif #endif #define IDS_CAP_RTL 10000 #ifndef LPHISTOGRAM typedef DWORD huge * LPHISTOGRAM; #endif #define WIDTHBYTES(i) ((unsigned)((i+31)&(~31))/8) /* ULONG aligned ! */ #define DIBWIDTHBYTES(bi) ((int)WIDTHBYTES((int)(bi).biWidth * (int)(bi).biBitCount)) #define SWAP(x,y) ((x)^=(y)^=(x)^=(y)) #define AVICAP DWORD FAR PASCAL #define DROP_BUFFER_SIZE 2048 #define MAX_VIDEO_BUFFERS 1000 #define MIN_VIDEO_BUFFERS 5 #define DEF_WAVE_BUFFERS 4 #define MAX_WAVE_BUFFERS 10 #define _MAX_CAP_PATH MAX_PATH /* 260 */ // MCI Capture state machine enum mcicapstates { CAPMCI_STATE_Uninitialized = 0, CAPMCI_STATE_Initialized, CAPMCI_STATE_StartVideo, CAPMCI_STATE_CapturingVideo, CAPMCI_STATE_VideoFini, CAPMCI_STATE_StartAudio, CAPMCI_STATE_CapturingAudio, CAPMCI_STATE_AudioFini, CAPMCI_STATE_AllFini }; // ------------------------- // CAPSTREAM structure // ------------------------- #define CAPSTREAM_VERSION 1 // Increment whenever struct changes // This structure is GlobalAlloc'd for each capture window instance. // A pointer to the structure is stored in the Window extra bytes. // Applications can retrieve a pointer to the stucture using // the WM_CAP_GET_CAPSTREAMPTR message. // I: internal variables which the client app should not modify // M: variables which the client app can set via Send/PostMessage typedef struct tagCAPSTREAM { DWORD dwSize; // I: size of structure UINT uiVersion; // I: version of structure HINSTANCE hInst; // I: our instance HTASK hTaskCapture; // I: capture task handle DWORD dwReturn; // I: capture task return val HWND hwnd; // I: our hwnd // Use MakeProcInstance to create all callbacks !!! // Status, error callbacks CAPSTATUSCALLBACK CallbackOnStatus; // M: Status callback CAPERRORCALLBACK CallbackOnError; // M: Error callback // Allows client to process messages during capture if set CAPYIELDCALLBACK CallbackOnYield; // M: Yield processing // Video and wave callbacks for Network or other specialized xfers CAPVIDEOCALLBACK CallbackOnVideoFrame; // M: Only during preview CAPVIDEOCALLBACK CallbackOnVideoStream; // M: Video buffer ready CAPWAVECALLBACK CallbackOnWaveStream; // M: Wave buffer ready CAPCONTROLCALLBACK CallbackOnControl; // M: External Start/Stop ctrl // Open channels on the video hardware device // and hardware capabilies CAPDRIVERCAPS sCapDrvCaps; // M: What can the driver do HVIDEO hVideoIn; // I: In channel HVIDEO hVideoCapture; // I: Ext In channel HVIDEO hVideoDisplay; // I: Ext Out channel BOOL fHardwareConnected; // I: ANY open channel? // Window to display video BOOL fLiveWindow; // M: Preview video BOOL fOverlayWindow; // M: Overlay video BOOL fScale; // M: Scale image to client POINT ptScroll; // I: Scroll position HANDLE hdd; // I: hDrawDib access handle HCURSOR hWaitCursor; // I: hourglass UINT uiRegion; // I: CheckWindowMove RECT rcRegionRect; // I: CheckWindowMove DWORD dwRegionOrigin; // I: CheckWindowMove // Window update timer UINT idTimer; // I: ID of preview timer UINT uTimeout; // M: Preview rate in mS. // Capture destination and control CAPTUREPARMS sCapParms; // M: how to capture BOOL fCapturingToDisk; // M: if capturing to disk BOOL fCapturingNow; // I: if performing capture BOOL fStepCapturingNow; // I: if performing MCI step capture BOOL fFrameCapturingNow; // I: if performing single frame capture BOOL fStopCapture; // M: if stop requested BOOL fAbortCapture; // M: if abort requested DWORD dwTimeElapsedMS; // I: Capture time in millisec // Index HGLOBAL hIndex; // I: handle to index mem DWORD dwIndex; // I: index index DWORD dwVideoChunkCount; // I: # of video frames cap'd DWORD dwWaveChunkCount; // I: # of audio buffers cap'd DWORD _huge * lpdwIndexStart; // I: index start ptr DWORD _huge * lpdwIndexEntry; // I: index current ptr LPBYTE lpDOSWriteBuffer; // I: ptr to DOS buffer DWORD dwDOSBufferSize; // I: DOS buffer size // Video format DWORD dwActualMicroSecPerFrame; // I: Actual cap rate LPBITMAPINFO lpBitsInfo; // I: Video format int dxBits; // I: video size x int dyBits; // I: video size y LPSTR lpBits; // I: Single frame capture buf VIDEOHDR VidHdr; // I: Single frame header COMPVARS CompVars; // M: Set by ICCompressorChoose LPIAVERAGE lpia; // I: Image averaging struct VIDEOHDR VidHdr2x; // I: VideoHeader at 2x LPBITMAPINFOHEADER lpbmih2x; // I: lpbi at 2x // Video Buffer management BOOL fVideoDataIsCompressed; // I: if don't use dwVideoSize DWORD dwVideoSize; // I: size of non-comp buffer incl chunk DWORD dwVideoJunkSize; // I: Initial non-comp. junk size int iNumVideo; // I: Number of actual video buffers int iNextVideo; // I: index into video buffers DWORD dwFramesDropped; // I: number of frames dropped BYTE DropFrame[DROP_BUFFER_SIZE]; // I: Create a Dummy VideoHdr LPVIDEOHDR alpVideoHdr[MAX_VIDEO_BUFFERS]; // I: array of buf ptrs BOOL fBuffersOnHardware; // I: if driver all'd buffers // Palettes HPALETTE hPalCurrent; // I: handle of current pal BOOL fUsingDefaultPalette; // I: no user defined pal int nPaletteColors; // M: only changed by UI LPVOID lpCapPal; // I: LPCAPPAL manual pals // Audio Capture Format BOOL fAudioHardware; // I: if audio hardware present LPWAVEFORMATEX lpWaveFormat; // I: wave format WAVEHDR WaveHdr; // I: Wave header HWAVE hWaveIn; // I: Wave input channel DWORD dwWaveBytes; // I: Total wave bytes cap'd DWORD dwWaveSize; // I: wave buffer size // Audio Buffer management LPWAVEHDR alpWaveHdr[MAX_WAVE_BUFFERS]; // I: wave buff array int iNextWave; // I: Index into wave buffers int iNumAudio; // I: Number of actual audio buffers BOOL fAudioYield; // I: ACM audio yield required BOOL fAudioBreak; // I: Audio underflow // MCI Capture char achMCIDevice[_MAX_CAP_PATH];// MCI device name DWORD dwMCIError; // I: Last MCI error value enum mcicapstates MCICaptureState; // I: MCI State machine DWORD dwMCICurrentMS; // I: Current MCI position DWORD dwMCIActualStartMS; // I: Actual MCI start MS DWORD dwMCIActualEndMS; // I: Actual MCI end position // Output file char achFile [_MAX_CAP_PATH]; // M: name of capture file char achSaveAsFile [_MAX_CAP_PATH]; // M: name of saveas file BOOL fCapFileExists; // I: if have a capture file LONG lCapFileSize; // M: in bytes BOOL fFileCaptured; // I: if we've cap'd to file HMMIO hmmio; // I: MMIO handle for writing DWORD dwAVIHdrSize; // I: size of header DWORD dwAVIHdrPos; // I: file offset of hdr LONG lUser; // M: Data for the user LPVOID lpInfoChunks; // M: information chunks LONG cbInfoChunks; // M: sizeof information chks BOOL fLastStatusWasNULL; // I: don't repeat null msgs BOOL fLastErrorWasNULL; // I: don't repeat null msgs } CAPSTREAM; typedef CAPSTREAM FAR * LPCAPSTREAM; // ------------------------- // Full color log palette // ------------------------- typedef struct tagFCLOGPALETTE { WORD palVersion; WORD palNumEntries; PALETTEENTRY palPalEntry[256]; } FCLOGPALETTE; typedef struct { DWORD dwType; DWORD dwSize; } RIFF, *PRIFF, FAR *LPRIFF; extern HINSTANCE ghInst; extern BOOL gfIsRTL; // capinit.c BOOL CapWinDisconnectHardware(LPCAPSTREAM lpcs); BOOL CapWinConnectHardware (LPCAPSTREAM lpcs, WORD wDeviceIndex); BOOL capInternalGetDriverDesc (WORD wDriverIndex, LPSTR lpszName, int cbName, LPSTR lpszVer, int cbVer); // capwin.c LONG FAR PASCAL _loadds CapWndProc (HWND hwnd, unsigned msg, WORD wParam, LONG lParam); // capavi.c BOOL InitIndex (LPCAPSTREAM lpcs); void FiniIndex (LPCAPSTREAM lpcs); BOOL IndexVideo (LPCAPSTREAM lpcs, DWORD dwSize, BOOL bKeyFrame); BOOL IndexAudio (LPCAPSTREAM lpcs, DWORD dwSize); BOOL WriteIndex (LPCAPSTREAM lpcs, BOOL fJunkChunkWritten); DWORD GetFreePhysicalMemory(void); DWORD CalcWaveBufferSize (LPCAPSTREAM lpcs); BOOL AVIFileInit(LPCAPSTREAM lpcs); BOOL AVIFileFini (LPCAPSTREAM lpcs, BOOL fWroteJunkChunks, BOOL fAbort); WORD AVIAudioInit (LPCAPSTREAM lpcs); WORD AVIAudioFini (LPCAPSTREAM lpcs); WORD AVIAudioPrepare (LPCAPSTREAM lpcs, HWND hWndCallback); WORD AVIAudioUnPrepare (LPCAPSTREAM lpcs); WORD AVIVideoInit (LPCAPSTREAM lpcs); WORD AVIVideoPrepare (LPCAPSTREAM lpcs); WORD AVIVideoUnPrepare (LPCAPSTREAM lpcs); void AVIFini(LPCAPSTREAM lpcs); WORD AVIInit (LPCAPSTREAM lpcs); BOOL NEAR PASCAL AVIWrite(LPCAPSTREAM lpcs, LPVOID p, DWORD dwSize); BOOL AVIWriteDummyFrames (LPCAPSTREAM lpcs, int nCount); BOOL AVIWriteVideoFrame (LPCAPSTREAM lpcs, LPVIDEOHDR lpVidHdr); BOOL FAR PASCAL SetInfoChunk(LPCAPSTREAM lpcs, LPCAPINFOCHUNK lpcic); BOOL AVICapture (LPCAPSTREAM lpcs); // capfile.c BOOL FAR PASCAL fileCapFileIsAVI (LPSTR lpsz); BOOL FAR PASCAL fileAllocCapFile(LPCAPSTREAM lpcs, DWORD dwNewSize); BOOL FAR PASCAL fileSaveCopy(LPCAPSTREAM lpcs); BOOL FAR PASCAL fileSavePalette(LPCAPSTREAM lpcs, LPSTR lpszFileName); BOOL FAR PASCAL fileOpenPalette(LPCAPSTREAM lpcs, LPSTR lpszFileName); //capmisc.c WORD GetKey(BOOL fWait); void errorDriverID (LPCAPSTREAM lpcs, DWORD dwError); void FAR _cdecl statusUpdateStatus (LPCAPSTREAM lpcs, WORD wID, ...); void FAR _cdecl errorUpdateError (LPCAPSTREAM lpcs, WORD wID, ...); //capFrame.c BOOL FAR PASCAL SingleFrameCaptureOpen (LPCAPSTREAM lpcs); BOOL FAR PASCAL SingleFrameCaptureClose (LPCAPSTREAM lpcs); BOOL FAR PASCAL SingleFrameCapture (LPCAPSTREAM lpcs); BOOL SingleFrameWrite ( LPCAPSTREAM lpcs, // capture stream LPVIDEOHDR lpVidHdr, // input header BOOL FAR *pfKey, // did it end up being a key frame? LONG FAR *plSize); // size of returned image //capMCI.c void FAR PASCAL TimeMSToSMPTE (DWORD dwMS, LPSTR lpTime); int CountMCIDevicesByType ( WORD wType ); void MCIDeviceClose (LPCAPSTREAM lpcs); BOOL MCIDeviceOpen (LPCAPSTREAM lpcs); BOOL FAR PASCAL MCIDeviceGetPosition (LPCAPSTREAM lpcs, LPDWORD lpdwPos); BOOL FAR PASCAL MCIDeviceSetPosition (LPCAPSTREAM lpcs, DWORD dwPos); BOOL FAR PASCAL MCIDevicePlay (LPCAPSTREAM lpcs); BOOL FAR PASCAL MCIDevicePause (LPCAPSTREAM lpcs); BOOL FAR PASCAL MCIDeviceStop (LPCAPSTREAM lpcs); BOOL FAR PASCAL MCIDeviceStep (LPCAPSTREAM lpcs, BOOL fForward); void FAR PASCAL _loadds MCIStepCapture (LPCAPSTREAM lpcs); long FAR PASCAL muldiv32(long, long, long); #ifdef _DEBUG BOOL FAR PASCAL _Assert(BOOL f, LPSTR szFile, int iLine); #define WinAssert(exp) (_Assert(exp, (LPSTR) __FILE__, __LINE__)) extern void FAR CDECL dprintf(LPSTR, ...); #define DPF dprintf #else #define dprintf ; / ## / #define DPF ; / ## / #define WinAssert(exp) 0 #endif #ifndef RC_INVOKED #pragma pack() /* Revert to default packing */ #endif /* RC_INVOKED */ #ifdef __cplusplus } /* End of extern "C" { */ #endif /* __cplusplus */ #endif /* INC_AVICAP_INTERNAL */