aboutsummaryrefslogtreecommitdiff
path: root/drivers/misc/mediatek/vdec/include/vdec_sr_usage.h
blob: e74a79445b7473f03636f1c96559fcff1da102e4 (plain) (blame)
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
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
#ifndef _VDEC_SR_USAGE_H_
#define _VDEC_SR_USAGE_H_

#include "drv_vdec.h"

#ifdef VDEC_SR_SUPPORT
#include "x_stl_lib.h"

#include "x_debug.h"
#include "x_assert.h"

#include "vdec_common_if.h"
#include "u_pbinf.h"
#include "vdec_usage.h"

#define SR_MAX_ES 2
#define MPV_REQ_SIZE 2
#define MPV_REQ_Q_SIZE 10
#define SRM_ESID    0
#define SR_ESID_0   2
#ifndef VDEC_OPTIMIZE_RESOURCE
#define SR_ESID_1   5
#else
#define SR_ESID_1   3
#endif
#define SR_MAX_FB_NUM 30
#define SR_FB_RESERVED_NUM 4

#define MPEG_DFB_NUM 255

#define VDEC_SR_FWD_STATE  0x1
#define    VDEC_SR_RVS_STATE   0x2
#define    VDEC_SR_STOP_STATE 0x3
#define    VDEC_SR_IDLE_STATE  0x4

#define    VDEC_FWD_NONE_STATE               0x0
#define    VDEC_FWD_INIT_STATE                 0x1
#define    VDEC_FWD_GET_NEXT_STATE        0x2
#define    VDEC_FWD_VPARSE_PROC_STATE  0x3
#define    VDEC_FWD_VPARSE_CHK_STATE    0x4
#define    VDEC_FWD_GET_FB_STATE            0x5
#define    VDEC_FWD_START_TO_DEC_STATE 0x6
#define    VDEC_FWD_DECODING_STATE        0x7
#define    VDEC_FWD_GEN_EDPB_STATE        0x8
#define    VDEC_FWD_DONE_STATE               0x9

#define    VDEC_RVS_NONE_STATE               0x0
#define    VDEC_RVS_INIT_STATE                  0x1
#define    VDEC_RVS_OUT_TARGET_STATE     0x2
#define    VDEC_RVS_GET_PREV_STATE         0x3
#define    VDEC_RVS_VPARSE_PROC_STATE   0x4
#define    VDEC_RVS_VPARSE_CHK_STATE     0x5
#define    VDEC_RVS_GET_FB_STATE             0x6
#define    VDEC_RVS_START_TO_DEC_STATE  0x7
#define    VDEC_RVS_DECODING_STATE         0x8
#define    VDEC_RVS_GET_REF_STATE            0x9
#define    VDEC_RVS_OUT_FB_STATE             0xA
#define    VDEC_RVS_DONE_STATE                0xB

#define SR_INIT                 0x0

#define SR_GETPREV_0       0x1
#define SR_UPDINFO_0       0x2
#define SR_GETFB_0           0x3
#define SR_GETNEXT_0       0x4
#define SR_FWD_WAIT_0    0x5
#define SR_FWD_STOP_REQUEST_0 0x6
#define SR_FWD_DONE_0    0x7
#define SR_RVS_DONE_0     0x8

#define SR_GETPREV_1       0x11
#define SR_UPDINFO_1       0x12
#define SR_GETFB_1           0x13
#define SR_GETNEXT_1       0x14
#define SR_FWD_WAIT_1    0x15
#define SR_FWD_STOP_REQUEST_1 0x16
#define SR_FWD_DONE_1   0x17
#define SR_RVS_DONE_1    0x18

#define SR_REQ_NONE        0xFF
#define SR_MAX_IBC           30

#define fgIsReqByPts(eType)                    (eType == VID_DEC_SR_DATA_REQ_TYPE_PTS)
#define fgIsSR(u2SRState)                     (u2SRState==VDEC_SR_FWD_STATE || u2SRState==VDEC_SR_RVS_STATE)
#define fgIsSRFwdState(u2SRState)       (u2SRState==VDEC_SR_FWD_STATE)
#define fgIsSRRvsState(u2SRState)        (u2SRState==VDEC_SR_RVS_STATE)
#define fgSRActive(ucEsId,ucActiveId)   (ucEsId==ucActiveId)
#define ucEsIdToSrId(ucEsId) ((ucEsId == SR_ESID_0)? (0): (1))
#define ucSrIdToEsId(ucSrId) ((ucSrId == 0)? (SR_ESID_0) : (SR_ESID_1))

