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