hc
2024-01-05 071106ecf68c401173c58808b1cf5f68cc50d390
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
/*
 * Copyright 2020 Rockchip Electronics Co. LTD
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */
 
#ifndef INCLUDE_RT_MPI_RK_COMM_VDEC_H_
 
#define INCLUDE_RT_MPI_RK_COMM_VDEC_H_
#include "rk_type.h"
#include "rk_common.h"
#include "rk_errno.h"
#include "rk_comm_video.h"
#include "rk_comm_mb.h"
 
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif /* End of #ifdef __cplusplus */
 
#define RK_IO_BLOCK               RK_TRUE
#define RK_IO_NOBLOCK             RK_FALSE
 
typedef enum rkVIDEO_DEC_MODE_E {
    VIDEO_DEC_MODE_IPB = 0,
    VIDEO_DEC_MODE_IP,
    VIDEO_DEC_MODE_I,
    VIDEO_DEC_MODE_BUTT
} VIDEO_DEC_MODE_E;
 
typedef enum rkVIDEO_OUTPUT_ORDER_E {
    VIDEO_OUTPUT_ORDER_DISP = 0,
    VIDEO_OUTPUT_ORDER_DEC,
    VIDEO_OUTPUT_ORDER_BUTT
} VIDEO_OUTPUT_ORDER_E;
 
typedef enum rkVIDEO_MODE_E {
    VIDEO_MODE_STREAM = 0, /* send by stream */
    VIDEO_MODE_FRAME, /* send by frame  */
    VIDEO_MODE_COMPAT, /* One frame supports multiple packets sending. */
    /* The current frame is considered to end when bEndOfFrame is equal to RK_TRUE */
    VIDEO_MODE_BUTT
} VIDEO_MODE_E;
 
typedef struct rkVDEC_PARAM_VIDEO_S {
    RK_BOOL bDeiEn; /* RW, deinterlace enable */
    RK_S32 s32ErrThreshold; /* RW, Range: [0, 100]; */
    /* threshold for stream error process, 0: discard with any error, 100 : keep data with any error */
    VIDEO_DEC_MODE_E enDecMode; /* RW; */
    /* decode mode , 0: deocde IPB frames, 1: only decode I frame & P frame , 2: only decode I frame */
    VIDEO_OUTPUT_ORDER_E enOutputOrder; /* RW; */
    /* frames output order ,0: the same with display order , 1: the same width decoder order */
    COMPRESS_MODE_E enCompressMode; /* RW; compress mode */
    VIDEO_FORMAT_E enVideoFormat; /* RW; video format */
} VDEC_PARAM_VIDEO_S;
 
typedef struct rkVDEC_PARAM_PICTURE_S {
    PIXEL_FORMAT_E enPixelFormat; /* RW; out put pixel format */
    RK_U32 u32Alpha; /* RW, Range: [0, 255]; value 0 is transparent. */
    /* [0 ,127]   is deemed to transparent when enPixelFormat is ARGB1555 or ABGR1555
     * [128 ,256] is deemed to non-transparent when enPixelFormat is ARGB1555 or ABGR1555
     */
} VDEC_PARAM_PICTURE_S;
 
typedef struct rkVDEC_CHN_PARAM_S {
    RK_CODEC_ID_E enType; /* RW; video type to be decoded   */
    RK_U32 u32DisplayFrameNum; /* RW, Range: [0, 16]; display frame num */
    union {
        VDEC_PARAM_VIDEO_S stVdecVideoParam; /* structure with video ( h265/h264/mpeg2/mpeg4) */
        VDEC_PARAM_PICTURE_S stVdecPictureParam; /* structure with picture (jpeg/mjpeg ) */
    };
} VDEC_CHN_PARAM_S;
 
