1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
|
#ifndef _VDEC_DRV_WMV_INFO_H_
#define _VDEC_DRV_WMV_INFO_H_
//#include "x_os.h"
//#include "x_bim.h"
//#include "x_assert.h"
//#include "x_timer.h"
#include "drv_common.h"
#include "vdec_common_if.h"
#include "vdec_usage.h"
#include "vdec_info_wmv.h"
#include "vdec_info_common.h"
#if CONFIG_DRV_VERIFY_SUPPORT
#include "../verify/vdec_verify_general.h"
#endif
/******************************************************************************
* Local definition
******************************************************************************/
// WMV start code(s)
#define WMV_SC_PREFIX 0x000001
#define WMV_SC_ENDOFSEQ 0x10A
#define WMV_SC_SLICE 0x10B
#define WMV_SC_FIELD 0x10C
#define WMV_SC_FRAME 0x10D
#define WMV_SC_ENTRY 0x10E
#define WMV_SC_SEQ 0x10F
#define WMV_SC_SLICE_DATA 0x11B
#define WMV_SC_FIELD_DATA 0x11C
#define WMV_SC_FRAME_DATA 0x11D
#define WMV_SC_ENTRY_DATA 0x11E
#define WMV_SC_SEQ_DATA 0x11F
// extension start code IDs
// Working Buffer Define
#if (!CONFIG_DRV_VERIFY_SUPPORT)
#if 1
#define Mv_1_SZ ((1920/16)*(1088/16)*4*4)
#define Mv_2_SZ ((1920/16)*4*4)
#define Bp_1_SZ (16*(1088/16))
#define Bp_2_SZ (16*(1088/16))
#define Bp_3_SZ (16*(1088/16))
#define Bp_4_SZ (16*(1088/16))
#define Mv_3_SZ ((1920/16)*4*4)
#define Mv_1_2_SZ ((1920/16)*(1088/16)*4*4)
#define DCAC_SZ ((((1920 / 16) * 4) * (4)) * 4) // (MBx * 4) * (4) = 7680
#define DCAC_2_SZ ((((1920 / 16) * 4) * (4)) * 4)
#define DEC_PP_SZ ((1920/16)*3*16)
#else
#define Mv_1_SZ 0x3fc00
#define Mv_2_SZ 0x3fc00
#define Bp_1_SZ 0x10000
#define Bp_2_SZ 0x10000
#define Bp_3_SZ 0x10000
#define Bp_4_SZ 0x10000
#define Mv_3_SZ 0x10000
#define Mv_1_2_SZ 0x10000
#define DCAC_SZ ((((2048 / 16) * 4) * (4)) * 4) // (MBx * 4) * (4) = 7680
#define DCAC_2_SZ 0x100000
#define DEC_PP_SZ ((2048/16)*9*8)*2
#endif
#endif
#define INVALID_32 0xffffffff
#define NO_USE 0xffffffff
#define MAX_RETRY_COUNT1 200*1024
#define WMV_DPB_NUM 3
#define WMV_MAX_EDPB_NUM 30
#define WMV_DFB_NUM 256
#define WMV_MAX_SPS_NUM 30
#define WMV_MAX_EPS_NUM 30
#define WMV_MAX_ICOMPS_NUM 255
#define fgIsWMVSeqHdr(arg) (arg & SEQ_HDR)
#define fgIsWMVEntryPTR(arg) (arg & ENTRY_PTR)
#define fgIsWMVSeqEnd(arg) (arg & SEQ_END)
#if (CONFIG_CHIP_VER_CURR >= CONFIG_CHIP_VER_MT8550)
#define WMV_NEW_HW_MODE //the new HW work mode only supportted by MT8550^
#endif
typedef enum // bit plane coding mode
{
NORM2 = 0,
NORM6,
ROWSKIP,
COLSKIP,
DIFF2,
DIFF6,
RAW,
} WMV_BP_MODE;
typedef enum
{
WMV_DPB_STATUS_EMPTY = 0, // Free
WMV_DPB_STATUS_READY, // After Get
WMV_DPB_STATUS_DECODING, // After Lock
WMV_DPB_STATUS_DECODED, // After UnLock
WMV_DPB_STATUS_OUTPUTTED, // After Output
WMV_DPB_STATUS_FLD_DECODED, // After 1fld UnLock
WMV_DPB_STATUS_DEC_REF,
WMV_DPB_STATUS_OUT_REF,
} WMV_DPB_COND_T;
typedef enum
{
WMV_DPB_FBUF_UNKNOWN = VDEC_FB_ID_UNKNOWN,
WMV_DPB_FREF_FBUF = 0,
WMV_DPB_BREF_FBUF = 1,
WMV_DPB_WORKING_FBUF = 2,
} WMV_DPB_IDX_T;
typedef struct _WMV_DBP_INFO_T
{
BOOL fgVirtualDec;
UCHAR ucDpbFbId;
WMV_DPB_COND_T eDpbStatus;
UINT64 u8Pts;
UINT64 u8Offset;
} WMV_DBP_INFO_T;
typedef struct _WMV_DEC_PRM_T
{
UCHAR ucDecFld;
UCHAR uc2ndFld;
UCHAR ucPicStruct;
UINT32 u4BitCount;
BOOL fgCounting;
UINT32 u4PicHdrBits;
INT32 i4CodecVersion;
INT64 i8BasePTS;
INT64 i8DiffCnt;
INT64 i8DropIPCnt;
INT64 i8DropBCnt;
WMV_DPB_IDX_T eDpbOutputId;
WMV_DBP_INFO_T arWMVDpbInfo[WMV_DPB_NUM]; // 0: FRef, 1: BRef, 2:Working
VDEC_NORM_INFO_T *prVDecNormInfo;
VDEC_PIC_INFO_T *prVDecPicInfo;
VDEC_PIC_INFO_T *prVPrevPicInfo;
VDEC_FBM_INFO_T *prVDecFbmInfo;
// VID_DEC_PB_MODE_T *prVDecPBInfo;
// VID_DEC_SEQUENCE_INFO_T rCurrSeqInfo;
VDEC_INFO_WMV_SEQ_PRM_T rSPS;
VDEC_INFO_WMV_ETRY_PRM_T rEPS;
VDEC_INFO_WMV_PIC_PRM_T rPPS;
VDEC_INFO_WMV_ICOMP_PRM_T rICOMPS;
VDEC_INFO_WMV_VFIFO_PRM_T rVDecWmvVFifoPrm;
VDEC_INFO_WMV_BS_INIT_PRM_T rVDecWmvBsInitPrm[2];
VDEC_INFO_WMV_WORK_BUF_SA_T rVDecWmvWorkBufSa;
VDEC_INFO_WMV_ERR_INFO_T rVDecWmvErrInfo;
VDEC_INFO_DEC_PRM_T rVDecNormHalPrm;
#ifdef VDEC_SR_SUPPORT
VDEC_INFO_WMV_WORK_BUF_SA_T rVDecWmvWorkBufSa2;
UCHAR ucEpsRefCnt;
UCHAR ucWMVCurrSeqId;
UCHAR ucWMVCurrEpsId;
UCHAR ucWMVSeqHdrCnt;
UCHAR ucWMVEpsHdrCnt;
UCHAR ucWMVEpsCntOfSps;
VDEC_INFO_WMV_SEQ_PRM_T rStoreSPS[WMV_MAX_SPS_NUM];
VDEC_INFO_WMV_ETRY_PRM_T rStoreEPS[WMV_MAX_EPS_NUM];
WMV_DBP_INFO_T arWMVEDpbInfo[WMV_MAX_EDPB_NUM]; // 0: FRef, 1: BRef, 2:Working
MPEG_DFB_INFO_T arWMVDFBInfo[WMV_DFB_NUM];
UCHAR ucWMVCurrICOMPSId;
VDEC_INFO_WMV_ICOMP_PRM_T rStoreICOMPS[WMV_MAX_ICOMPS_NUM];
UCHAR arICOMPSIdxTable[WMV_DFB_NUM][3];
VDEC_INFO_WMV_MV_BUF_SA_T rStoreMv[WMV_MAX_EDPB_NUM];
VDEC_INFO_WMV_SR_STORE_PRM_T rStoreParam[WMV_DFB_NUM];
#endif
BOOL fgNoDecodeSpecial;
} WMV_DRV_INFO_T;
/******************************************************************************
* Proc Function prototype
******************************************************************************/
extern BOOL fgWMVChkRealEnd(WMV_DRV_INFO_T *prWmvDrvInfo);;
extern INT32 i4WMVParser(VDEC_ES_INFO_T *prVDecEsInfo, UINT32 u4VParseType, UCHAR ucEsId);
/******************************************************************************
* Local macro
******************************************************************************/
/******************************************************************************
* IF Function prototype
******************************************************************************/
extern void vWMVInitProc(UCHAR ucEsId);
extern INT32 i4WMVVParseProc(UCHAR ucEsId, UINT32 u4VParseType);
extern BOOL fgWMVVParseChkProc(UCHAR ucEsId);
extern INT32 i4WMVUpdInfoToFbg(UCHAR ucEsId);
extern void vWMVStartToDecProc(UCHAR ucEsId);
extern void vWMVISR(UCHAR ucEsId);
extern BOOL fgIsWMVDecEnd(UCHAR ucEsId);
extern BOOL fgWMVResultChk(UCHAR ucEsId);
extern BOOL fgIsWMVInsToDispQ(UCHAR ucEsId);
extern BOOL fgIsWMVGetFrmToDispQ(UCHAR ucEsId);
extern void vWMVEndProc(UCHAR ucEsId);
extern BOOL fgWMVFlushDPB(UCHAR ucEsId, BOOL fgWithOutput);
extern void vWMVReleaseProc(UCHAR ucEsId, BOOL fgResetHW);
extern INT32 i4WMVOutputProc(VDEC_ES_INFO_T *prVDecEsInfo);
extern void vWMVSetDownScaleParam(WMV_DRV_INFO_T *prWmvDrvInfo, BOOL fgEnable);
extern void vWMVDpbBufCopy(WMV_DRV_INFO_T *prWmvDrvInfo, UCHAR ucTarDpbBuf, UCHAR ucSrcDpbBuf);
extern void vWMVSetMcBufAddr(UCHAR ucFbgId, VDEC_ES_INFO_T *prVDecEsInfo);
extern void vAllocWMVWorkingArea(/*VDEC_ES_INFO_T *prVDecEsInfo,*/ UCHAR ucEsId);
extern void vFreeWMVWorkingArea(VDEC_ES_INFO_T *prVDecEsInfo);
extern void vInitVParserWMV(WMV_DRV_INFO_T *prWmvDrvInfo);
extern VDEC_DRV_IF *VDec_GetWMVIf(void);
#if ((CONFIG_CHIP_VER_CURR >= CONFIG_CHIP_VER_MT8560) && CONFIG_DRV_FTS_SUPPORT)
extern void vWMVSetLetterBoxParam(WMV_DRV_INFO_T *prWmvDrvInfo);
#endif
#ifdef MPV_DUMP_FBUF
extern void VDec_Dump_Data(UINT32 u4StartAddr, UINT32 u4FileSize, UINT32 u4FileCnt, UCHAR *pucAddStr);
#endif
#ifdef VDEC_SR_SUPPORT
//vdec_drv_wmv_if.c interface
extern BOOL fgWMVGenEDPB(UCHAR ucEsId);
extern BOOL fgWMVRestoreEDPB(UCHAR ucEsId, BOOL fgRestore);
extern BOOL fgIsWMVGetSRFrmToDispQ(UCHAR ucEsId, BOOL fgSeqEnd, BOOL fgRefPic);
extern void vWMVGetSeqFirstTarget(UCHAR ucEsId);
extern void vWMVReleaseSRDrvInfo(UCHAR ucEsId);
extern BOOL fgWMVGetDFBInfo(UCHAR ucEsId, void **prDFBInfo);
extern void vWMVRestoreSeqInfo(UCHAR ucEsId);
extern BOOL fgWMVRvsDone(UCHAR ucEsId);
extern void vWMVReleaseEDPB(UCHAR ucEsId);
//vdec_drv_wmv_proc.c interface
extern void vWMVEDpbPutBuf(VDEC_ES_INFO_T *prVDecEsInfo, WMV_DRV_INFO_T *prWMVDrvInfo, UCHAR ucSrcDpbBuf);
extern void vWMVEDpbGetBuf(VDEC_ES_INFO_T *prVDecEsInfo, WMV_DRV_INFO_T *prWMVDrvInfo, UCHAR ucTarDpbBuf);
extern INT32 i4WMVOutputProcSR(VDEC_ES_INFO_T *prVDecEsInfo);
extern void vWMVSetDFBInfo(VDEC_ES_INFO_T *prVDecEsInfo, BOOL fgIsRef);
extern void vWMVUpdPts(VDEC_ES_INFO_T *prVDecEsInfo, WMV_DRV_INFO_T *prWMVDrvInfo, BOOL fgRealOutput);
extern void vWMVUpdPtsSR(VDEC_ES_INFO_T *prVDecEsInfo, WMV_DRV_INFO_T *prWMVDrvInfo, BOOL fgRealOutput);
extern INT32 i4WMVOutputProcSR(VDEC_ES_INFO_T *prVDecEsInfo);
extern void vWMVSetDFBInfo(VDEC_ES_INFO_T *prVDecEsInfo, BOOL fgIsRef);
#endif
#ifdef DRV_VDEC_SUPPORT_FBM_OVERLAY
extern BOOL fgWMVNeedDoDscl(UCHAR ucEsId);
#endif
#endif
|