103 lines
4.2 KiB
C
103 lines
4.2 KiB
C
/*----------------------------------------------------------------------+
|
|
| compress.h - Microsoft Video 1 Compressor - compress header file |
|
|
| |
|
|
| Copyright (c) 1990-1994 Microsoft Corporation. |
|
|
| Portions Copyright Media Vision Inc. |
|
|
| All Rights Reserved. |
|
|
| |
|
|
| You have a non-exclusive, worldwide, royalty-free, and perpetual |
|
|
| license to use this source code in developing hardware, software |
|
|
| (limited to drivers and other software required for hardware |
|
|
| functionality), and firmware for video display and/or processing |
|
|
| boards. Microsoft makes no warranties, express or implied, with |
|
|
| respect to the Video 1 codec, including without limitation warranties |
|
|
| of merchantability or fitness for a particular purpose. Microsoft |
|
|
| shall not be liable for any damages whatsoever, including without |
|
|
| limitation consequential damages arising from your use of the Video 1 |
|
|
| codec. |
|
|
| |
|
|
| |
|
|
+----------------------------------------------------------------------*/
|
|
|
|
/*******************************************************************
|
|
|
|
encoding a skip - if the mask (first word) has the high bit set
|
|
then it is either a skip cell code, or a solid color code.
|
|
|
|
you can't encode a r=01 solid color, this is how we tell a skip
|
|
from a solid (not a big loss)
|
|
|
|
*******************************************************************/
|
|
#define SKIP_MAX SKIP_MASK
|
|
#define SKIP_MASK ((WORD) (((1<<10)-1)))
|
|
#define MAGIC_MASK ~SKIP_MASK
|
|
#define SKIP_MAGIC 0x8400 // r=01
|
|
#define SOLID_MAGIC 0x8000
|
|
#define MASK_MAGIC 0xA000
|
|
|
|
/*******************************************************************
|
|
*******************************************************************/
|
|
|
|
extern DWORD numberOfBlocks;
|
|
extern DWORD numberOfSolids;
|
|
extern DWORD numberOfSolid4;
|
|
extern DWORD numberOfEdges;
|
|
extern DWORD numberOfSkips;
|
|
extern DWORD numberOfSkipCodes;
|
|
|
|
/*******************************************************************
|
|
*******************************************************************/
|
|
|
|
//
|
|
// this is a CELL (4x4) array of RGBQUADs
|
|
//
|
|
typedef RGBQUAD CELL[HEIGHT_CBLOCK * WIDTH_CBLOCK];
|
|
typedef RGBQUAD *PCELL;
|
|
|
|
typedef struct _CELLS {
|
|
CELL cell;
|
|
CELL cellT;
|
|
CELL cellPrev;
|
|
} CELLS;
|
|
typedef CELLS * PCELLS;
|
|
|
|
/*******************************************************************
|
|
routine: CompressFrame
|
|
purp: compress a frame
|
|
returns: number of bytes in compressed buffer
|
|
*******************************************************************/
|
|
|
|
DWORD FAR CompressFrame16(LPBITMAPINFOHEADER lpbi, // DIB header to compress
|
|
LPVOID lpBits, // DIB bits to compress
|
|
LPVOID lpData, // put compressed data here
|
|
DWORD threshold, // edge threshold
|
|
DWORD thresholdInter, // inter-frame threshold
|
|
LPBITMAPINFOHEADER lpbiPrev, // previous frame
|
|
LPVOID lpPrev, // previous frame
|
|
LONG (CALLBACK *Status) (LPARAM lParam, UINT message, LONG l),
|
|
LPARAM lParam,
|
|
PCELLS pCells);
|
|
|
|
DWORD FAR CompressFrame8(LPBITMAPINFOHEADER lpbi, // DIB header to compress
|
|
LPVOID lpBits, // DIB bits to compress
|
|
LPVOID lpData, // put compressed data here
|
|
DWORD threshold, // edge threshold
|
|
DWORD thresholdInter, // inter-frame threshold
|
|
LPBITMAPINFOHEADER lpbiPrev, // previous frame
|
|
LPVOID lpPrev, // previous frame
|
|
LONG (CALLBACK *Status) (LPARAM lParam, UINT message, LONG l),
|
|
LPARAM lParam,
|
|
PCELLS pCells,
|
|
LPBYTE lpITable,
|
|
RGBQUAD *prgbqOut);
|
|
|
|
|
|
DWORD FAR CompressFrameBegin(LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut,
|
|
LPBYTE *lplpITable, RGBQUAD *prgbIn);
|
|
DWORD FAR CompressFrameEnd(LPBYTE *lplpITable);
|
|
|
|
void FAR CompressFrameFree(void);
|
|
|
|
DWORD FAR QualityToThreshold(DWORD dwQuality);
|
|
|