xref: /rockchip-linux_mpp/mpp/codec/dec/avs/avsd_parse.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2015 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka  *
4*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka  * You may obtain a copy of the License at
7*437bfbebSnyanmisaka  *
8*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka  *
10*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka  * limitations under the License.
15*437bfbebSnyanmisaka  */
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #ifndef __AVSD_PARSE_H__
18*437bfbebSnyanmisaka #define __AVSD_PARSE_H__
19*437bfbebSnyanmisaka 
20*437bfbebSnyanmisaka #include "mpp_debug.h"
21*437bfbebSnyanmisaka 
22*437bfbebSnyanmisaka #include "parser_api.h"
23*437bfbebSnyanmisaka #include "mpp_bitread.h"
24*437bfbebSnyanmisaka 
25*437bfbebSnyanmisaka #include "avsd_syntax.h"
26*437bfbebSnyanmisaka #include "avsd_api.h"
27*437bfbebSnyanmisaka 
28*437bfbebSnyanmisaka #define AVSD_DBG_ERROR             (0x00000001)
29*437bfbebSnyanmisaka #define AVSD_DBG_ASSERT            (0x00000002)
30*437bfbebSnyanmisaka #define AVSD_DBG_WARNNING          (0x00000004)
31*437bfbebSnyanmisaka #define AVSD_DBG_LOG               (0x00000008)
32*437bfbebSnyanmisaka 
33*437bfbebSnyanmisaka #define AVSD_DBG_INPUT             (0x00000010)   //!< input packet
34*437bfbebSnyanmisaka #define AVSD_DBG_TIME              (0x00000020)   //!< input packet
35*437bfbebSnyanmisaka #define AVSD_DBG_SYNTAX            (0x00000040)
36*437bfbebSnyanmisaka #define AVSD_DBG_REF               (0x00000080)
37*437bfbebSnyanmisaka 
38*437bfbebSnyanmisaka #define AVSD_DBG_CALLBACK          (0x00008000)
39*437bfbebSnyanmisaka 
40*437bfbebSnyanmisaka extern RK_U32 avsd_parse_debug;
41*437bfbebSnyanmisaka 
42*437bfbebSnyanmisaka #define AVSD_PARSE_TRACE(fmt, ...)\
43*437bfbebSnyanmisaka do {\
44*437bfbebSnyanmisaka     if (AVSD_DBG_LOG & avsd_parse_debug)\
45*437bfbebSnyanmisaka         { mpp_log_f(fmt, ## __VA_ARGS__); }\
46*437bfbebSnyanmisaka } while (0)
47*437bfbebSnyanmisaka 
48*437bfbebSnyanmisaka 
49*437bfbebSnyanmisaka #define AVSD_DBG(level, fmt, ...)\
50*437bfbebSnyanmisaka do {\
51*437bfbebSnyanmisaka     if (level & avsd_parse_debug)\
52*437bfbebSnyanmisaka         { mpp_log(fmt, ## __VA_ARGS__); }\
53*437bfbebSnyanmisaka } while (0)
54*437bfbebSnyanmisaka 
55*437bfbebSnyanmisaka //!< input check
56*437bfbebSnyanmisaka #define INP_CHECK(ret, val, ...)\
57*437bfbebSnyanmisaka do{\
58*437bfbebSnyanmisaka     if ((val)) {\
59*437bfbebSnyanmisaka         ret = MPP_ERR_INIT; \
60*437bfbebSnyanmisaka         AVSD_DBG(AVSD_DBG_WARNNING, "input empty(%d).\n", __LINE__); \
61*437bfbebSnyanmisaka         goto __RETURN; \
62*437bfbebSnyanmisaka }} while (0)
63*437bfbebSnyanmisaka 
64*437bfbebSnyanmisaka //!< memory malloc check
65*437bfbebSnyanmisaka #define MEM_CHECK(ret, val, ...)\
66*437bfbebSnyanmisaka do{\
67*437bfbebSnyanmisaka     if(!(val)) {\
68*437bfbebSnyanmisaka         ret = MPP_ERR_MALLOC;\
69*437bfbebSnyanmisaka         mpp_err_f("malloc buffer error(%d).\n", __LINE__); \
70*437bfbebSnyanmisaka         goto __FAILED; \
71*437bfbebSnyanmisaka }} while (0)
72*437bfbebSnyanmisaka 
73*437bfbebSnyanmisaka //!< function return check
74*437bfbebSnyanmisaka #define FUN_CHECK(val)\
75*437bfbebSnyanmisaka do{\
76*437bfbebSnyanmisaka if ((val) < 0) {\
77*437bfbebSnyanmisaka         AVSD_DBG(AVSD_DBG_WARNNING, "Function error(%d).\n", __LINE__); \
78*437bfbebSnyanmisaka         goto __FAILED; \
79*437bfbebSnyanmisaka }} while (0)
80*437bfbebSnyanmisaka 
81*437bfbebSnyanmisaka #define MAX_STREAM_SIZE     (2*1024*1024)
82*437bfbebSnyanmisaka 
83*437bfbebSnyanmisaka //!< NALU type
84*437bfbebSnyanmisaka #define SEQUENCE_DISPLAY_EXTENTION     0x00000002
85*437bfbebSnyanmisaka #define COPYRIGHT_EXTENTION            0x00000004
86*437bfbebSnyanmisaka #define PICTURE_DISPLAY_EXTENTION      0x00000007
87*437bfbebSnyanmisaka #define CAMERA_PARAMETERS_EXTENTION    0x0000000B
88*437bfbebSnyanmisaka #define SLICE_MIN_START_CODE           0x00000100
89*437bfbebSnyanmisaka #define SLICE_MAX_START_CODE           0x000001AF
90*437bfbebSnyanmisaka #define VIDEO_SEQUENCE_START_CODE      0x000001B0
91*437bfbebSnyanmisaka #define VIDEO_SEQUENCE_END_CODE        0x000001B1
92*437bfbebSnyanmisaka #define USER_DATA_CODE                 0x000001B2
93*437bfbebSnyanmisaka #define I_PICUTRE_START_CODE           0x000001B3
94*437bfbebSnyanmisaka #define EXTENSION_START_CODE           0x000001B5
95*437bfbebSnyanmisaka #define PB_PICUTRE_START_CODE          0x000001B6
96*437bfbebSnyanmisaka #define VIDEO_EDIT_CODE                0x000001B7
97*437bfbebSnyanmisaka #define VIDEO_TIME_CODE                0x000001E0
98*437bfbebSnyanmisaka 
99*437bfbebSnyanmisaka 
100*437bfbebSnyanmisaka #define EDGE_SIZE                     16
101*437bfbebSnyanmisaka #define MB_SIZE                       16
102*437bfbebSnyanmisaka #define YUV420                         0
103*437bfbebSnyanmisaka 
104*437bfbebSnyanmisaka //!< picture type
105*437bfbebSnyanmisaka enum avsd_picture_type_e {
106*437bfbebSnyanmisaka     I_PICTURE = 0,
107*437bfbebSnyanmisaka     P_PICTURE = 1,
108*437bfbebSnyanmisaka     B_PICTURE = 2
109*437bfbebSnyanmisaka };
110*437bfbebSnyanmisaka 
111*437bfbebSnyanmisaka typedef struct avsd_sequence_header_t {
112*437bfbebSnyanmisaka     RK_U8  profile_id;
113*437bfbebSnyanmisaka     RK_U8  level_id;
114*437bfbebSnyanmisaka     RK_U8  progressive_sequence;
115*437bfbebSnyanmisaka     RK_U8  version;
116*437bfbebSnyanmisaka     RK_U32 horizontal_size;
117*437bfbebSnyanmisaka     RK_U32 vertical_size;
118*437bfbebSnyanmisaka 
119*437bfbebSnyanmisaka     RK_U8  chroma_format;
120*437bfbebSnyanmisaka     RK_U8  sample_precision;
121*437bfbebSnyanmisaka     RK_U8  aspect_ratio;
122*437bfbebSnyanmisaka     RK_U8  frame_rate_code;
123*437bfbebSnyanmisaka     RK_U32 bit_rate;
124*437bfbebSnyanmisaka     RK_U8  low_delay;
125*437bfbebSnyanmisaka     RK_U8  version_checked;
126*437bfbebSnyanmisaka     RK_U32 bbv_buffer_size;
127*437bfbebSnyanmisaka } AvsdSeqHeader_t;
128*437bfbebSnyanmisaka 
129*437bfbebSnyanmisaka //!< sequence display extension header
130*437bfbebSnyanmisaka typedef struct avsd_seqence_extension_header_t {
131*437bfbebSnyanmisaka     RK_U32 video_format;
132*437bfbebSnyanmisaka     RK_U32 sample_range;
133*437bfbebSnyanmisaka     RK_U32 color_description;
134*437bfbebSnyanmisaka     RK_U32 color_primaries;
135*437bfbebSnyanmisaka     RK_U32 transfer_characteristics;
136*437bfbebSnyanmisaka     RK_U32 matrix_coefficients;
137*437bfbebSnyanmisaka     RK_U32 display_horizontalSize;
138*437bfbebSnyanmisaka     RK_U32 display_verticalSize;
139*437bfbebSnyanmisaka } AvsdSeqExtHeader_t;
140*437bfbebSnyanmisaka 
141*437bfbebSnyanmisaka typedef struct avsd_picture_header {
142*437bfbebSnyanmisaka     RK_U16 bbv_delay;
143*437bfbebSnyanmisaka     RK_U16 bbv_delay_extension;
144*437bfbebSnyanmisaka 
145*437bfbebSnyanmisaka     RK_U8  picture_coding_type;
146*437bfbebSnyanmisaka     RK_U8  time_code_flag;
147*437bfbebSnyanmisaka     RK_U32 time_code;
148*437bfbebSnyanmisaka     RK_U8  picture_distance;        // poc
149*437bfbebSnyanmisaka     RK_U32 bbv_check_times;
150*437bfbebSnyanmisaka     RK_U8  progressive_frame;
151*437bfbebSnyanmisaka     RK_U8  picture_structure;
152*437bfbebSnyanmisaka     RK_U8  advanced_pred_mode_disable;
153*437bfbebSnyanmisaka     RK_U8  top_field_first;
154*437bfbebSnyanmisaka     RK_U8  repeat_first_field;
155*437bfbebSnyanmisaka     RK_U8  fixed_picture_qp;
156*437bfbebSnyanmisaka     RK_U8  picture_qp;
157*437bfbebSnyanmisaka     RK_U8  picture_reference_flag;
158*437bfbebSnyanmisaka 
159*437bfbebSnyanmisaka     RK_U8  no_forward_reference_flag;
160*437bfbebSnyanmisaka     RK_U8  pb_field_enhanced_flag;
161*437bfbebSnyanmisaka 
162*437bfbebSnyanmisaka     RK_U8  skip_mode_flag;
163*437bfbebSnyanmisaka     RK_U8  loop_filter_disable;
164*437bfbebSnyanmisaka     RK_U8  loop_filter_parameter_flag;
165*437bfbebSnyanmisaka     RK_U32 alpha_c_offset;
166*437bfbebSnyanmisaka     RK_U32 beta_offset;
167*437bfbebSnyanmisaka 
168*437bfbebSnyanmisaka     RK_U8  weighting_quant_flag;
169*437bfbebSnyanmisaka     RK_U8  chroma_quant_param_disable;
170*437bfbebSnyanmisaka     RK_S32 chroma_quant_param_delta_cb;
171*437bfbebSnyanmisaka     RK_S32 chroma_quant_param_delta_cr;
172*437bfbebSnyanmisaka     RK_U32 weighting_quant_param_index;
173*437bfbebSnyanmisaka     RK_U32 weighting_quant_model;
174*437bfbebSnyanmisaka     RK_S32 weighting_quant_param_delta1[6];
175*437bfbebSnyanmisaka     RK_S32 weighting_quant_param_delta2[6];
176*437bfbebSnyanmisaka     RK_S32 weighting_quant_param[6];
177*437bfbebSnyanmisaka     RK_U8  aec_enable;
178*437bfbebSnyanmisaka } AvsdPicHeader_t;
179*437bfbebSnyanmisaka 
180*437bfbebSnyanmisaka typedef struct avsd_frame_t {
181*437bfbebSnyanmisaka     RK_U32   valid;
182*437bfbebSnyanmisaka     RK_U32   idx;
183*437bfbebSnyanmisaka 
184*437bfbebSnyanmisaka     RK_U32   pic_type;
185*437bfbebSnyanmisaka     RK_U32   frame_mode; //!< set mpp frame flag
186*437bfbebSnyanmisaka     RK_U32   width;
187*437bfbebSnyanmisaka     RK_U32   height;
188*437bfbebSnyanmisaka     RK_U32   ver_stride;
189*437bfbebSnyanmisaka     RK_U32   hor_stride;
190*437bfbebSnyanmisaka     RK_S64   pts;
191*437bfbebSnyanmisaka     RK_S64   dts;
192*437bfbebSnyanmisaka 
193*437bfbebSnyanmisaka     RK_S32   stream_len;
194*437bfbebSnyanmisaka     RK_S32   stream_offset;
195*437bfbebSnyanmisaka     RK_U32   had_display;
196*437bfbebSnyanmisaka     RK_S32   slot_idx;
197*437bfbebSnyanmisaka } AvsdFrame_t;
198*437bfbebSnyanmisaka 
199*437bfbebSnyanmisaka typedef struct avsd_memory_t {
200*437bfbebSnyanmisaka     struct avsd_syntax_t       syntax;
201*437bfbebSnyanmisaka     struct avsd_frame_t        save[3];
202*437bfbebSnyanmisaka     BitReadCtx_t               bitctx;
203*437bfbebSnyanmisaka } AvsdMemory_t;
204*437bfbebSnyanmisaka 
205*437bfbebSnyanmisaka //!< decoder parameters
206*437bfbebSnyanmisaka typedef struct avs_dec_ctx_t {
207*437bfbebSnyanmisaka     MppBufSlots              frame_slots;
208*437bfbebSnyanmisaka     MppBufSlots              packet_slots;
209*437bfbebSnyanmisaka 
210*437bfbebSnyanmisaka     MppPacket                task_pkt;
211*437bfbebSnyanmisaka     RK_U32                   frame_no;
212*437bfbebSnyanmisaka     ParserCfg                init;
213*437bfbebSnyanmisaka     RK_U8                    got_eos;
214*437bfbebSnyanmisaka     RK_U32                   pkt_no;
215*437bfbebSnyanmisaka 
216*437bfbebSnyanmisaka     struct avsd_memory_t    *mem;
217*437bfbebSnyanmisaka     RK_U8                   *streambuf;
218*437bfbebSnyanmisaka     RK_U32                   stream_len;
219*437bfbebSnyanmisaka     RK_U32                   stream_size;
220*437bfbebSnyanmisaka 
221*437bfbebSnyanmisaka     BitReadCtx_t            *bx;
222*437bfbebSnyanmisaka     RK_U32                   left_length;
223*437bfbebSnyanmisaka 
224*437bfbebSnyanmisaka     AvsdSeqHeader_t          vsh;
225*437bfbebSnyanmisaka     AvsdSeqExtHeader_t       ext;
226*437bfbebSnyanmisaka     AvsdPicHeader_t          ph;
227*437bfbebSnyanmisaka     AvsdSyntax_t            *syn;
228*437bfbebSnyanmisaka     AvsdFrame_t             *dpb[2]; //!<  2 refer frames or 4 refer field
229*437bfbebSnyanmisaka     AvsdFrame_t             *cur;    //!< for decoder field
230*437bfbebSnyanmisaka 
231*437bfbebSnyanmisaka     RK_U32                   need_split;
232*437bfbebSnyanmisaka     RK_U32                   state;
233*437bfbebSnyanmisaka     RK_U32                   vop_header_found;
234*437bfbebSnyanmisaka     RK_U32                   got_vsh;
235*437bfbebSnyanmisaka     RK_U32                   got_ph;
236*437bfbebSnyanmisaka     RK_U32                   got_keyframe;
237*437bfbebSnyanmisaka     RK_U32                   mb_width;
238*437bfbebSnyanmisaka     RK_U32                   mb_height;
239*437bfbebSnyanmisaka     RK_U32                   vec_flag; //!< video_edit_code_flag
240*437bfbebSnyanmisaka 
241*437bfbebSnyanmisaka     RK_U32                   disable_error;
242*437bfbebSnyanmisaka     RK_U32                   dis_err_clr_mark;
243*437bfbebSnyanmisaka } AvsdCtx_t;
244*437bfbebSnyanmisaka 
245*437bfbebSnyanmisaka #ifdef  __cplusplus
246*437bfbebSnyanmisaka extern "C" {
247*437bfbebSnyanmisaka #endif
248*437bfbebSnyanmisaka 
249*437bfbebSnyanmisaka MPP_RET avsd_free_resource(AvsdCtx_t *p_dec);
250*437bfbebSnyanmisaka MPP_RET avsd_reset_parameters(AvsdCtx_t *p_dec);
251*437bfbebSnyanmisaka MPP_RET set_frame_output(AvsdCtx_t *p_dec, AvsdFrame_t *p);
252*437bfbebSnyanmisaka 
253*437bfbebSnyanmisaka MPP_RET avsd_set_dpb(AvsdCtx_t *p_dec, HalDecTask *task);
254*437bfbebSnyanmisaka MPP_RET avsd_commit_syntaxs(AvsdSyntax_t *syn, HalDecTask *task);
255*437bfbebSnyanmisaka MPP_RET avsd_fill_parameters(AvsdCtx_t *p_dec, AvsdSyntax_t *syn);
256*437bfbebSnyanmisaka 
257*437bfbebSnyanmisaka MPP_RET avsd_update_dpb(AvsdCtx_t *p_dec);
258*437bfbebSnyanmisaka 
259*437bfbebSnyanmisaka MPP_RET avsd_parser_split(AvsdCtx_t *ctx, MppPacket *dst, MppPacket *src);
260*437bfbebSnyanmisaka MPP_RET avsd_parse_stream(AvsdCtx_t *p_dec, HalDecTask *task);
261*437bfbebSnyanmisaka 
262*437bfbebSnyanmisaka #ifdef  __cplusplus
263*437bfbebSnyanmisaka }
264*437bfbebSnyanmisaka #endif
265*437bfbebSnyanmisaka 
266*437bfbebSnyanmisaka #endif /*__AVSD_PARSE_H__*/
267