xref: /rockchip-linux_mpp/mpp/codec/dec/m2v/m2vd_parser.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 /*
18*437bfbebSnyanmisaka  * @file        m2vd_parser.h
19*437bfbebSnyanmisaka  * @brief
20*437bfbebSnyanmisaka  * @author      lks(lks@rock-chips.com)
21*437bfbebSnyanmisaka 
22*437bfbebSnyanmisaka  * @version     1.0.0
23*437bfbebSnyanmisaka  * @history
24*437bfbebSnyanmisaka  *   2015.7.15 : Create
25*437bfbebSnyanmisaka  */
26*437bfbebSnyanmisaka 
27*437bfbebSnyanmisaka #ifndef __M2VD_PARSER_H__
28*437bfbebSnyanmisaka #define __M2VD_PARSER_H__
29*437bfbebSnyanmisaka 
30*437bfbebSnyanmisaka #include "mpp_mem.h"
31*437bfbebSnyanmisaka #include "mpp_bitread.h"
32*437bfbebSnyanmisaka 
33*437bfbebSnyanmisaka #include "parser_api.h"
34*437bfbebSnyanmisaka #include "m2vd_syntax.h"
35*437bfbebSnyanmisaka #include "m2vd_com.h"
36*437bfbebSnyanmisaka 
37*437bfbebSnyanmisaka #define M2VD_SKIP_ERROR_FRAME_EN  1
38*437bfbebSnyanmisaka #define M2VD_DEC_OK                   0
39*437bfbebSnyanmisaka #define M2VD_IFNO_CHG                 0x10
40*437bfbebSnyanmisaka #define M2VD_DEC_UNSURPORT            -1
41*437bfbebSnyanmisaka #define M2VD_DEC_MEMORY_FAIL      -2
42*437bfbebSnyanmisaka #define M2VD_DEC_FILE_END         -3
43*437bfbebSnyanmisaka #define M2VD_HW_DEC_UNKNOW_ERROR     -4
44*437bfbebSnyanmisaka #define M2VD_DEC_PICHEAD_OK       1
45*437bfbebSnyanmisaka #define M2VD_DEC_STREAM_END       2
46*437bfbebSnyanmisaka 
47*437bfbebSnyanmisaka #define TEMP_DBG_FM     0
48*437bfbebSnyanmisaka 
49*437bfbebSnyanmisaka 
50*437bfbebSnyanmisaka #define PICTURE_START_CODE      0x100
51*437bfbebSnyanmisaka #define SLICE_START_CODE_MIN    0x101
52*437bfbebSnyanmisaka #define SLICE_START_CODE_MAX    0x1AF
53*437bfbebSnyanmisaka #define USER_DATA_START_CODE    0x1B2
54*437bfbebSnyanmisaka #define SEQUENCE_HEADER_CODE    0x1B3
55*437bfbebSnyanmisaka #define SEQUENCE_ERROR_CODE     0x1B4
56*437bfbebSnyanmisaka #define EXTENSION_START_CODE    0x1B5
57*437bfbebSnyanmisaka #define SEQUENCE_END_CODE       0x1B7
58*437bfbebSnyanmisaka #define GROUP_START_CODE        0x1B8
59*437bfbebSnyanmisaka #define SYSTEM_START_CODE_MIN   0x1B9
60*437bfbebSnyanmisaka #define SYSTEM_START_CODE_MAX   0x1FF
61*437bfbebSnyanmisaka 
62*437bfbebSnyanmisaka #define ISO_END_CODE            0x1B9
63*437bfbebSnyanmisaka #define PACK_START_CODE         0x1BA
64*437bfbebSnyanmisaka #define SYSTEM_START_CODE       0x1BB
65*437bfbebSnyanmisaka 
66*437bfbebSnyanmisaka #define VIDEO_ELEMENTARY_STREAM 0x1e0
67*437bfbebSnyanmisaka #define NO_MORE_STREAM      0xffffffff
68*437bfbebSnyanmisaka 
69*437bfbebSnyanmisaka #define SEQUENCE_EXTENSION_ID                    1
70*437bfbebSnyanmisaka #define SEQUENCE_DISPLAY_EXTENSION_ID            2
71*437bfbebSnyanmisaka #define QUANT_MATRIX_EXTENSION_ID                3
72*437bfbebSnyanmisaka #define COPYRIGHT_EXTENSION_ID                   4
73*437bfbebSnyanmisaka #define SEQUENCE_SCALABLE_EXTENSION_ID           5
74*437bfbebSnyanmisaka #define PICTURE_DISPLAY_EXTENSION_ID             7
75*437bfbebSnyanmisaka #define PICTURE_CODING_EXTENSION_ID              8
76*437bfbebSnyanmisaka #define PICTURE_SPATIAL_SCALABLE_EXTENSION_ID    9
77*437bfbebSnyanmisaka #define PICTURE_TEMPORAL_SCALABLE_EXTENSION_ID  10
78*437bfbebSnyanmisaka 
79*437bfbebSnyanmisaka 
80*437bfbebSnyanmisaka typedef enum M2VDPicCodingType_e {
81*437bfbebSnyanmisaka     M2VD_CODING_TYPE_I = 1,
82*437bfbebSnyanmisaka     M2VD_CODING_TYPE_P = 2,
83*437bfbebSnyanmisaka     M2VD_CODING_TYPE_B = 3,
84*437bfbebSnyanmisaka     M2VD_CODING_TYPE_D = 4
85*437bfbebSnyanmisaka } M2VDPicCodingType;
86*437bfbebSnyanmisaka 
87*437bfbebSnyanmisaka typedef enum M2VDPicStruct_e {
88*437bfbebSnyanmisaka     M2VD_PIC_STRUCT_TOP_FIELD    = 1,
89*437bfbebSnyanmisaka     M2VD_PIC_STRUCT_BOTTOM_FIELD = 2,
90*437bfbebSnyanmisaka     M2VD_PIC_STRUCT_FRAME        = 3
91*437bfbebSnyanmisaka } M2VDPicStruct;
92*437bfbebSnyanmisaka 
93*437bfbebSnyanmisaka #define     M2VD_DBG_FILE_NUM               1
94*437bfbebSnyanmisaka #define     M2VD_DBG_FILE_W                 1
95*437bfbebSnyanmisaka #define     M2VD_BUF_SIZE_BITMEM            (512 * 1024)
96*437bfbebSnyanmisaka #define     M2VD_BUF_SIZE_QPTAB            (256)
97*437bfbebSnyanmisaka #define     M2V_OUT_FLAG                   0x1;
98*437bfbebSnyanmisaka 
99*437bfbebSnyanmisaka typedef enum M2VDBufGrpIdx_t {
100*437bfbebSnyanmisaka     M2VD_BUF_GRP_BITMEM,
101*437bfbebSnyanmisaka     M2VD_BUF_GRP_QPTAB,
102*437bfbebSnyanmisaka     M2VD_BUF_GRP_BUTT,
103*437bfbebSnyanmisaka } M2VDBufGrpIdx;
104*437bfbebSnyanmisaka 
105*437bfbebSnyanmisaka typedef struct M2VFrameHead_t {
106*437bfbebSnyanmisaka     RK_U32          frameNumber;
107*437bfbebSnyanmisaka     RK_U32          tr;
108*437bfbebSnyanmisaka     RK_U32          picCodingType;
109*437bfbebSnyanmisaka     RK_U32          totalMbInFrame;
110*437bfbebSnyanmisaka     RK_U32          frameWidth; /* in macro blocks */
111*437bfbebSnyanmisaka     RK_U32          frameHeight;    /* in macro blocks */
112*437bfbebSnyanmisaka     RK_U32          mb_width;
113*437bfbebSnyanmisaka     RK_U32          mb_height;
114*437bfbebSnyanmisaka     RK_U32          vlcSet;
115*437bfbebSnyanmisaka     RK_U32          qp;
116*437bfbebSnyanmisaka     RK_U32          frame_codelen;
117*437bfbebSnyanmisaka     // VPU_FRAME       *frame_space;
118*437bfbebSnyanmisaka     MppFrame        f;
119*437bfbebSnyanmisaka     RK_U32          flags;
120*437bfbebSnyanmisaka     RK_S32          slot_index;
121*437bfbebSnyanmisaka     //RK_U32          error_info;
122*437bfbebSnyanmisaka } M2VDFrameHead;
123*437bfbebSnyanmisaka 
124*437bfbebSnyanmisaka 
125*437bfbebSnyanmisaka /* ISO/IEC 13818-2 section 6.2.2.1:  sequence_header() */
126*437bfbebSnyanmisaka typedef struct M2VDHeadSeq_t {
127*437bfbebSnyanmisaka     RK_U32          decode_width; //horizontal_size_value
128*437bfbebSnyanmisaka     RK_U32          decode_height; //vertical_size_value
129*437bfbebSnyanmisaka     RK_S32          aspect_ratio_information;
130*437bfbebSnyanmisaka     RK_S32          frame_rate_code;
131*437bfbebSnyanmisaka     RK_S32          bit_rate_value;
132*437bfbebSnyanmisaka     RK_S32          vbv_buffer_size;
133*437bfbebSnyanmisaka     RK_S32          constrained_parameters_flag;
134*437bfbebSnyanmisaka     RK_U32          load_intra_quantizer_matrix; //[TEMP]
135*437bfbebSnyanmisaka     RK_U32          load_non_intra_quantizer_matrix; //[TEMP]
136*437bfbebSnyanmisaka     RK_U8           *pIntra_table; //intra_quantiser_matrix[64]
137*437bfbebSnyanmisaka     RK_U8           *pInter_table; //non_intra_quantiser_matrix[64]
138*437bfbebSnyanmisaka } M2VDHeadSeq;
139*437bfbebSnyanmisaka 
140*437bfbebSnyanmisaka /* ISO/IEC 13818-2 section 6.2.2.3:  sequence_extension() */
141*437bfbebSnyanmisaka typedef struct M2VDHeadSeqExt_t {
142*437bfbebSnyanmisaka     RK_U32             horizontal_size_extension; //[TEMP]
143*437bfbebSnyanmisaka     RK_U32             vertical_size_extension; //[TEMP]
144*437bfbebSnyanmisaka     RK_U32             bit_rate_extension; //[TEMP]
145*437bfbebSnyanmisaka     RK_U32             vbv_buffer_size_extension; //[TEMP]
146*437bfbebSnyanmisaka     RK_S32             profile_and_level_indication;
147*437bfbebSnyanmisaka     RK_S32             progressive_sequence;
148*437bfbebSnyanmisaka     RK_S32             chroma_format;
149*437bfbebSnyanmisaka     RK_S32             low_delay;
150*437bfbebSnyanmisaka     RK_S32             frame_rate_extension_n;
151*437bfbebSnyanmisaka     RK_S32             frame_rate_extension_d;
152*437bfbebSnyanmisaka } M2VDHeadSeqExt;
153*437bfbebSnyanmisaka 
154*437bfbebSnyanmisaka /* ISO/IEC 13818-2 section 6.2.2.6: group_of_pictures_header()  */
155*437bfbebSnyanmisaka typedef struct M2VDHeadGop_t {
156*437bfbebSnyanmisaka     RK_S32             drop_flag;
157*437bfbebSnyanmisaka     RK_S32             hour;
158*437bfbebSnyanmisaka     RK_S32             minute;
159*437bfbebSnyanmisaka     RK_S32             sec;
160*437bfbebSnyanmisaka     RK_S32             frame;
161*437bfbebSnyanmisaka     RK_S32             closed_gop;
162*437bfbebSnyanmisaka     RK_S32             broken_link;
163*437bfbebSnyanmisaka } M2VDHeadGop;
164*437bfbebSnyanmisaka 
165*437bfbebSnyanmisaka 
166*437bfbebSnyanmisaka /* ISO/IEC 13818-2 section 6.2.3: picture_header() */
167*437bfbebSnyanmisaka typedef struct M2VDHeadPic_t {
168*437bfbebSnyanmisaka     RK_S32             temporal_reference;
169*437bfbebSnyanmisaka     RK_S32             picture_coding_type;
170*437bfbebSnyanmisaka     RK_S32             pre_picture_coding_type;
171*437bfbebSnyanmisaka     RK_S32             vbv_delay;
172*437bfbebSnyanmisaka     RK_S32             full_pel_forward_vector;
173*437bfbebSnyanmisaka     RK_S32             forward_f_code;
174*437bfbebSnyanmisaka     RK_S32             full_pel_backward_vector;
175*437bfbebSnyanmisaka     RK_S32             backward_f_code;
176*437bfbebSnyanmisaka     RK_S32             pre_temporal_reference;
177*437bfbebSnyanmisaka } M2VDHeadPic;
178*437bfbebSnyanmisaka 
179*437bfbebSnyanmisaka 
180*437bfbebSnyanmisaka /* ISO/IEC 13818-2 section 6.2.2.4:  sequence_display_extension() */
181*437bfbebSnyanmisaka typedef struct M2VDHeadSeqDispExt_t {
182*437bfbebSnyanmisaka     RK_S32             video_format;
183*437bfbebSnyanmisaka     RK_S32             color_description;
184*437bfbebSnyanmisaka     RK_S32             color_primaries;
185*437bfbebSnyanmisaka     RK_S32             transfer_characteristics;
186*437bfbebSnyanmisaka     RK_S32             matrix_coefficients;
187*437bfbebSnyanmisaka } M2VDHeadSeqDispExt;
188*437bfbebSnyanmisaka 
189*437bfbebSnyanmisaka /* ISO/IEC 13818-2 section 6.2.3.1: picture_coding_extension() header */
190*437bfbebSnyanmisaka typedef struct M2VDHeadPicCodeExt_t {
191*437bfbebSnyanmisaka     RK_S32             f_code[2][2];
192*437bfbebSnyanmisaka     RK_S32             intra_dc_precision;
193*437bfbebSnyanmisaka     RK_S32             picture_structure;
194*437bfbebSnyanmisaka     RK_S32             top_field_first;
195*437bfbebSnyanmisaka     RK_S32             frame_pred_frame_dct;
196*437bfbebSnyanmisaka     RK_S32             concealment_motion_vectors;
197*437bfbebSnyanmisaka     RK_S32             q_scale_type;
198*437bfbebSnyanmisaka     RK_S32             intra_vlc_format;
199*437bfbebSnyanmisaka     RK_S32             alternate_scan;
200*437bfbebSnyanmisaka     RK_S32             repeat_first_field;
201*437bfbebSnyanmisaka     RK_S32             chroma_420_type;
202*437bfbebSnyanmisaka     RK_S32             progressive_frame;
203*437bfbebSnyanmisaka     RK_S32             composite_display_flag;
204*437bfbebSnyanmisaka     RK_S32             v_axis;
205*437bfbebSnyanmisaka     RK_S32             field_sequence;
206*437bfbebSnyanmisaka     RK_S32             sub_carrier;
207*437bfbebSnyanmisaka     RK_S32             burst_amplitude;
208*437bfbebSnyanmisaka     RK_S32             sub_carrier_phase;
209*437bfbebSnyanmisaka } M2VDHeadPicCodeExt;
210*437bfbebSnyanmisaka 
211*437bfbebSnyanmisaka 
212*437bfbebSnyanmisaka /* ISO/IEC 13818-2 section 6.2.3.3: picture_display_extension() header */
213*437bfbebSnyanmisaka typedef struct M2VDHeadPicDispExt_t {
214*437bfbebSnyanmisaka     RK_S32             frame_center_horizontal_offset[3];
215*437bfbebSnyanmisaka     RK_S32             frame_center_vertical_offset[3];
216*437bfbebSnyanmisaka } M2VDHeadPicDispExt;
217*437bfbebSnyanmisaka 
218*437bfbebSnyanmisaka typedef struct M2VDCombMem_t {
219*437bfbebSnyanmisaka     MppBuffer hw_buf;
220*437bfbebSnyanmisaka     RK_U8*    sw_buf;
221*437bfbebSnyanmisaka     RK_U8     buf_size;
222*437bfbebSnyanmisaka     RK_U8*    sw_pos;
223*437bfbebSnyanmisaka     RK_U32    length;
224*437bfbebSnyanmisaka } M2VDCombMem;
225*437bfbebSnyanmisaka 
226*437bfbebSnyanmisaka typedef struct M2VDParserContext_t {
227*437bfbebSnyanmisaka     MppDecCfgSet    *cfg;
228*437bfbebSnyanmisaka     M2VDDxvaParam   *dxva_ctx;
229*437bfbebSnyanmisaka     BitReadCtx_t    *bitread_ctx;
230*437bfbebSnyanmisaka     RK_U8           *bitstream_sw_buf;
231*437bfbebSnyanmisaka     RK_U8           *qp_tab_sw_buf;
232*437bfbebSnyanmisaka     RK_U32          max_stream_size;
233*437bfbebSnyanmisaka     RK_U32          left_length;
234*437bfbebSnyanmisaka     RK_U32          state;
235*437bfbebSnyanmisaka     RK_U32          vop_header_found;
236*437bfbebSnyanmisaka 
237*437bfbebSnyanmisaka     RK_U32          frame_size;
238*437bfbebSnyanmisaka 
239*437bfbebSnyanmisaka     RK_U32          display_width;
240*437bfbebSnyanmisaka     RK_U32          display_height;
241*437bfbebSnyanmisaka     RK_U32          frame_width;
242*437bfbebSnyanmisaka     RK_U32          frame_height;
243*437bfbebSnyanmisaka     RK_U32          mb_width;
244*437bfbebSnyanmisaka     RK_U32          mb_height;
245*437bfbebSnyanmisaka     RK_U32          MPEG2_Flag;
246*437bfbebSnyanmisaka 
247*437bfbebSnyanmisaka     RK_U32          info_changed;
248*437bfbebSnyanmisaka     M2VDHeadSeq         seq_head;
249*437bfbebSnyanmisaka     M2VDHeadSeqExt      seq_ext_head;
250*437bfbebSnyanmisaka     M2VDHeadGop         gop_head;
251*437bfbebSnyanmisaka     M2VDHeadPic         pic_head;
252*437bfbebSnyanmisaka     M2VDHeadSeqDispExt  seq_disp_ext_head;
253*437bfbebSnyanmisaka     M2VDHeadPicCodeExt  pic_code_ext_head;
254*437bfbebSnyanmisaka     M2VDHeadPicDispExt  pic_disp_ext_head;
255*437bfbebSnyanmisaka 
256*437bfbebSnyanmisaka     RK_S32             resetFlag;
257*437bfbebSnyanmisaka 
258*437bfbebSnyanmisaka     RK_U64          pre_pts_27M;
259*437bfbebSnyanmisaka     RK_S64          group_start_time_27M;
260*437bfbebSnyanmisaka     RK_U32          group_frm_cnt;
261*437bfbebSnyanmisaka     RK_U32          pretemporal_reference;
262*437bfbebSnyanmisaka     RK_U32          pretime_temporal;
263*437bfbebSnyanmisaka     RK_U32          max_temporal_reference;
264*437bfbebSnyanmisaka     RK_U32          prechange_temporal_ref;
265*437bfbebSnyanmisaka     RK_S32          frame_period;
266*437bfbebSnyanmisaka     RK_S32          preframe_period;
267*437bfbebSnyanmisaka     RK_U32          maxFrame_inGOP;
268*437bfbebSnyanmisaka     RK_U32          pts_is_90K;
269*437bfbebSnyanmisaka     RK_U32          ref_frame_cnt;
270*437bfbebSnyanmisaka     long long       top_first_cnt;
271*437bfbebSnyanmisaka     long long       bottom_first_cnt;
272*437bfbebSnyanmisaka     RK_S32          mHeaderDecFlag;
273*437bfbebSnyanmisaka     RK_S32          mExtraHeaderDecFlag;
274*437bfbebSnyanmisaka     M2VDFrameHead   Framehead[3];
275*437bfbebSnyanmisaka     M2VDFrameHead   *frame_ref0;
276*437bfbebSnyanmisaka     M2VDFrameHead   *frame_ref1;
277*437bfbebSnyanmisaka     M2VDFrameHead   *frame_cur;
278*437bfbebSnyanmisaka #if M2VD_SKIP_ERROR_FRAME_EN
279*437bfbebSnyanmisaka     RK_S32           mHwDecStatus;
280*437bfbebSnyanmisaka #endif
281*437bfbebSnyanmisaka     RK_S32           flush_dpb_eos;
282*437bfbebSnyanmisaka 
283*437bfbebSnyanmisaka     MppPacket       input_packet;
284*437bfbebSnyanmisaka     RK_U32          eos;
285*437bfbebSnyanmisaka 
286*437bfbebSnyanmisaka     RK_S32          initFlag;
287*437bfbebSnyanmisaka     RK_S32          decoder_err;
288*437bfbebSnyanmisaka 
289*437bfbebSnyanmisaka     MppBufSlots     packet_slots;
290*437bfbebSnyanmisaka     MppBufSlots     frame_slots;
291*437bfbebSnyanmisaka     RK_U32          cur_slot_index;
292*437bfbebSnyanmisaka     MppDecCfgSet    *dec_cfg;
293*437bfbebSnyanmisaka 
294*437bfbebSnyanmisaka     RK_U64 pts;
295*437bfbebSnyanmisaka     RK_U64 dts;
296*437bfbebSnyanmisaka 
297*437bfbebSnyanmisaka     FILE *fp_dbg_file[M2VD_DBG_FILE_NUM];
298*437bfbebSnyanmisaka     FILE *fp_dbg_yuv;
299*437bfbebSnyanmisaka } M2VDParserContext;
300*437bfbebSnyanmisaka 
301*437bfbebSnyanmisaka MPP_RET  m2vd_parser_init   (void *ctx, ParserCfg *cfg);
302*437bfbebSnyanmisaka MPP_RET  m2vd_parser_deinit (void *ctx);
303*437bfbebSnyanmisaka MPP_RET  m2vd_parser_reset  (void *ctx);
304*437bfbebSnyanmisaka MPP_RET  m2vd_parser_flush  (void *ctx);
305*437bfbebSnyanmisaka MPP_RET  m2vd_parser_control(void *ctx, MpiCmd cmd_type, void *param);
306*437bfbebSnyanmisaka MPP_RET  m2vd_parser_prepare(void *ctx, MppPacket pkt, HalDecTask *task);
307*437bfbebSnyanmisaka MPP_RET  m2vd_parser_parse  (void *ctx, HalDecTask *task);
308*437bfbebSnyanmisaka MPP_RET  m2vd_parser_callback(void *ctx, void *err_info);
309*437bfbebSnyanmisaka 
310*437bfbebSnyanmisaka #endif
311*437bfbebSnyanmisaka 
312