typedef enum
{
    VDEC_RVS_GET_UNKNOWN = 0,
    VDEC_RVS_GET_PREV_1 = 1,
    VDEC_RVS_GET_NEXT_1 = 2,
    VDEC_RVS_GET_PREV_2 = 3,
} VDEC_RVS_GET_COND_T;

typedef enum
{
    VDEC_SR_STATE_PASS = 0,
    VDEC_SR_WAIT_1_TICK = 1,
    VDEC_SR_DROP_PIC = 2,
    VDEC_SR_INIT_STATE_WAIT = 0x10,
    VDEC_SR_GET_ESM_INFO_STATE_WAIT,
    VDEC_SR_VPARSE_CHK_STATE_WAIT,
    VDEC_SR_CREAT_FBG_STATE_WAIT,
    VDEC_SR_GET_FB_STATE_WAIT,
    VDEC_SR_START_TO_DEC_STATE_WAIT,
    VDEC_SR_DECODING_STATE_WAIT,
    VDEC_SR_INS_TO_DISP_Q_STATE_WAIT,
    VDEC_SR_FWD_DONE_STATE_WAIT,
    VDEC_SR_STATE_WAIT_MAX = 0xFF,
} VDEC_SR_COND_T;

typedef enum _VDEC_SR_EVENT_T
{
    VDEC_SR_EVENT_NONE               = 0,
    VDEC_SR_EVENT_CMD                 = 1 << 0,
    VDEC_SR_EVENT_AU_VPIC          = 1 << 1,
    VDEC_SR_EVENT_DEC_END          = 1 << 2,
    VDEC_SR_EVENT_GET_FB            = 1 << 3,
    VDEC_SR_EVENT_OUT_FB            = 1 << 4,
    VDEC_SR_EVENT_MAX               = 0xff,
} VDEC_SR_EVENT_T;

typedef struct _VDEC_REQ_INFO_T
{
    UINT64                                 ui8_target_picture; /* unit in PTS or offset */
    VID_DEC_SR_REBUF_TYPE_T     e_rebuf_type;       /* if the rebuffer request is from previous sequence */
    UINT32                                 ui4_num_of_seq;     /* number of sequence */
} VDEC_REQ_INFO_T;

typedef struct _MPEG_DFB_INFO_T
{
    UCHAR ucFbId;
    UCHAR ucSeqId;
    UCHAR ucGopId;
    UCHAR ucGopRefCnt;
    BOOL   fgFrmType;
    BOOL   fgFrmDec;
    BOOL   fgFrmRef;
    BOOL   fg1stFldExist;
    BOOL   fg2ndFldExist;
    BOOL   fg1stFldDec;
    BOOL   fg1stFldRef;
    BOOL   fg2ndFldDec;
    BOOL   fg2ndFldRef;
    BOOL   fgIsDecErr;
    UCHAR ucCurrRvsField;
    UINT64 u8OutFBPTS;
    UINT64 u8OutFBOft;
} MPEG_DFB_INFO_T;

typedef struct _VDEC_SR_INFO_T
{
    VID_DEC_SR_DATA_REQ_TYPE_T e_req_type;
    VDEC_RVS_GET_COND_T            e_rvs_get_cond;
    UCHAR  ucSRMId;
    UINT16  u2SRState;
    UINT16  u2FWDState;
    UINT16  u2RVSState;
    UINT64  u8Target;
    BOOL     fgNextSeq;
    BOOL     fgvideoNotExist;
    UINT64     u8NoVideoSeqOffset;
    BOOL     fgReleaseEDPB;
    UCHAR  ucIBCCnt;
    BOOL     fgIBCSent [SR_MAX_IBC];
    UINT32  u4DFBIdx;
    UCHAR  ucDpbSize;
    UCHAR  ucEdpbSize;
    UCHAR  ucEdpbStartIdx;
    UCHAR  ucEdpbIdx;
    BOOL    fgEdpbFull;
    BOOL    fgEdpbEmpty;
    UCHAR  ucFBOccupied;
    BOOL    fgTargetFlag;
    BOOL    fgDecErrFlag;
    BOOL    fgOutputTarget;
    BOOL    fgOutputFlag;
    //UCHAR  ucRefPicCnt;
    UINT64 u8SeqFirstTarget;
    UINT64 u8SeqFirstPts;
    UINT64 u8SeqFirstOffset;
    UINT64 u8EDpbFirstTarget;
    UINT64 u8EDpbFirstPts;
    UINT64 u8EDpbFirstOffset;
    UINT64 u8RequestPts;
    UINT64 u8RequestOffset;
    UINT16 u2SeqPicCnt;
    BOOL    fgGetFirstPic;
    BOOL    fgForceReqPrevOne;
    INT64    i8EndTime;
    BOOL    fgStreamEnd;
    BOOL    fgNoPrev;
    BOOL    fgOpenGOP;
    BOOL    fgSeqComplete;
    BOOL    fgRvsEnd;
    BOOL    fgFRefEmpty;
    BOOL    fgSeqEndForceOut;
    UINT32 u4LastReadPtr;
    MPEG_DFB_INFO_T arMPEGDFBInfo[MPEG_DFB_NUM];
    BOOL    fgIsFirstPicIVOP;
    UINT64  u8FirstPts;
    UINT64  u8FirstOffset;
    INT64    i8EpmapPTS;
    BOOL     fgDecFlag;
    BOOL    fgFstPicIsNotI;
    IBC_PathInfo   *prIbc;
} VDEC_SR_INFO_T;