typedef struct rkVDEC_ATTR_VIDEO_S {
    RK_U32 u32RefFrameNum; /* RW, Range: [0, 16]; reference frame num. */
    RK_BOOL bTemporalMvpEnable; /* RW; */
    /* specifies whether temporal motion vector predictors can be used for inter prediction */
    RK_U32 u32TmvBufSize; /* RW; tmv buffer size(Byte) */
} VDEC_ATTR_VIDEO_S;
 
typedef struct rkVDEC_CHN_ATTR_S {
    VIDEO_MODE_E enMode;
    RK_CODEC_ID_E enType; /* RW; video type to be decoded   */
    RK_U32 u32PicWidth; /* RW; pic width */
    RK_U32 u32PicHeight; /* RW; pic height */
    RK_U32 u32PicVirWidth; /* RW; pic virtual width */
    RK_U32 u32PicVirHeight; /* RW; pic  virtual height */
    RK_U32 u32StreamBufSize; /* RW; stream buffer size(Byte) */
    RK_U32 u32FrameBufSize; /* RW; frame buffer size(Byte) */
    RK_U32 u32FrameBufCnt; /* RW; frame buffer cnt */
    RK_U32 u32StreamBufCnt; /* RW; stream buffer cnt */
    union {
        VDEC_ATTR_VIDEO_S stVdecVideoAttr; /* structure with video ( h264/h265) */
    };
} VDEC_CHN_ATTR_S;
 
typedef struct rkVDEC_STREAM_S {
    MB_BLK  pMbBlk;
    RK_U32  u32Len; /* W; stream len */
    RK_U64  u64PTS; /* W; time stamp */
    RK_BOOL bEndOfStream; /* W; is the end of all stream */
    RK_BOOL bEndOfFrame; /* W; is the end of frame */
    RK_BOOL bBypassMbBlk; /* FALSE: copy, TRUE: MbBlock owned by internal */
} VDEC_STREAM_S;
 
typedef struct rkVDEC_DECODE_ERROR_S {
    RK_S32 s32FormatErr; /* R; format error. eg: do not support filed */
    RK_S32 s32PicSizeErrSet; /* R; picture width or height is larger than chnnel width or height */
    RK_S32 s32StreamUnsprt; /* R; unsupport the stream specification */
    RK_S32 s32PackErr; /* R; stream package error */
    RK_S32 s32PrtclNumErrSet; /* R; protocol num is not enough. eg: slice, pps, sps */
    RK_S32 s32RefErrSet; /* R; refrence num is not enough */
    RK_S32 s32PicBufSizeErrSet; /* R; the buffer size of picture is not enough */
    RK_S32 s32StreamSizeOver; /* R; the stream size is too big and and force discard stream */
    RK_S32 s32VdecStreamNotRelease; /* R; the stream not released for too long time */
} VDEC_DECODE_ERROR_S;
 
typedef struct rkVDEC_CHN_STATUS_S {
    RK_CODEC_ID_E enType; /* R; video type to be decoded */
    RK_U32 u32LeftStreamBytes; /* R; left stream bytes waiting for decode */
    RK_U32 u32LeftStreamFrames; /* R; left frames waiting for decode,only valid for VIDEO_MODE_FRAME */
    RK_U32 u32LeftPics; /* R; pics waiting for output */
    RK_BOOL bStartRecvStream; /* R; had started recv stream? */
    RK_U32 u32RecvStreamFrames; /* R; how many frames of stream has been received. valid when send by frame. */
    RK_U32 u32DecodeStreamFrames; /* R; how many frames of stream has been decoded. valid when send by frame. */
    VDEC_DECODE_ERROR_S stVdecDecErr; /* R; information about decode error */
    RK_U32 u32Width;
    RK_U32 u32Height;
} VDEC_CHN_STATUS_S;
 
