/* * @DEC_COPYRIGHT@ */ /* * HISTORY * $Log: SC.h,v $ * Revision 1.1.8.10 1996/12/03 23:15:11 Hans_Graves * Added ScBSBufferedBytes() macros. * [1996/12/03 23:11:06 Hans_Graves] * * Revision 1.1.8.9 1996/11/13 16:10:47 Hans_Graves * Addition of ScBitstreamSave_t. * [1996/11/13 15:58:26 Hans_Graves] * * Revision 1.1.8.8 1996/11/08 21:50:36 Hans_Graves * Protos fixed for use with C++. Added bitstream protos for AC3. * [1996/11/08 21:17:23 Hans_Graves] * * Revision 1.1.8.7 1996/10/28 17:32:20 Hans_Graves * MME-01402. Added TimeStamp support to Callbacks. * [1996/10/28 16:56:21 Hans_Graves] * * Revision 1.1.8.6 1996/10/12 17:18:11 Hans_Graves * Added ScImageSize(). * [1996/10/12 16:53:38 Hans_Graves] * * Revision 1.1.8.5 1996/09/18 23:45:46 Hans_Graves * Added ScFileClose() proto; ISIZE() macro * [1996/09/18 23:37:33 Hans_Graves] * * Revision 1.1.8.4 1996/08/20 22:11:48 Bjorn_Engberg * For NT - Made several routines public to support JV3.DLL and SOFTJPEG.DLL. * [1996/08/20 21:53:23 Bjorn_Engberg] * * Revision 1.1.8.3 1996/05/24 22:21:27 Hans_Graves * Added ScPatScaleIDCT8x8i_S proto * [1996/05/24 21:56:31 Hans_Graves] * * Revision 1.1.8.2 1996/05/07 19:55:49 Hans_Graves * Added BI_DECHUFFDIB * [1996/05/07 17:24:17 Hans_Graves] * * Revision 1.1.6.9 1996/04/17 16:38:36 Hans_Graves * Change NT bitstream buffer sizes from 32 to 64-bit * [1996/04/17 16:37:04 Hans_Graves] * * Revision 1.1.6.8 1996/04/15 21:08:39 Hans_Graves * Define ScBitBuff_t and ScBitString_t as dword or qword * [1996/04/15 21:05:46 Hans_Graves] * * Revision 1.1.6.7 1996/04/10 21:47:16 Hans_Graves * Added definition for EXTERN * [1996/04/10 21:23:23 Hans_Graves] * * Revision 1.1.6.6 1996/04/09 16:04:32 Hans_Graves * Added USE_C ifdef. * [1996/04/09 14:48:04 Hans_Graves] * * Revision 1.1.6.5 1996/04/01 16:23:09 Hans_Graves * NT porting * [1996/04/01 16:15:48 Hans_Graves] * * Revision 1.1.6.4 1996/03/20 22:32:46 Hans_Graves * {** Merge Information **} * {** Command used: bsubmit **} * {** Ancestor revision: 1.1.6.2 **} * {** Merge revision: 1.1.6.3 **} * {** End **} * Added protos for IDCT1x1,1x2,2x1,2x2,3x3,4x4,6x6 * [1996/03/20 22:25:47 Hans_Graves] * * Revision 1.1.6.3 1996/03/16 19:22:51 Karen_Dintino * added NT port changes * [1996/03/16 19:20:07 Karen_Dintino] * * Revision 1.1.6.2 1996/03/08 18:46:27 Hans_Graves * Added proto for ScScaleIDCT8x8m_S() * [1996/03/08 18:41:45 Hans_Graves] * * Revision 1.1.4.14 1996/02/07 23:23:50 Hans_Graves * Added prototype for ScFileSeek() * [1996/02/07 23:18:32 Hans_Graves] * * Revision 1.1.4.13 1996/02/01 17:15:50 Hans_Graves * Added ScBSSkipBitsFast() and ScBSPeekBitsFast() macros * [1996/02/01 17:14:17 Hans_Graves] * * Revision 1.1.4.12 1996/01/24 19:33:18 Hans_Graves * Added prototype for ScScaleIDCT8x8i_S * [1996/01/24 18:13:51 Hans_Graves] * * Revision 1.1.4.11 1996/01/08 20:15:13 Bjorn_Engberg * Added one more cast to avoid warnings. * [1996/01/08 20:14:55 Bjorn_Engberg] * * Revision 1.1.4.10 1996/01/08 16:41:21 Hans_Graves * Added protos for more IDCT routines. * [1996/01/08 15:44:17 Hans_Graves] * * Revision 1.1.4.9 1996/01/02 18:31:13 Bjorn_Engberg * Added casts to avoid warning messages when compiling. * [1996/01/02 15:02:16 Bjorn_Engberg] * * Revision 1.1.4.8 1995/12/07 19:31:18 Hans_Graves * Added protos for ScFDCT8x8s_C() and ScIDCT8x8s_C(), Added ScBSAlignPutBits() macro. * [1995/12/07 17:58:36 Hans_Graves] * * Revision 1.1.4.7 1995/11/16 12:33:34 Bjorn_Engberg * Add BI_BITFIELDS to IsRGBPacked macro * [1995/11/16 12:33:17 Bjorn_Engberg] * * Revision 1.1.4.6 1995/10/13 21:01:42 Hans_Graves * Added macros for format classes. * [1995/10/13 20:59:15 Hans_Graves] * * Revision 1.1.4.5 1995/09/22 19:41:00 Hans_Graves * Moved ValidBI_BITFIELDSKinds to SC_convert.h * [1995/09/22 19:40:42 Hans_Graves] * * Revision 1.1.4.4 1995/09/20 18:27:59 Hans_Graves * Added Bjorn's NT defs * [1995/09/15 13:21:00 Hans_Graves] * * Revision 1.1.4.3 1995/09/14 12:35:22 Hans_Graves * Added ScCopyClipToPacked422() prototypes. * [1995/09/14 12:34:58 Hans_Graves] * * Revision 1.1.4.2 1995/09/13 14:51:45 Hans_Graves * Added ScScaleIDCT8x8(). Added buffer Type to queues. * [1995/09/13 14:29:10 Hans_Graves] * * Revision 1.1.2.18 1995/09/11 19:17:23 Hans_Graves * Moved ValidateBI_BITFIELDS() prototype to SC_convert.h - Removed mmsystem.h include. * [1995/09/11 19:14:27 Hans_Graves] * * Revision 1.1.2.17 1995/09/11 18:51:25 Farokh_Morshed * Support BI_BITFIELDS format * [1995/09/11 18:50:48 Farokh_Morshed] * * Revision 1.1.2.16 1995/08/31 14:15:43 Farokh_Morshed * transfer BI_BITFIELDS stuff to SV.h * [1995/08/31 14:15:20 Farokh_Morshed] * * Revision 1.1.2.15 1995/08/31 13:51:53 Farokh_Morshed * {** Merge Information **} * {** Command used: bsubmit **} * {** Ancestor revision: 1.1.2.13 **} * {** Merge revision: 1.1.2.14 **} * {** End **} * Add BI_BITFIELDS support * [1995/08/31 13:50:46 Farokh_Morshed] * * Revision 1.1.2.14 1995/08/29 22:17:05 Hans_Graves * Fixed-up Bitstream prototypes. Added BI_ image formats and defined BI_DECSEPYUV411DIB == BI_YU12SEP * [1995/08/29 22:15:27 Hans_Graves] * * Revision 1.1.2.13 1995/08/14 19:40:26 Hans_Graves * Added Flush, ScCopySubClip_S() and ScCopyRev_S() prototypes. * [1995/08/14 18:43:11 Hans_Graves] * * Revision 1.1.2.12 1995/07/21 17:41:01 Hans_Graves * Mirrored Callbacks with MME structure/naming. * [1995/07/21 17:30:04 Hans_Graves] * * Revision 1.1.2.11 1995/07/17 22:01:31 Hans_Graves * Added BufSize and BufType to ScCallback_t. * [1995/07/17 21:42:45 Hans_Graves] * * Revision 1.1.2.10 1995/07/12 19:48:23 Hans_Graves * Added H261_FILE type. * [1995/07/12 19:33:18 Hans_Graves] * * Revision 1.1.2.9 1995/07/11 15:24:30 Hans_Graves * Fixed ScCopySubClip and ScCopyRev macros. * [1995/07/11 15:24:09 Hans_Graves] * * Revision 1.1.2.8 1995/07/11 14:50:44 Hans_Graves * Added prototypes for sc_mc2.s and sc_copy2.s * [1995/07/11 14:23:18 Hans_Graves] * * Revision 1.1.2.7 1995/06/27 13:54:21 Hans_Graves * Added STREAM_USE_NET and prototype for ScBSCreateFromNet() * [1995/06/26 21:00:17 Hans_Graves] * * Revision 1.1.2.6 1995/06/22 21:35:03 Hans_Graves * Moved filetypes from SV.h to here * [1995/06/22 21:29:11 Hans_Graves] * * Revision 1.1.2.5 1995/06/21 18:37:58 Hans_Graves * Added prototype for ScBSPutBytes() * [1995/06/21 18:36:43 Hans_Graves] * * Revision 1.1.2.4 1995/06/15 21:17:59 Hans_Graves * Added prototypes for sc_copy.c * [1995/06/15 20:41:40 Hans_Graves] * * Revision 1.1.2.3 1995/06/01 19:35:36 Hans_Graves * Added prototype for ScCopyClip() * [1995/06/01 19:31:28 Hans_Graves] * * Revision 1.1.2.2 1995/05/31 18:09:20 Hans_Graves * Inclusion in new SLIB location. * [1995/05/31 15:17:35 Hans_Graves] * * Revision 1.1.2.2 1995/05/03 19:26:38 Hans_Graves * Included in SLIB (Oct 95) * [1995/05/03 19:26:26 Hans_Graves] * * Revision 1.1.2.3 1995/04/17 18:04:26 Hans_Graves * Added math prototypes and defs. Expanding Bitstream defs. * [1995/04/17 18:02:16 Hans_Graves] * * Revision 1.1.2.2 1995/04/07 19:18:43 Hans_Graves * Inclusion in SLIB * [1995/04/07 19:04:13 Hans_Graves] * * $EndLog$ */ /***************************************************************************** ** Copyright (c) Digital Equipment Corporation, 1995 ** ** ** ** All Rights Reserved. Unpublished rights reserved under the copyright ** ** laws of the United States. ** ** ** ** The software contained on this media is proprietary to and embodies ** ** the confidential technology of Digital Equipment Corporation. ** ** Possession, use, duplication or dissemination of the software and ** ** media is authorized only pursuant to a valid written license from ** ** Digital Equipment Corporation. ** ** ** ** RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure by the U.S. ** ** Government is subject to restrictions as set forth in Subparagraph ** ** (c)(1)(ii) of DFARS 252.227-7013, or in FAR 52.227-19, as applicable. ** ******************************************************************************/ #ifndef _SC_H_ #define _SC_H_ #define SLIB_VERSION 0x300 /************************* Debug Handling ***********************/ #ifdef _VERBOSE_ #define sc_vprintf printf #else #define sc_vprintf #endif #ifdef _DEBUG_ #define sc_dprintf printf #else #define sc_dprintf #endif #ifdef _TEST_ #define sc_tprintf(test, msg) if (test) printf(msg) #else #define sc_tprintf #endif #ifdef _SLIBDEBUG_ #define _SlibDebug(test, statements) { if (test) { statements; } } #else #define _SlibDebug(test, statements) #endif #ifndef EXTERN #ifdef __cplusplus #if !defined(WIN32) || defined(STATIC_BUILD) #define EXTERN extern "C" #else #define EXTERN __declspec( dllexport ) extern "C" #endif #else #if !defined(WIN32) || defined(STATIC_BUILD) #define EXTERN extern #else #define EXTERN __declspec( dllexport ) extern #endif #endif /* __cplusplus */ #endif /* EXTERN */ #ifndef PRIVATE_EXTERN #ifdef __cplusplus #define PRIVATE_EXTERN extern "C" #else /* __cplusplus */ #define PRIVATE_EXTERN extern #endif /* __cplusplus */ #endif /* PRIVATE_EXTERN */ #ifdef WIN32 /* * These b* routines are mem* routines on NT. */ #define bcopy(_src_,_dst_,_len_) memcpy(_dst_,_src_,_len_) #define bzero(_dst_,_len_) memset(_dst_,0,_len_) #define bcmp(_src_,_dst_,_len_) memcmp(_src_,_dst_,_len_) /* * These cma routines are doing nothing for NT. * Avoid lots of ifdefs on the code by defining * null macros for them. */ #define cma_mutex_lock(foo) #define cma_mutex_unlock(foo) #endif /* WIN32 */ /************************* Elementary Types ***********************/ #ifndef UNALIGNED #if defined(WIN95) || defined(INTEL) #define UNALIGNED #else #define UNALIGNED __unaligned #endif #endif #ifndef u_char #if defined( __VMS ) || defined( WIN32 ) typedef unsigned char u_char; /* 8 bits */ typedef unsigned short u_short; /* 16 bits */ typedef unsigned int u_int; /* 32 bits */ typedef unsigned long u_long; /* 32 bits */ #else typedef unsigned char u_char; /* 8 bits */ typedef unsigned short u_short; /* 16 bits */ typedef unsigned int u_int; /* 32 bits */ typedef unsigned long u_long; /* 64 bits */ #endif #endif /* u_char */ #ifndef WIN32 #ifndef byte /* 8 bit */ #define byte char #endif #endif /* !WIN32 */ #ifndef word /* 16 bit */ #define word short #endif /* word */ #ifndef dword /* 32 bit */ #define dword int #endif /* dword */ #ifndef qword /* 64 bit */ #if defined(__VMS) || defined(WIN32) #define qword _int64 #else #define qword long #endif #endif /* qword */ #define MIN_WORD ((-32767)-1) #define MAX_WORD ( 32767) #define MIN_DWORD ((-2147483647)-1) #define MAX_DWORD ( 2147483647) /************************** Definitions ****************************/ #define RETURN_ON_ERROR(A) {if (A) return (A);} #ifndef NULL #define NULL 0L #endif #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif #ifndef WIN32 #ifndef FAR #define FAR #endif #endif #ifndef PI #define PI 3.14159265358979 #define PI4 PI/4 #define PI64 PI/64 #endif /* ** public parameter settings */ /* Algorithm Flags - video */ #define PARAM_ALGFLAG_HALFPEL 0x0001 /* Half pixel accuracy */ #define PARAM_ALGFLAG_SKIPPEL 0x0002 /* Skip-pixel error calculation */ #define PARAM_ALGFLAG_PB 0x0004 /* PB frame encoding */ #define PARAM_ALGFLAG_SAC 0x0008 /* Syntax Arithmetic Coding */ #define PARAM_ALGFLAG_UMV 0x0010 /* Unrestricted Motion Vectors */ #define PARAM_ALGFLAG_ADVANCED 0x0020 /* Advanced Prediction Mode */ /* Algorithm Flags - audio */ #define PARAM_ALGFLAG_VAD 0x1000 /* Voice Activity Detection (G.723) */ /* Format Extensions */ #define PARAM_FORMATEXT_RTPA 0x0001 /* RTP Mode A */ #define PARAM_FORMATEXT_RTPB 0x0002 /* RTP Mode B */ #define PARAM_FORMATEXT_RTPC 0x0004 /* RTP Mode C */ /* Frame types */ #define FRAME_TYPE_NONE 0x0000 #define FRAME_TYPE_I 0x0001 /* Key frame */ #define FRAME_TYPE_P 0x0002 /* Partial frame */ #define FRAME_TYPE_B 0x0004 /* Bi-directional frame */ #define FRAME_TYPE_D 0x0008 /* Preview frame */ /************************** Formats (FOURCC's) ***************************/ /* ** Image formats */ #define BI_MSH261DIB mmioFOURCC('M','2','6','1') #define BI_MSH263DIB mmioFOURCC('M','2','6','3') #define BI_DECH261DIB mmioFOURCC('D','2','6','1') #define BI_DECH263DIB mmioFOURCC('D','2','6','3') #define BI_DECJPEGDIB mmioFOURCC('J','P','E','G') #define BI_DECMJPGDIB mmioFOURCC('M','J','P','G') #define BI_DECYUVDIB mmioFOURCC('D','Y','U','V') #define BI_DECXIMAGEDIB mmioFOURCC('D','X','I','M') #define BI_DECSEPYUVDIB mmioFOURCC('D','S','Y','U') #define BI_DECMPEGDIB mmioFOURCC('D','M','P','G') #define BI_DECHUFFDIB mmioFOURCC('D','H','U','F') #define BI_DECSEPRGBDIB mmioFOURCC('D','S','R','G') #define BI_DECGRAYDIB mmioFOURCC('D','G','R','Y') #define BI_YVU9SEP mmioFOURCC('Y','V','U','9') #define BI_YU12SEP mmioFOURCC('Y','U','1','2') #define BI_YU16SEP mmioFOURCC('Y','U','1','6') #define BI_DECSEPYUV411DIB mmioFOURCC('Y','U','1','2') #define BI_S422 mmioFOURCC('S','4','2','2') #define BI_YUY2 mmioFOURCC('Y','U','Y','2') /* * FYI - Other image formats that are defined elsewhere: */ #if 0 #define BI_RGB 0 #define BI_BITFIELDS 3 #define BICOMP_JFIF mmioFOURCC('J','F','I','F') #endif /* * Macros to identify classes of image formats. */ #define IsJPEG(s) (((s) == JPEG_DIB) || \ ((s) == MJPG_DIB)) #define IsYUV422Packed(s) (((s) == BI_DECYUVDIB) || \ ((s) == BI_S422) || \ ((s) == BI_YUY2)) #define IsYUV422Sep(s) (((s) == BI_DECSEPYUVDIB) || \ ((s) == BI_YU16SEP)) #define IsYUV411Sep(s) (((s) == BI_DECSEPYUV411DIB) || \ ((s) == BI_YU12SEP)) #define IsYUV1611Sep(s) (((s) == BI_YVU9SEP)) #define IsYUVSep(s) ((IsYUV422Sep(s)) || \ (IsYUV411Sep(s)) || \ (IsYUV1611Sep(s))) #define IsYUV(s) ((IsYUV422Packed(s)) || \ (IsYUVSep(s))) #define IsRGBPacked(s) (((s) == BI_RGB) || \ ((s) == BI_DECXIMAGEDIB) || \ ((s) == BI_BITFIELDS)) #define IsRGBSep(s) (((s) == BI_DECSEPRGBDIB)) #define IsRGB(s) ((IsRGBPacked(s)) || \ (IsRGBSep(s))) #define IsGray(s) (((s) == BI_DECGRAYDIB)) #define ISIZE(w,h,c) \ (IsYUV411Sep(c)) ? ((w) * (h) * 3 / 2) : \ ((IsYUV1611Sep(c)) ? \ ((w) * (h) * 9 / 8) : \ ((IsYUV422Sep(c) || IsYUV422Packed(c)) ? \ ((w) * (h) * 2) : ((w) * (h) * 3))); /* ** File Types (returned from ScGetFileType) */ #define UNKNOWN_FILE 0 #define AVI_FILE 201 #define MPEG_VIDEO_FILE 202 #define MPEG_AUDIO_FILE 203 #define MPEG_SYSTEM_FILE 204 #define JFIF_FILE 205 #define QUICKTIME_JPEG_FILE 206 #define GSM_FILE 207 #define WAVE_FILE 208 #define PCM_FILE 209 #define H261_FILE 210 #define AC3_FILE 211 /* ** Callback messages */ #define CB_RELEASE_BUFFER 1 /* buffer finished */ #define CB_END_BUFFERS 2 /* no more buffers */ #define CB_RESET_BUFFERS 3 /* reset to beginning */ #define CB_SEQ_HEADER 4 /* sequence header */ #define CB_SEQ_END 5 /* sequence end */ #define CB_FRAME_FOUND 6 /* frame found */ #define CB_FRAME_READY 7 /* frame completed */ #define CB_FRAME_START 8 /* frame starting to be processed */ #define CB_PROCESSING 9 /* processing data */ #define CB_CODEC_DONE 10 /* codec done ended */ /* ** Data types for callback message */ #define CB_DATA_NONE 0x0000 /* no data */ #define CB_DATA_COMPRESSED 0x0001 /* data is compressed */ #define CB_DATA_IMAGE 0x0002 /* data is decompressed image */ #define CB_DATA_AUDIO 0x0004 /* data is decompressed audio */ /* ** Frame flags for callback message */ #define CB_FLAG_TYPE_KEY 0x0001 /* key frame */ #define CB_FLAG_TYPE_MPEGB 0x0002 /* MPEG B-Frame */ #define CB_FLAG_FRAME_DROPPED 0x0008 /* frame dropped */ #define CB_FLAG_FRAME_BAD 0x0010 /* could not de/compress */ /* ** Action values in response to callback message */ #define CB_ACTION_WAIT 0x0000 /* wait - callback still busy */ #define CB_ACTION_CONTINUE 0x0001 /* accept a frame */ #define CB_ACTION_DROP 0x0002 /* drop a frame */ #define CB_ACTION_DUPLICATE 0x0004 /* duplicate a frame */ #define CB_ACTION_END 0x0080 /* end de/compression */ /* These are old definitions #define CLIENT_CONTINUE CB_ACTION_CONTINUE #define CLIENT_ABORT CB_ACTION_END #define CLIENT_PROCESS CB_ACTION_CONTINUE #define CLIENT_DROP CB_ACTION_DROP #define CB_IMAGE_BUFFER_READY CB_FRAME_READY #define CB_PICTURE_FOUND CB_FRAME_FOUND #define CB_PICTURE_PROCEESSED CB_FRAME_READY #define CB_FRAME CB_FRAME_FOUND */ /* * Stream sources/destinations */ #define STREAM_USE_SAME -1 #define STREAM_USE_NULL 0 #define STREAM_USE_QUEUE 1 #define STREAM_USE_FILE 2 #define STREAM_USE_BUFFER 3 #define STREAM_USE_DEVICE 4 #define STREAM_USE_STDOUT 5 #define STREAM_USE_NET 6 #define STREAM_USE_NET_TCP 6 /* reliable transport */ #define STREAM_USE_NET_UDP 7 /* unreliable transport */ /************************** Type Definitions *******************************/ typedef int ScStatus_t; typedef void *ScHandle_t; typedef unsigned char ScBoolean_t; #if !defined( _VMS ) && !defined( WIN32 ) typedef long _int64; #endif /* ** Bitstream stuff */ #if defined( _VMS ) || defined( WIN95 ) #define SC_BITBUFFSZ 32 typedef unsigned dword ScBitBuff_t; typedef unsigned dword ScBitString_t; #else #define SC_BITBUFFSZ 64 typedef unsigned qword ScBitBuff_t; typedef unsigned qword ScBitString_t; #endif #define SC_BITBUFFMASK (ScBitBuff_t)-1 #define ALIGNING 8 #define ScBSPreLoad(bs, bits) if ((int)bs->shift<(bits)) sc_BSLoadDataWord(bs); #define ScBSPreLoadW(bs, bits) if ((int)bs->shift<(bits)) sc_BSLoadDataWordW(bs); #define ScBSByteAlign(bs) { \ int len=bs->shift%8; \ if (len) { \ bs->OutBuff=(bs->OutBuff<InBuff>>(SC_BITBUFFSZ-len)); \ bs->InBuff<<=len; bs->CurrentBit+=len; bs->shift-=len; } \ } #define ScBSAlignPutBits(bs) if (bs->shift%8) \ ScBSPutBits(bs, 0, 8-(bs->shift%8)); #define ScBSBitPosition(bs) (bs->CurrentBit) #define ScBSBytePosition(bs) (bs->CurrentBit>>3) #define ScBSBufferedBytes(bs) (bs->bufftop) #define ScBSBufferedBytesUsed(bs) (bs->buffp) #define ScBSBufferedBytesUnused(bs) (bs->bufftop-bs->buffp) #define ScBSSkipBit(bs) ScBSSkipBits(bs, 1) #define ScBSSkipBitsFast(bs, len) { if ((u_int)(len)<=bs->shift) { \ if ((len)==SC_BITBUFFSZ) \ { bs->OutBuff=bs->InBuff; bs->InBuff=0; } \ else { \ bs->OutBuff=(bs->OutBuff<<(len))|(bs->InBuff>>(SC_BITBUFFSZ-(len))); \ bs->InBuff<<=(len); } \ bs->CurrentBit+=len; bs->shift-=len; \ } else ScBSSkipBits(bs, len); } #define ScBSSkipBitFast(bs) ScBSSkipBitsFast(bs, 1) #define ScBSPeekBitsFast(bs, len) (!(len) ? 0 \ : (((len)<=bs->shift || !sc_BSLoadDataWord(bs)) && (len)==SC_BITBUFFSZ \ ? bs->OutBuff : (bs->OutBuff >> (SC_BITBUFFSZ-len))) ) #define ScBSPeekBitsFull(bs, result) \ { ScBSPreLoad(bs, SC_BITBUFFSZ); result = bs->OutBuff; } /* ** Sort stuff */ typedef struct ScSortDouble_s { int index; /* index to actual data */ double num; /* the number to sort by */ } ScSortDouble_t; typedef struct ScSortFloat_s { int index; /* index to actual data */ double num; /* the number to sort by */ } ScSortFloat_t; /* ** ScBuf_s structure used in Buffer/Image Queue management. ** Contains info for one buffer. */ struct ScBuf_s { u_char *Data; /* Pointer to buffer's data */ int Size; /* Length of buffer in bytes */ int Type; /* Type of buffer */ struct ScBuf_s *Prev; /* Pointer to previous buffer in queue */ }; /* ** Buffer queue structure. One for each queue. */ typedef struct ScQueue_s { int NumBufs; /* Number of buffers currently in queue */ struct ScBuf_s *head, *tail; /* pointers to head & tail of queue */ } ScQueue_t; /* ** ScCallbackInfo_t passes info back & forth during callback */ typedef struct ScCallbackInfo_s { int Message; /* Callback reason: CB_FRAME_READY, etc. */ int DataType; /* Buffer data type */ u_char *Data; /* Pointer to data buffer. */ dword DataSize; /* Length of data buffer */ dword DataUsed; /* Actual bytes used in buffer */ void *UserData; /* User defined data */ qword TimeStamp; /* Timestamp of decompressed img/audio */ /* relative to start of sequence */ dword Flags; /* decomp/compression details */ int Action; /* drop frame or continue */ dword Value; /* a value for special flags/actions */ void *Format; /* BITMAPINFOHEADER or WAVEFORMATEX */ } ScCallbackInfo_t; typedef qword ScBSPosition_t; /* ** State info for the input bitstream */ typedef struct ScBitstream_s { dword DataSource; /* STREAM_USE_BUFFER, _USE_QUEUE,_USE_FILE, */ /* or _USE_DEVICE */ char Mode; /* 'r'=read, 'w'=write, 'b'=both */ ScQueue_t *Q; /* Buffer Queue (STREAM_USE_QUEUE) */ int (*Callback)(ScHandle_t, /* Callback to supply Bufs (STREAM_USE_QUEUE) */ ScCallbackInfo_t *, void *); int (*FilterCallback)(struct /* Callback to filter data from bitstream */ ScBitstream_s *); unsigned qword FilterBit; /* Bit to call filter callback at */ unsigned char InFilterCallback; /* TRUE when FilterCallback is busy */ ScHandle_t Sch; /* Handle passed to Callback */ dword DataType; /* Data type passed to Callback */ void *UserData; /* User Data passed to Callback */ int FileFd; /* File descriptor (STREAM_USE_FILE/NET) */ unsigned char *RdBuf; /* Buf to use if (_USE_BUFFER,_USE_FILE) */ unsigned dword RdBufSize; /* Size of RdBuf */ char RdBufAllocated;/* = TRUE if RdBuf was internally allocated */ dword Device; /* Device to use (STREAM_USE_DEVICE) */ ScBitBuff_t InBuff, OutBuff; /* 64-bit or 32-bit data buffers */ unsigned int shift; /* Shift value for current bit position */ ScBSPosition_t CurrentBit; /* Current bit position in bitstream */ unsigned char *buff; /* pointer to bitstream data buffer */ unsigned dword buffstart; /* byte offset of start of buff */ unsigned dword buffp; /* byte offset in buffer */ unsigned dword bufftop; /* number of bytes in buffer */ ScBoolean_t EOI; /* = TRUE when no more data in data source */ ScBoolean_t Flush; /* = TRUE to signal a flush at next 32/64 bit */ } ScBitstream_t; /* ** Bitstream context block to save current position of input stream */ typedef struct ScBitstreamSave_s { ScBitBuff_t InBuff, OutBuff; /* 64-bit or 32-bit data buffers */ unsigned dword shift; /* Shift value for current bit position */ ScBSPosition_t CurrentBit; /* Current bit position in bitstream */ unsigned char *buff; /* pointer to bitstream data buffer */ unsigned dword buffp; /* byte offset in buffer */ ScBoolean_t EOI; /* = TRUE when no more data in data source */ ScBoolean_t Flush; /* = TRUE to signal a flush at next 32/64 bit */ } ScBitstreamSave_t; /************************** Prototypes *****************************/ /* * sc_file.c */ PRIVATE_EXTERN ScBoolean_t ScFileExists(char *filename); PRIVATE_EXTERN int ScFileOpenForReading(char *filename); PRIVATE_EXTERN int ScFileOpenForWriting(char *filename, ScBoolean_t truncate); PRIVATE_EXTERN ScStatus_t ScFileSize(char *filename, unsigned qword *size); PRIVATE_EXTERN dword ScFileRead(int fd, void *buffer, unsigned dword bytes); PRIVATE_EXTERN dword ScFileWrite(int fd, void *buffer, unsigned dword bytes); PRIVATE_EXTERN ScStatus_t ScFileSeek(int fd, qword bytepos); PRIVATE_EXTERN void ScFileClose(int fd); PRIVATE_EXTERN ScStatus_t ScFileMap(char *filename, int *fd, u_char **buffer, unsigned qword *size); PRIVATE_EXTERN ScStatus_t ScFileUnMap(int fd, u_char *buffer, unsigned int size); PRIVATE_EXTERN int ScGetFileType(char *filename); /* * sc_mem.c */ PRIVATE_EXTERN void *ScAlloc(unsigned long bytes); PRIVATE_EXTERN void *ScAlloc2(unsigned long bytes, char *name); PRIVATE_EXTERN void *ScCalloc(unsigned long bytes); PRIVATE_EXTERN void ScFree(void *); PRIVATE_EXTERN int ScMemCheck(char *array,int test,int num); EXTERN char *ScPaMalloc(int); EXTERN void ScPaFree(void *); EXTERN int getpagesize(); /* * sc_util.c */ extern int sc_Dummy(); PRIVATE_EXTERN unsigned int ScImageSize(unsigned int fourcc, int w, int h, int bits); extern void ScReadCommandSwitches(char *argv[],int argc, void (*error_routine)(),char *,...); extern void ScShowBuffer(unsigned char *, int); extern void ScShowBufferFloat(float *, int); extern void ScShowBufferInt(int *, int); extern int ScDumpChar(unsigned char *ptr, int nbytes, int startpos); /* * sc_errors.c */ PRIVATE_EXTERN ScStatus_t ScGetErrorText (int errno, char *ReturnMsg, u_int MaxChars); PRIVATE_EXTERN char *ScGetErrorStr(int errno); extern char _serr_msg[80]; /* * sc_buf.c */ PRIVATE_EXTERN ScStatus_t ScBSSetFilter(ScBitstream_t *BS, int (*Callback)(ScBitstream_t *BS)); PRIVATE_EXTERN ScStatus_t ScBSCreate(ScBitstream_t **BS); PRIVATE_EXTERN ScStatus_t ScBSCreateFromBuffer(ScBitstream_t **BS, u_char *Buffer, unsigned int BufSize); PRIVATE_EXTERN ScStatus_t ScBSCreateFromBufferQueue(ScBitstream_t **BS, ScHandle_t Sch, int DataType, ScQueue_t *Q, int (*Callback)(ScHandle_t,ScCallbackInfo_t *,void *), void *UserData); PRIVATE_EXTERN ScStatus_t ScBSCreateFromFile(ScBitstream_t **BS,int FileFd, u_char *Buffer, int BufSize); PRIVATE_EXTERN ScStatus_t ScBSCreateFromNet(ScBitstream_t **BS, int SocketFd, u_char *Buffer, int BufSize); PRIVATE_EXTERN ScStatus_t ScBSCreateFromDevice(ScBitstream_t **BS, int device); PRIVATE_EXTERN ScStatus_t ScBSDestroy(ScBitstream_t *BS); PRIVATE_EXTERN ScStatus_t ScBSFlush(ScBitstream_t *BS); PRIVATE_EXTERN ScStatus_t ScBSFlushSoon(ScBitstream_t *BS); PRIVATE_EXTERN ScStatus_t ScBSReset(ScBitstream_t *BS); PRIVATE_EXTERN ScStatus_t ScBSResetCounters(ScBitstream_t *BS); PRIVATE_EXTERN ScStatus_t ScBSSkipBits(ScBitstream_t *BS, u_int length); PRIVATE_EXTERN ScStatus_t ScBSSkipBitsW(ScBitstream_t *BS, u_int length); PRIVATE_EXTERN ScStatus_t ScBSSkipBytes(ScBitstream_t *BS, u_int length); PRIVATE_EXTERN int ScBSPeekBit(ScBitstream_t *BS); PRIVATE_EXTERN ScBitString_t ScBSPeekBits(ScBitstream_t *BS, u_int length); PRIVATE_EXTERN ScBitString_t ScBSPeekBytes(ScBitstream_t *BS, u_int length); PRIVATE_EXTERN int ScBSGetBytes(ScBitstream_t *BS, u_char *buffer, u_int length, u_int *ret_length); PRIVATE_EXTERN int ScBSGetBytesStopBefore(ScBitstream_t *BS, u_char *buffer, u_int length, u_int *ret_length, ScBitString_t seek_word, int word_len); PRIVATE_EXTERN ScBitString_t ScBSGetBits(ScBitstream_t *BS, u_int length); PRIVATE_EXTERN ScBitString_t ScBSGetBitsW(ScBitstream_t *BS, u_int length); PRIVATE_EXTERN int ScBSGetBitsVarLen(ScBitstream_t *BS, const int *table, int len); PRIVATE_EXTERN ScStatus_t ScBSPutBytes(ScBitstream_t *BS, u_char *buffer, u_int length); PRIVATE_EXTERN ScStatus_t ScBSPutBits(ScBitstream_t *BS, ScBitString_t bits, u_int length); PRIVATE_EXTERN ScStatus_t ScBSPutBit(ScBitstream_t *BS, char bit); PRIVATE_EXTERN int ScBSGetBit(ScBitstream_t *BS); PRIVATE_EXTERN ScStatus_t ScBSSeekToPosition(ScBitstream_t *BS, unsigned long pos); PRIVATE_EXTERN int ScBSSeekStopBefore(ScBitstream_t *BS, ScBitString_t seek_word, int word_len); PRIVATE_EXTERN int ScBSSeekAlign(ScBitstream_t *BS, ScBitString_t seek_word,int word_len); PRIVATE_EXTERN int ScBSSeekAlignStopBefore(ScBitstream_t *BS,ScBitString_t seek_word,int word_len); PRIVATE_EXTERN int ScBSSeekAlignStopBeforeW(ScBitstream_t *BS,ScBitString_t seek_word,int word_len); PRIVATE_EXTERN int ScBSSeekAlignStopAt(ScBitstream_t *BS, ScBitString_t seek_word, int word_len, unsigned long end_byte_pos); extern ScStatus_t sc_BSLoadDataWord(ScBitstream_t *BS); extern ScStatus_t sc_BSStoreDataWord(ScBitstream_t *BS, ScBitBuff_t Buff); PRIVATE_EXTERN ScStatus_t ScBufQueueCreate(ScQueue_t **Q); PRIVATE_EXTERN ScStatus_t ScBufQueueDestroy(ScQueue_t *Q); PRIVATE_EXTERN ScStatus_t ScBufQueueAdd(ScQueue_t *Q, u_char *Data, int Size); PRIVATE_EXTERN ScStatus_t ScBufQueueAddExt(ScQueue_t *Q, u_char *Data, int Size, int Type); PRIVATE_EXTERN ScStatus_t ScBufQueueRemove(ScQueue_t *Q); PRIVATE_EXTERN int ScBufQueueGetNum(ScQueue_t *Q); PRIVATE_EXTERN ScStatus_t ScBufQueueGetHead(ScQueue_t *Q, u_char **Data, int *Size); PRIVATE_EXTERN ScStatus_t ScBufQueueGetHeadExt(ScQueue_t *Q, u_char **Data, int *Size, int *Type); /* ** sc_math.c */ /* #define ScAbs(val) (val > 0.0) ? val : -val */ extern float ScAbs(float val); extern double ScSqr(double x); extern double ScDistance(double x1, double y1, double z1, double x2, double y2, double z2); extern void ScDigrv4(float *real, float *imag, int n); extern float ScArcTan(float Q,float I); /* ** sc_dct.c */ extern void ScFDCT(float in_block[32], float out_block1[32], float out_block2[32]); extern void ScIFDCT(float in_block[32], float out_block[32]); extern void ScFDCT8x8_C(float *ipbuf, float *outbuf); extern void ScFDCT8x8s_C(short *inbuf, short *outbuf); /* ** sc_dct2.c */ extern void ScFDCT8x8_S(float *ipbuf, float *outbuf); /* ** sc_idct.c */ extern void ScIDCT8x8(int *outbuf); extern void ScScaleIDCT8x8_C(float *ipbuf, int *outbuf); extern void ScIDCT8x8s_C(short *inbuf, short *outbuf); /* ** sc_idct_scaled.c */ extern void ScScaleIDCT8x8i_C(int *inbuf, int *outbuf); extern void ScScaleIDCT8x8i128_C(int *inbuf, int *outbuf); extern void ScScaleIDCT1x1i_C(int *inbuf, int *outbuf); extern void ScScaleIDCT1x2i_C(int *inbuf, int *outbuf); extern void ScScaleIDCT2x1i_C(int *inbuf, int *outbuf); extern void ScScaleIDCT2x2i_C(int *inbuf, int *outbuf); extern void ScScaleIDCT3x3i_C(int *inbuf, int *outbuf); extern void ScScaleIDCT4x4i_C(int *inbuf, int *outbuf); extern void ScScaleIDCT6x6i_C(int *inbuf, int *outbuf); /* ** sc_idct2.s */ extern void ScIDCT8x8s_S(short *inbuf, short *outbuf); extern void ScScaleIDCT8x8i_S(int *inbuf, int *outbuf); /* ** sc_idct3.s */ extern void ScScaleIDCT8x8m_S(int *inbuf); /* ** sc_idctp2.s */ extern void ScPatScaleIDCT8x8i_S(int *inbuf, int *outbuf); /* ** sc_fft.c */ extern void ScFFTtrl(float *real,float *imag,int n,int max_fft,float *c1, float *s1,float *c2,float *s2,float *c3,float *s3); extern void ScFFTtl(float *real, float *imag, int n, int max_fft, float *c1, float *s1, float *c2, float *s2, float *c3, float *s3); extern void ScFFTt4l(float *real, float *imag, int n, int *angle_increment, int max_fft, float *c1, float *s1, float *c2, float *s2, float *c3, float *s3); /* ** sc_sort.c */ extern void ScSortDoubles(ScSortDouble_t *a, int n); /* ** sc_copy.c */ extern void ScCopyClip_C(int *buf, unsigned int *pos, int inc); extern void ScCopyClipToPacked422_C(int *buf, unsigned char *pos, int inc); extern void ScCopyAddClip_C(unsigned char *mvbuf, int *idctbuf, unsigned int *pbuf, int mvinc, int pwidth); extern void ScCopySubClip_C(unsigned char *mvbuf, float *idctbuf, unsigned int *pbuf, int mvinc, int pwidth); extern void ScCopyRev_C(unsigned int *yptr, float *Idctptr, int Inc); extern void ScCopyMV8_C(unsigned char *mvbuf, unsigned int *pbuf, int mvinc, int pwidth); extern void ScLoopFilter_C(unsigned char *input, unsigned int *work, int inc); extern void ScCopyBlock_C(unsigned char *linmemu, unsigned char *linmemv, int xpos, unsigned char *blkmemu, unsigned char *blkmemv, int cwidth, int wsis); extern void ScCopyMB_C(unsigned char *ysrc, int xpos, unsigned char *ymb, int ywidth, int yywidth); extern void ScCopyMB8_C(unsigned char *ysrc, unsigned char *ymb, int ywidth, int yywidth); extern void ScCopyMB16_C(unsigned char *ysrc, unsigned char *ymb, int ywidth, int yywidth); /* ** sc_copy2.s */ extern void ScCopyClip_S(int *buf, unsigned int *pos, int inc); extern void ScCopyClipToPacked422_S(int *buf, unsigned char *pos, int inc); extern void ScCopyAddClip_S(unsigned char *mvbuf, int *idctbuf, unsigned int *pbuf, int mvinc, int pwidth); extern void ScCopySubClip_S(unsigned char *mvbuf, float *idctbuf, unsigned int *pbuf, int mvinc, int pinc); extern void ScCopyRev_S(unsigned int *yptr, float *Idctptr, int yinc); extern void ScLoopFilter_S(unsigned char *input, unsigned int *work, int inc); extern void ScCopyMV8_S(unsigned char *mvbuf, unsigned int *pbuf, int mvinc, int pwidth); extern void ScCopyMV16_S(unsigned char *mvbuf, unsigned int *pbuf, int mvinc, int pwidth); extern void ScCopyMB8_S(unsigned char *ysrc, unsigned char *ymb, int ywidth, int yywidth); extern void ScCopyMB16_S(unsigned char *ysrc, unsigned char *ymb, int ywidth, int yywidth); extern void ScAvgMV_S(unsigned char *, unsigned char *); /* ** sc_mc2.s */ extern void ScMCy8(unsigned char *, unsigned char *, int); extern void ScMCy16(unsigned char *, unsigned char *, int); extern void ScMCx8(unsigned char *, unsigned char *, int); extern void ScMCx16(unsigned char *, unsigned char *, int); extern void ScMCxy8(unsigned char *, unsigned char *, int); extern void ScMCxy16(unsigned char *, unsigned char *, int); /* ** macros for using C or assembly versions */ #ifdef USE_C #define ScCopyClip ScCopyClip_C #define ScCopyClipToPacked422 ScCopyClipToPacked422_C #define ScCopyAddClip ScCopyAddClip_C #define ScCopySubClip ScCopySubClip_C #define ScCopyRev ScCopyRev_C #define ScLoopFilter ScLoopFilter_C #define ScCopyMV8 ScCopyMV8_C #define ScCopyMV16 ScCopyMV16_C #define ScCopyMB8 ScCopyMB8_C #define ScCopyMB16 ScCopyMB16_C #define ScAvgMV ScAvgMV_C #define ScScaleIDCT8x8 ScScaleIDCT8x8_C #define ScScaleIDCT8x8i ScScaleIDCT8x8i_C #define ScScaleIDCT8x8i128 ScScaleIDCT8x8i128_C #define ScPatScaleIDCT8x8i ScScaleIDCT8x8i_C #define ScFDCT8x8 ScFDCT8x8_C #define ScFDCT8x8s ScFDCT8x8s_C #define ScIDCT8x8s ScIDCT8x8s_C #define ScIDCT8x8sAndCopy ScIDCT8x8sAndCopy_C #else /* USE_C */ #define ScCopyClip ScCopyClip_S #define ScCopyClipToPacked422 ScCopyClipToPacked422_S #define ScCopyAddClip ScCopyAddClip_S #define ScCopySubClip ScCopySubClip_S #define ScCopyRev ScCopyRev_S #define ScLoopFilter ScLoopFilter_S #define ScCopyMV8 ScCopyMV8_S #define ScCopyMV16 ScCopyMV16_S #define ScCopyMB8 ScCopyMB8_S #define ScCopyMB16 ScCopyMB16_S #define ScAvgMV ScAvgMV_S #define ScScaleIDCT8x8 ScScaleIDCT8x8_C #define ScScaleIDCT8x8i ScScaleIDCT8x8i_C #define ScScaleIDCT8x8i128 ScScaleIDCT8x8i128_C #define ScPatScaleIDCT8x8i ScPatScaleIDCT8x8i_S #define ScFDCT8x8 ScFDCT8x8_S #define ScFDCT8x8s ScFDCT8x8s_C #define ScIDCT8x8s ScIDCT8x8s_S #define ScIDCT8x8sAndCopy ScIDCT8x8sAndCopy_S #endif /* USE_C */ #endif /* _SC_H_ */