339 lines
14 KiB
C
339 lines
14 KiB
C
/****************************************************************************
|
||
*
|
||
* 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 <mmreg.h>
|
||
#include <compman.h>
|
||
#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 */
|
||
|
||
|