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
|
#ifndef _VDEC_DRV_RM_INFO_H_
#define _VDEC_DRV_RM_INFO_H_
//#include "x_os.h"
//#include "x_bim.h"
//#include "x_assert.h"
//#include "x_timer.h"
#include "drv_common.h"
#include "drv_imgresz.h"
#include "drv_imgresz_errcode.h"
#include "vdec_common_if.h"
#include "vdec_usage.h"
#include "vdec_info_rm.h"
#include "vdec_info_common.h"
/******************************************************************************
* Local definition
******************************************************************************/
#define RM_DPB_NUM 3
typedef enum
{
RM_DPB_STATUS_EMPTY = 0, // Free
RM_DPB_STATUS_READY, // After Get
RM_DPB_STATUS_DECODING, // After Lock
RM_DPB_STATUS_DECODED, // After UnLock
RM_DPB_STATUS_OUTPUTTED, // After Output
RM_DPB_STATUS_FLD_DECODED, // After 1fld UnLock
RM_DPB_STATUS_DEC_REF,
RM_DPB_STATUS_OUT_REF,
} RM_DPB_COND_T;
typedef enum
{
RM_DPB_FBUF_UNKNOWN = VDEC_FB_ID_UNKNOWN,
RM_DPB_FREF_FBUF = 0,
RM_DPB_BREF_FBUF = 1,
RM_DPB_WORKING_FBUF = 2,
} RM_DPB_IDX_T;
typedef struct _RM_DBP_INFO_T
{
BOOL fgVirtualDec;
UCHAR ucDpbFbId;
RM_DPB_COND_T eDpbStatus;
UINT64 u8Pts;
UINT64 u8Offset;
} RM_DBP_INFO_T;
typedef struct _RM_DEC_PRM_T
{
BOOL fgRV40; // Is RV9_RV10 ro RV8
BOOL fgGenRPRRefPic;
UCHAR ucDecFld;
UCHAR uc2ndFld;
UINT32 u4BitCount;
INT64 i8BasePTS;
INT64 i8LatestRealPTS;
INT64 i8DiffCnt;
INT64 i8DropIPCnt;
INT64 i8DropBCnt;
INT64 i8DummyCnt;
UINT64 u8PreFrmOffset;
RM_DPB_IDX_T eDpbOutputId;
RM_DBP_INFO_T arRMDpbInfo[RM_DPB_NUM]; // 0: FRef, 1: BRef, 2:Working
VDEC_NORM_INFO_T *prVDecNormInfo;
VDEC_PIC_INFO_T *prVDecPicInfo;
VDEC_FBM_INFO_T *prVDecFbmInfo;
VID_DEC_PB_MODE_T *prVDecPBInfo;
VDEC_INFO_RM_VFIFO_PRM_T rVDecRMVFifoPrm;
VDEC_INFO_RM_WORK_BUF_SA_T rVDecRMWorkBufSa;
VDEC_INFO_RM_BS_INIT_PRM_T rVDecRMBsInitPrm[2];
VDEC_INFO_RM_ERR_INFO_T rVDecRMErrInfo;
VDEC_INFO_RM_PICINFO_T rVDecRMPicInfo;
VDEC_INFO_RM_PICINFO_T rVDecRMNextPicInfo;
VDEC_INFO_RM_PICINFO_T rVDecRMPrevPicInfo;
VDEC_INFO_DEC_PRM_T rVDecNormHalPrm;
IMGRESZ_DRV_TICKET_T rImgReszTicket;
IMGRESZ_DRV_SRC_BUF_INFO_T rSrcBufInfo;
IMGRESZ_DRV_DST_BUF_INFO_T rDstBufInfo;
HANDLE_T hRmScaleEvent;
} RM_DRV_INFO_T;
/******************************************************************************
* Function prototype
******************************************************************************/
extern INT32 vRMParser(VDEC_ES_INFO_T *prVDecEsInfo, UINT32 u4VParseType, BOOL fgNextAUPic);
//extern INT32 vRMParser(VDEC_ES_INFO_T* prVDecEsInfo, UINT32 u4VParseType);
extern void vRMSetMcBufAddr(UCHAR ucFbgId, VDEC_ES_INFO_T *prVDecEsInfo);
/******************************************************************************
* Local macro
******************************************************************************/
#define INVERSE_ENDIAN(value) \
(((value & 0xFF) << 24) + ((value & 0xFF00) << 8) + ((value & 0xFF0000) >> 8) + ((value & 0xFF000000) >> 24))
#define CCSIZE(wp, rp, bufsize) \
(((wp) >= (rp)) ? ((wp) - (rp)) : (((bufsize) + (wp)) - (rp)))
#define INVERSE_BIT_ORDER_8(value) \
{ \
UCHAR ucTemp = 0; \
INT32 i4_i; \
for( i4_i = 0; i4_i<4; i4_i++) \
{ \
ucTemp |= (value & (1 << i4_i)) << ((4-i4_i)*2 - 1); \
} \
for( i4_i = 4; i4_i<8; i4_i++) \
{ \
ucTemp |= (value & (1 << i4_i)) >> ((i4_i-4)*2 + 1); \
} \
value = ucTemp; \
}
/******************************************************************************
* Extern Function
******************************************************************************/
extern void vRMDpbBufCopy(RM_DRV_INFO_T *prRMDrvInfo, UCHAR ucTarDpbBuf, UCHAR ucSrcDpbBuf);
extern INT32 i4RMOutputProc(VDEC_ES_INFO_T *prVDecEsInfo);
extern void vFreeRMWorkingArea(VDEC_ES_INFO_T *prVDecEsInfo);
#ifdef RM_DRV_IMAGERESIZER_ENABLE
extern INT32 i4RMRPR_ResourceInit(RM_DRV_INFO_T *prRMDrvInfo);
extern INT32 i4RMRPR_ResourceFree(RM_DRV_INFO_T *prRMDrvInfo);
extern INT32 i4RMRPR_WaitFinish(RM_DRV_INFO_T *prRMDrvInfo);
extern INT32 i4RMRPR_SetTriggerScale(UCHAR ucEsId, RM_DRV_INFO_T *prRMDrvInfo);
#endif //RM_DRV_IMAGERESIZER_ENABLE
extern void vRMInitProc(UCHAR ucEsId);
extern INT32 i4RMVParseProc(UCHAR ucEsId, UINT32 u4VParseType);
extern BOOL fgRMVParseChkProc(UCHAR ucEsId);
extern INT32 i4RMUpdInfoToFbg(UCHAR ucEsId);
extern void vRMStartToDecProc(UCHAR ucEsId);
extern void vRMISR(UCHAR ucEsId);
extern BOOL fgIsRMDecEnd(UCHAR ucEsId);
extern BOOL fgIsRMDecErr(UCHAR ucEsId);
extern BOOL fgRMResultChk(UCHAR ucEsId);
extern BOOL fgIsRMInsToDispQ(UCHAR ucEsId);
extern BOOL fgIsRMGetFrmToDispQ(UCHAR ucEsId);
extern void vRMEndProc(UCHAR ucEsId);
extern BOOL fgRMFlushDPB(UCHAR ucEsId, BOOL fgWithOutput);
extern void vRMReleaseProc(UCHAR ucEsId, BOOL fgResetHW);
extern VDEC_DRV_IF *VDec_GetRMIf(void);
#if ((CONFIG_CHIP_VER_CURR >= CONFIG_CHIP_VER_MT8560) && CONFIG_DRV_FTS_SUPPORT)
extern void vRMSetLetterBoxParam(RM_DRV_INFO_T *prRMDrvInfo);
#endif
#endif // _VDEC_DRV_RM_INFO_H_
|