typedef enum rkVDEC_EVNT_E {
    VDEC_EVNT_STREAM_ERR = 1,
    VDEC_EVNT_UNSUPPORT,
    VDEC_EVNT_OVER_REFTHR,
    VDEC_EVNT_REF_NUM_OVER,
    VDEC_EVNT_SLICE_NUM_OVER,
    VDEC_EVNT_SPS_NUM_OVER,
    VDEC_EVNT_PPS_NUM_OVER,
    VDEC_EVNT_PICBUF_SIZE_ERR,
    VDEC_EVNT_SIZE_OVER,
    VDEC_EVNT_IMG_SIZE_CHANGE,
    VDEC_EVNT_VPS_NUM_OVER,
    VDEC_EVNT_BUTT
} VDEC_EVNT_E;
 
typedef struct rkVDEC_PICTURE_MOD_PARAM_S {
    RK_U32 u32MaxPicWidth;
    RK_U32 u32MaxPicHeight;
    RK_BOOL bSupportProgressive;
    RK_BOOL bDynamicAllocate;
} VDEC_PICTURE_MOD_PARAM_S;
 
typedef struct rkVDEC_VIDEO_MOD_PARAM_S {
    RK_U32 u32MaxPicWidth;
    RK_U32 u32MaxPicHeight;
    RK_U32 u32MaxSliceNum;
    RK_U32 u32VdhMsgNum;
    RK_U32 u32VdhBinSize;
    RK_U32 u32VdhExtMemLevel;
} VDEC_VIDEO_MOD_PARAM_S;
 
typedef struct rkVDEC_MOD_PARAM_S {
    MB_SOURCE_E enVdecMBSource; /* RW, Range: [1, 3];  frame buffer mode  */
    RK_U32 u32MiniBufMode; /* RW, Range: [0, 1];  stream buffer mode */
    RK_U32 u32ParallelMode; /* RW, Range: [0, 1];  VDH working mode   */
    VDEC_VIDEO_MOD_PARAM_S stVideoModParam;
    VDEC_PICTURE_MOD_PARAM_S stPictureModParam;
} VDEC_MOD_PARAM_S;
 
/*********************************************************************************************/
/* invlalid channel ID */
#define RK_ERR_VDEC_INVALID_CHNID RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_INVALID_CHNID)
/* at lease one parameter is illagal ,eg, an illegal enumeration value  */
#define RK_ERR_VDEC_ILLEGAL_PARAM RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_ILLEGAL_PARAM)
/* channel exists */
#define RK_ERR_VDEC_EXIST         RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_EXIST)
/* using a NULL point */
#define RK_ERR_VDEC_NULL_PTR      RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_NULL_PTR)
/* try to enable or initialize system,device or channel, before configing attribute */
#define RK_ERR_VDEC_NOT_CONFIG    RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_NOT_CONFIG)
/* operation is not supported by NOW */
#define RK_ERR_VDEC_NOT_SUPPORT   RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_NOT_SUPPORT)
/* operation is not permitted ,eg, try to change stati attribute */
#define RK_ERR_VDEC_NOT_PERM      RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_NOT_PERM)
/* the channle is not existed  */
#define RK_ERR_VDEC_UNEXIST       RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_UNEXIST)
/* failure caused by malloc memory */
#define RK_ERR_VDEC_NOMEM         RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_NOMEM)
/* failure caused by malloc buffer */
#define RK_ERR_VDEC_NOBUF         RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_NOBUF)
/* no data in buffer */
#define RK_ERR_VDEC_BUF_EMPTY     RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_BUF_EMPTY)
/* no buffer for new data */
#define RK_ERR_VDEC_BUF_FULL      RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_BUF_FULL)
/* system is not ready,had not initialed or loaded */
#define RK_ERR_VDEC_SYS_NOTREADY  RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_NOTREADY)
/* system busy */
#define RK_ERR_VDEC_BUSY          RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_BUSY)
/* bad address,  eg. used for copy_from_user & copy_to_user   */
#define RK_ERR_VDEC_BADADDR       RK_DEF_ERR(RK_ID_VDEC, RK_ERR_LEVEL_ERROR, RK_ERR_BADADDR)
 
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* End of #ifdef __cplusplus */
 
#endif /* End of #ifndef  INCLUDE_RT_MPI_RK_COMM_VDEC_H_ */