windows-nt/Source/XPSP1/NT/multimedia/media/avi/inc.16/mrci.inc
2020-09-26 16:20:57 +08:00

281 lines
11 KiB
PHP

;----------------------------------------------------------------------------
; MRCI.INC - Microsoft Real-Time Compression Interface definitions
;
; Microsoft Confidential
; Copyright (C) Microsoft Corporation 1992
; All Rights Reserved.
;
; History:
; 18-Jul-92 bens Initial version.
; 25-Jul-92 billkru Adapted for use by MS-Flash & ROMDOS environment.
;----------------------------------------------------------------------------
intMRCIROM equ 1Ah ; ROM MRCI interrupt number
mrciDETECTROM equ 0B001h ; ROM intMRCI AX for detecting MRCI server
intMRCI equ 2Fh ; MRCI interrupt number
mrciDETECT equ 4a12h ; intMRCI AX for detecting MRCI server
mrciBackPatch equ 4a13h
;----------------------------------------------------------------------------
; sigOLD_CX, sigOLD_DX, sigNEW_CX, sigNEW_DX - MRCI Server detection
;
; These values are used to verify that the response from issuing
; intMRCI is coming from an MRCI server, and not some other piece
; of code.
;
; The *old* values are passed on the mrciQUERY call, and the server
; must change CX/DX to the *new* values, so that the caller can
; trust that the MRCI server was responding, and not some other
; interrupt hooker.
;
; The Server uses this code sequence to transform CX/DX:
;
; ;------------- entry: cx='ab' dx='cd'
; xchg ch,cl ; cx='ba' dx='cd'
; xchg dh,dl ; cx='ba' dx='dc'
; xchg dx,cx ; cx='dc' dx='ba'
;----------------------------------------------------------------------------
sigOLD_CX equ 'MR'
sigOLD_DX equ 'CI'
sigNEW_CX equ 'IC'
sigNEW_DX equ 'RM'
;----------------------------------------------------------------------------
; mcXXXX - flag values passed to MRCI operations
;
; MRCCompress and MRCDecompress take a flag to indicate whether the
; client is a *system* component (and hence may call with InDOS
; set), or an *application*.
;
; If a system client calls MRCCompress/MRCDecompress with mcSYSTEM,
; then it is the clients responsibility to ensure that one of the
; following is true:
; 1) InDOS is set
; 2) The call is made at interrupt time.
;
; FAILING TO FOLLOW THE ABOVE RULE WILL LIKELY RESULT IN A SYSTEM
; HANG AND LOSS OF USER DATA.
;----------------------------------------------------------------------------
mcAPPLICATION equ 0 ; Client is an application
mcSYSTEM equ 1 ; Client is a file system driver
;----------------------------------------------------------------------------
; MRCI Server Busy flag values
;----------------------------------------------------------------------------
MRCI_SERVER_IDLE equ 0
;----------------------------------------------------------------------------
; MRCINFO - MRC Information data structure
;
; A pointer to an MRCINFO structure is returned from MRCQuery, and sent
; on MRCNotifyLoad. This structure contains information on the MRCI
; server and its capabilities.
;----------------------------------------------------------------------------
MRCINFO struc
mi_lVendor dd ? ; A 4-byte vendor ID.
; Microsoft's vendor ID is "MSFT".
mi_wVendorVersion dw ? ; Version number of the MRC server.
; High byte is major number, low byte is minor.
; EXAMPLES: v3.20 = 0314h, v10.01 = 0A01h
mi_wMRCIVersion dw ? ; Version number of the MRCI supported by
; this server.
mi_pfnOperate dd ? ; Far pointer of the server compression entry
; point.
mi_flCapability dw ? ; Bit field of server capabilities
; See micapXXX for bit definitions
mi_flHWAssist dw ? ; Bit field of hardware assisted
; server capabilities. One-to-one
; correspondance with mi_flCapability
; bits. A bit set in this field
; indicates the corresponding
; capability is hardware assisted.
mi_cbMax dw ? ; Maximum number of bytes that the compression
; services provider can compress or decompress.
; Requests to compress or decompress buffers in
; excess of this length will fail.
; All MRCI servers must support at least
; 8192 byte (8Kb) blocks.
MRCINFO ends
;----------------------------------------------------------------------------
; micapXXXXX - bit flags for MRCINFO.mi_flCapabilities
;
; These define both the capabilities of the Server, and also double
; as *operation* codes passed to the mi_pfnOperate entry point in
; the server.
; 111111
; 5432109876543210
;----------------------------------------------------------------------------
micapNONE equ 0000000000000000b ; No capabilities
micapSTANDARD equ 0000000000000001b ; Standard compress
micapDECOMPRESS equ 0000000000000010b ; Standard compress
micapUPDATE equ 0000000000000100b ; Update compress
micapSUPER equ 0000000000001000b ; SuperCompress(tm)
micapSUPERUPDATE equ 0000000000010000b ; Update SuperCompress(tm)
micapINCDECOMP equ 0000000000100000b ; Incremental Decompress
; Remaining bits (6..14) are RESERVED and must be 0
micapREADONLY equ 1000000000000000b ; MRCINFO structure is read-only
micapDEINSTALL equ 1111111111111111b ; Server deinstall service
;----------------------------------------------------------------------------
; MRCREQUEST - MRC compress/decompress Request packet
;
; This structure is used to pass parameters to the server for
; compress/decompress operations.
;
; General Notes
; -------------
; 1) <mr_pbSrc,mr_cbSrc> and <mr_pbDst,mr_cbDst> MUST NOT OVERLAP!
;
; 2) The safest practice is for mr_cbSrc and mr_cbDst to be identical
; (except for decompress where mr_cbSrc is ignored and mr_cbDst is
; the count of bytes to uncompress).
;
; Details on Structure Members
; ----------------------------
; mr_pbSrc
; This points to the *source* buffer.
;
; On a *compress* operation, the contents of this buffer are
; *uncompressed* data.
;
; On an *update* operation, the contents of this buffer starting
; at offset mr_offUpdate is valid, uncompressed data. The contents
; from the start of the buffer to the byte just prior to
; mr_OffUpdate are ignored.
;
; On a *decompress* operation, the contents of this buffer are
; *compressed* data.
;
; mr_cbSrc
; This is the size of the *source* buffer.
;
; This is the amount of data to be compressed or decompressed.
; NOTE: For a decompress operation, this value may be ignored
; by many implentations, since the MRC Format encoding has
; a special code to indicate the end of the compressed data.
;
; mr_offUpdate
; NOTE: This is used for Update(Super)Compress only.
;
; On INPUT, this is the offset (same segment as mr_pbSrc) in the
; *source* buffer where the changed uncompressed data starts.
;
; On OUTPUT, this is the offset (same segment as mr_pbDst) in the
; *destination* buffer where the changed compressed data starts.
;
; mr_pbDst
; This points to the *destination* buffer.
;
; On a *compress* operation, this buffer receives the *compressed*
; result of the operation.
;
; On an *update* operation, the contents of this buffer MUST be
; the compressed representation of the uncompressed data in the
; *source* buffer. After the operation is completed, this buffer
; receives the *compressed* result of the operation.
;
; On a *decompress* operation, this buffer receives the
; *uncompressed* result of the operation.
;
; mr_cbDst
; On a *compress* operation and on INPUT, this is the size of
; the *destination* buffer. If, during the operation, the
; Server would overflow this buffer length, then the operation
; fails and the server returns the error MRCI_ERROR_BUFFER_OVERFLOW.
;
; On a *decompress* operation and on INPUT, this is what the
; *decompressed* size should be. If, during the operation, the
; Server would overflow this length, then the operation fails
; and the server returns the error MRCI_ERROR_BUFFER_OVERFLOW.
;
; On OUTPUT, the Server updates this field with the actual size
; of the resulting compressed/uncompressed data.
;
; mr_cbChunk
; This is information that the Server compress routines can use to
; "early out" of the compression as early as possible.
;
; Valid values are 1 (client is interested in savings as small as
; 1 byte) to 32767. DblSpace passes 512, and MS-Flash passes 1.
;
; This field is most easily explained by giving an example:
;
; Example:
; DblSpace does space allocation in chunks of 512 bytes (the
; common sector size on a disk).
;
; The compression server can use this information for two
; optimizations:
;
; 1) If the Server cannot compress the uncompressed data
; enough to save at least 512 bytes, then the data is
; *incompressible* as far as DblSpace is concerned, even
; if it could be compressed to save fewer than 512 bytes.
;
; 2) While compressing, if the Server gets to a point where
; the remaining uncompressed data is of such a length that
; it can be encoded simply (without table lookups, etc.)
; and not cross a 512 byte boundary, then the Server can
; do the simple encoding.
;
; It is likely that these optimizations will be hard to perform
; quickly in software, but it is possible that hardware can do
; these optimizations without any performance loss.
;----------------------------------------------------------------------------
MRCREQUEST struc
mr_pbSrc dd ? ; Pointer to source buffer
mr_cbSrc dw ? ; Size of source buffer, in bytes
mr_offUpdate dw ? ; For UpdateCompress only: offset of (source) destination
; buffer where changed (un)compressed data starts.
mr_pbDst dd ? ; Pointer to destination buffer
mr_cbDst dw ? ; Size of destination buffer, in bytes
mr_cbChunk dw ? ; Client compressed data storage chunk size (see above!)
mr_dwIncDecomp dd ? ; Incremental Decompression state
MRCREQUEST ends
;----------------------------------------------------------------------------
; MRCI_ERROR_XXX definitions
;
; Error codes returned from a request
;----------------------------------------------------------------------------
MRCI_ERROR_NONE equ 0 ; No error
MRCI_ERROR_NOT_SUPPORTED equ 1 ; Unsupported operation requested
MRCI_ERROR_BUSY equ 2 ; Server is busy
MRCI_ERROR_BUFFER_OVERFLOW equ 3 ; Destination buffer too small
MRCI_ERROR_NOT_COMPRESSIBLE equ 4 ; Data could not be compressed
MRCI_ERROR_BAD_MRC_FORMAT equ 5 ; Compressed data format is bad
;---------------------------------------------------------------------------
; DblSpace MRCI Server constants
;---------------------------------------------------------------------------
MRCIVERSION equ 0100h ; MRCI version supported by this server
MYVERSION equ 0100h ; Version of this server/driver
MYVENDOR equ 5446534Dh ; "MSFT" (reversed for byte ordering)
MYVENDORhi equ 5446h ; High word of MYVENDOR
MYVENDORlo equ 534Dh ; Low word of MYVENDOR
; Max buffer size set to 32k to avoid problems with compression code and
; buffer offsets near 0E000h. See comments in rcomp.asm for details.
MYCBMAX equ (32*1024) ; Maximum compression buffer size
; This server's capabilities.
micapMINE = micapSTANDARD or micapDECOMPRESS or micapINCDECOMP
MYHWASSIST equ 0 ;we have no hardware assist