254 lines
6.2 KiB
C
254 lines
6.2 KiB
C
|
||
typedef struct _SP_DCSQ {
|
||
|
||
WORD spdcsq_stm; // start time in frames
|
||
WORD spdcsq_sa; // start address of next sequence cmd
|
||
UCHAR spdcsq_cmd[]; // commands for this descriptor
|
||
} SP_DCSQ, *PSP_DCSQ;
|
||
|
||
typedef enum _SP_DCCMD {
|
||
|
||
FSTA_DSP, // forcebly start display of subpicture
|
||
STA_DSP, // start display of subpicture
|
||
STP_DSP, // stop display of subpicture
|
||
SET_COLOR,
|
||
SET_CONTR,
|
||
SET_DAREA,
|
||
SET_DSPSTRT,
|
||
CHG_COLCON, // change color / contrast (mid picture)
|
||
CMD_END = 0xFF
|
||
|
||
} SP_DCCMD, *PSP_DCCMD;
|
||
|
||
typedef struct _SPPALLETTE {
|
||
|
||
UCHAR color[4];
|
||
UCHAR mix[4];
|
||
|
||
}SPPALLETTE, * PSPPALLETTE;
|
||
|
||
|
||
typedef struct _YUVPAL {
|
||
UCHAR ucY[16];
|
||
UCHAR ucU[16];
|
||
UCHAR ucV[16];
|
||
} YUVPAL, *PYUVPAL;
|
||
|
||
typedef struct _MAPPAL {
|
||
UCHAR yuvMap[16];
|
||
UCHAR origMap[16];
|
||
UCHAR ucAlpha[16];
|
||
UCHAR palFlags[16];
|
||
} MAPPAL, *PMAPPAL;
|
||
|
||
#define fInUse 0x01
|
||
#define fUseAlpha 0x02
|
||
|
||
typedef struct _SCOLCON {
|
||
UCHAR emph1col:4;
|
||
UCHAR emph2col:4;
|
||
UCHAR backcol:4;
|
||
UCHAR patcol:4;
|
||
UCHAR emph1con:4;
|
||
UCHAR emph2con:4;
|
||
UCHAR backcon:4;
|
||
UCHAR patcon:4;
|
||
|
||
} SCOLCON, *PSCOLCON;
|
||
|
||
typedef struct _PXCTLX {
|
||
UCHAR chgpixhi:2;
|
||
UCHAR chgpix;
|
||
SCOLCON colcon;
|
||
} PXCTLX, *PPXCTLX;
|
||
|
||
typedef struct _PXCTLY {
|
||
UCHAR chglinhi:2;
|
||
UCHAR chglin;
|
||
UCHAR chgstophi:2;
|
||
UCHAR chgres:2;
|
||
UCHAR numchg:4;
|
||
UCHAR chgstop;
|
||
|
||
PXCTLX xchg[];
|
||
} PXCTLY, *PPXCTLY;
|
||
|
||
typedef struct _SMYCOLCON {
|
||
|
||
ULONG stopx;
|
||
SPPALLETTE chgsppal;
|
||
} SMYCOLCON, *PSMYCOLCON;
|
||
|
||
typedef struct _SPPCKHDR {
|
||
UCHAR phdr_start[3];
|
||
UCHAR phdr_strmid;
|
||
WORD phdr_packet_length;
|
||
UCHAR phdr_flags[2];
|
||
UCHAR phdr_hdr_length;
|
||
UCHAR phdr_PTS[5];
|
||
} SPPCKHDR, *PSPPCKHDR;
|
||
|
||
typedef struct _OSDYUV {
|
||
UCHAR osdV:4;
|
||
UCHAR osdU:4;
|
||
UCHAR osdT:1;
|
||
UCHAR osdres:1;
|
||
UCHAR osdY:6;
|
||
} OSDYUV, *POSDYUV;
|
||
|
||
typedef struct _OSDHEAD {
|
||
USHORT osdhStarty:9;
|
||
USHORT osdhres1:5;
|
||
USHORT osdhMQ:2;
|
||
USHORT osdhStopy:9;
|
||
USHORT osdhres2:3;
|
||
USHORT osdhMix:4;
|
||
USHORT osdhStartx:10;
|
||
USHORT osdhres3:6;
|
||
USHORT osdhStopx:10;
|
||
USHORT osdhres4:6;
|
||
OSDYUV osdhYUV[16];
|
||
} OSDHEAD, *POSDHEAD;
|
||
|
||
typedef struct _SPHLI {
|
||
BOOLEAN fValid;
|
||
BOOLEAN fProcessed;
|
||
BOOLEAN fActive;
|
||
KSPROPERTY_SPHLI hli;
|
||
} SPHLI, *PSPHLI;
|
||
|
||
|
||
|
||
typedef struct _SP_DECOD_CTL {
|
||
|
||
PPXCTLY ppxcd; // current pixel control data
|
||
SPHLI HLI; // current highligh information
|
||
SPPALLETTE sppPal; // current subpicture pallette
|
||
YUVPAL spYUV; // current YUV mapping
|
||
MAPPAL mappal; // current pallette to YUV mapping
|
||
UCHAR minCon; // current minimum contrast level
|
||
UCHAR minConCol; // minimum contrast color
|
||
|
||
|
||
ULONG ulDecodStart; // decode start address for compressed data
|
||
ULONG ulDSAx; // x coordinate of display area
|
||
ULONG ulDSAy; // y coordinate of display area
|
||
ULONG ulDSAw; // width of display area
|
||
ULONG ulDSAh; // height of display area
|
||
|
||
PBYTE pData; // data source buffer
|
||
ULONG curData; // current size of datapacket
|
||
ULONG cData; // total size of this data packet
|
||
|
||
PBYTE pTopWork; // top field buffer
|
||
PBYTE pBottomWork; // bottom field buffer
|
||
ULONG cDecod; // size of the decode buffers
|
||
|
||
ULONG cTopDisp; // top field for display
|
||
ULONG cBottomDisp; // bottom field for display
|
||
ULONG cDisp; // size of the display buffers
|
||
|
||
ULONG pSPCmds; // pointer to current set of SPCmds
|
||
ULONG lastSPCmds; // pointer to current set of SPCmds
|
||
ULONG ulFrameCnt; // number of frames since we started
|
||
// this subpicture
|
||
|
||
ULONG decFlags; // decodeing flags
|
||
ULONG nextDispFlags; // next decoding flags
|
||
|
||
KSSTATE spState; // subpicture decoding state
|
||
|
||
ULONG stsPic; // time to display the current picture
|
||
ULONG lastTime; // previous display time
|
||
ULONG stsNextUpd; // time of next subpicture update
|
||
ULONG cFrames; // count of frames
|
||
|
||
ULONG numchg;
|
||
|
||
} SP_DECODE_CTL, *PSP_DECODE_CTL;
|
||
|
||
#define SPDECFL_BUF_IN_USE 0x0001
|
||
#define SPDECFL_SUBP_ON_DISPLAY 0x0002
|
||
#define SPDECFL_LAST_FRAME 0x0004
|
||
#define SPDECFL_SUBP_DECODED 0x0008
|
||
#define SPDECFL_NEW_PIC 0x0010
|
||
#define SPDECFL_DECODING 0x0020
|
||
#define SPDECFL_RESTART 0x0040
|
||
#define SPDECFL_DISP_OFF 0x0080
|
||
#define SPDECFL_DISP_FORCED 0x0100
|
||
#define SPDECFL_USER_DISABLED 0x0200
|
||
#define SPDECFL_DISP_LIVE 0x0400
|
||
#define SPDECFL_ONE_UNIT 0x0800
|
||
#define SPDECFL_USE_STRAIGHT_PAL 0x1000
|
||
|
||
typedef struct _SP_DECODE_ADDR {
|
||
UCHAR opCode;
|
||
UCHAR wTopAddr[2];
|
||
UCHAR wBottomAddr[2];
|
||
} SP_DECODE_ADDR, *PSP_DECODE_ADDR;
|
||
|
||
typedef struct SP_STRM_EX {
|
||
SP_DECODE_CTL pdecctl;
|
||
PHW_STREAM_REQUEST_BLOCK pSrbQ;
|
||
ULONG cOffset;
|
||
struct _HW_DEVICE_EXTENSION *phwdevex;
|
||
PHW_STREAM_OBJECT phstrmo;
|
||
} SP_STRM_EX, *PSP_STRM_EX;
|
||
|
||
|
||
#define DAREA_START_UB_MASK 0x3f // display area upper bit mask
|
||
#define DAREA_END_UB_MASK 0x3 // display area end upper bit mask
|
||
#define DAREA_LB_MASK 0xf0
|
||
|
||
#define DAREA_START_UB_SHIFT 0x4
|
||
#define DAREA_END_UB_SHIFT 0x8
|
||
|
||
#define SP_LCTL_TERM 0xFFFFFF0F
|
||
#define SP_MAX_INPUT_BUF 53220 // maximum size of the subpicture input buffer
|
||
|
||
BOOL UpdateSPConsts(PSP_STRM_EX pspstrmex);
|
||
|
||
BOOL DecodeRLE(PVOID pdest, ULONG cStart, PSP_STRM_EX pspstrmex);
|
||
|
||
void StartSPDecode (PSP_STRM_EX pspstrmex);
|
||
|
||
BOOL BuildSPFields (PSP_STRM_EX pspstrmex);
|
||
|
||
BOOL UpdateSPConsts(PSP_STRM_EX pspstrmex);
|
||
|
||
VOID SPReceiveDataPacket(PHW_STREAM_REQUEST_BLOCK pSrb);
|
||
|
||
void DumpPacket(PSP_STRM_EX pspstrmex);
|
||
|
||
void SPEnqueue(PHW_STREAM_REQUEST_BLOCK pSrb, PSP_STRM_EX pspstrmex);
|
||
|
||
PHW_STREAM_REQUEST_BLOCK SPDequeue(PSP_STRM_EX pspstrmex);
|
||
|
||
void SubPicIRQ(PSP_STRM_EX pspstrmex);
|
||
|
||
void SPSchedDecode(PSP_STRM_EX pspstrmex);
|
||
|
||
BOOL WriteBMP(PSP_STRM_EX pspstrmex);
|
||
void DumpHLI(PSP_STRM_EX pspstrmex);
|
||
|
||
void WriteSPBuffer(PBYTE pBuf, ULONG cnt);
|
||
|
||
void WriteSPData(ULONG ulData);
|
||
|
||
BOOL AllocateSPBufs(PSP_DECODE_CTL pdecctl);
|
||
|
||
void SPSetState (PHW_STREAM_REQUEST_BLOCK pSrb);
|
||
|
||
void SPSetProp (PHW_STREAM_REQUEST_BLOCK pSrb);
|
||
void SPGetProp (PHW_STREAM_REQUEST_BLOCK pSrb);
|
||
|
||
void CallBackError(PHW_STREAM_REQUEST_BLOCK pSrb);
|
||
void CleanSPQueue(PSP_STRM_EX pspstrmex);
|
||
|
||
void SPSetSPEnable();
|
||
void SPSetSPDisable();
|
||
|
||
BOOL SPChooseMap (PSP_DECODE_CTL pdecctl, PUCHAR pcol, UCHAR con );
|
||
|
||
void AbortSP(PSP_STRM_EX pspstrmex);
|
||
|