typedef struct _SR_IDX_INFO_T_
{
    UINT32 u4StartIdx;
    UINT32 u4CurrIdx;
    UINT32 u4EndIdx;
} SR_IDX_INFO_T;

typedef struct _VDEC_SRM_INFO_T
{
    VID_DEC_SR_DATA_REQ_TYPE_T e_req_type;
    UINT32                                   ui4_fifo_size;
    BOOL                                     fgIsSR;
    VDEC_REQ_INFO_T                   rReqBufInfo;
    UINT16                                   u2ReqMode;
    UINT16                                   u2PrevReqMode;
    BOOL                                      fgOutputTarget;
    UCHAR                                    ucActiveId;
    UINT16                                   u2SRFlag[2];
    UINT64                                   u8SRTarget;
    UINT64                                   u8Target[2];
    UCHAR                                    ucTotalFBNum;
    UINT16                                   u2SRState[2];
    SR_IDX_INFO_T                        e_seq_idx[2];
    SR_IDX_INFO_T                        e_idx_info[2];
    UCHAR                                    ucFBNumLeft[2];
    UINT32                                   u4StopReBufSrId;
    UINT32                                   u4StopReBufIdx;
    INT32                                    i4NextSRStartIdx;
} VDEC_SRM_INFO_T;

void VDec_SR_Init(void);
void VDec_SR_Termint(void);

//extern UCHAR ucEsIdToSrId(UCHAR ucEsId);
//extern UCHAR ucSrIdToEsId(UCHAR ucSrId);
extern UCHAR ucSrIdToVldId(UCHAR ucSrId);
extern BOOL   fgIs_SrState(UCHAR ucEsId);
extern BOOL   fgIs_SrFwdState(UCHAR ucEsId);
extern BOOL   fgIs_SrRvsState(UCHAR ucEsId);

extern void VDec_CreateSRCmdQ(UCHAR ucSrId);
extern void VDec_SetSRCmd(UCHAR ucSrId, UINT16 u2Mode);
extern void RetrieveSRCmd(UCHAR ucSrId);
extern void VDec_DeleteSRCmdQ(UCHAR ucSrId);
extern void VDEC_LockFBLeftSema(UCHAR ucSrId);
extern void VDEC_UnlockFBLeftSema(UCHAR ucSrId);

extern void VDec_CreateReqQ(void);
extern void VDec_SetSRReq(UCHAR ucEsId, UINT16 u2Mode);
extern void VDec_DeleteReqQ(void);
extern void VDEC_LockActiveSRSema(void);
extern void VDEC_UnlockActiveSRSema(void);

extern void VDec_SRModeProcess(UCHAR ucSrId);
VDEC_SR_COND_T VDec_FWDProc(UCHAR ucSrId);
VDEC_SR_COND_T VDec_RVSProc(UCHAR ucSrId);

extern BOOL fgVDecInitCodecProc(UCHAR ucEsId);
UINT32 u4IsNextPicExisted(UCHAR ucSrId, BOOL fgIsChkBefVParser);
UINT32 u4IsPrevPicExisted(UCHAR ucSrId, BOOL fgIsChkBefVParser);
BOOL fgSR_GetFBufGroup(UCHAR ucSRMId, UINT8 *pu1FBGID);
BOOL  fgIsSRFBufAvailable(UCHAR ucSrId);
BOOL  fgSRFreeFB(UCHAR ucEsId, UCHAR ucFbId, BOOL fgRefType);
BOOL fgVDec_SR_Update_Esm(UCHAR ucSrEsId, BOOL fgNext);
UINT32 VDec_SR_Get_Idx(UCHAR ucSrEsId, BOOL fgNext);
void VDec_SR_Update_Esm_Seq_Done(UCHAR ucSrEsId);
void vVDec_SR_MoveRdPtr(UCHAR ucSrEsId, UINT32 u4NewAURdIdx);
void vVDec_SR_MoveWrPtr(UCHAR ucEsId, UINT32 u4LastWrIdx);
#endif

#endif