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