1*437bfbebSnyanmisaka /* 2*437bfbebSnyanmisaka * 3*437bfbebSnyanmisaka * Copyright 2015 Rockchip Electronics Co. LTD 4*437bfbebSnyanmisaka * 5*437bfbebSnyanmisaka * Licensed under the Apache License, Version 2.0 (the "License"); 6*437bfbebSnyanmisaka * you may not use this file except in compliance with the License. 7*437bfbebSnyanmisaka * You may obtain a copy of the License at 8*437bfbebSnyanmisaka * 9*437bfbebSnyanmisaka * http://www.apache.org/licenses/LICENSE-2.0 10*437bfbebSnyanmisaka * 11*437bfbebSnyanmisaka * Unless required by applicable law or agreed to in writing, software 12*437bfbebSnyanmisaka * distributed under the License is distributed on an "AS IS" BASIS, 13*437bfbebSnyanmisaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*437bfbebSnyanmisaka * See the License for the specific language governing permissions and 15*437bfbebSnyanmisaka * limitations under the License. 16*437bfbebSnyanmisaka */ 17*437bfbebSnyanmisaka 18*437bfbebSnyanmisaka #ifndef __H264D_GLOBAL_H__ 19*437bfbebSnyanmisaka #define __H264D_GLOBAL_H__ 20*437bfbebSnyanmisaka 21*437bfbebSnyanmisaka #include <stdio.h> 22*437bfbebSnyanmisaka #include "h2645d_sei.h" 23*437bfbebSnyanmisaka #include "rk_type.h" 24*437bfbebSnyanmisaka 25*437bfbebSnyanmisaka #include "mpp_debug.h" 26*437bfbebSnyanmisaka #include "mpp_bitread.h" 27*437bfbebSnyanmisaka #include "mpp_mem_pool.h" 28*437bfbebSnyanmisaka 29*437bfbebSnyanmisaka #include "h264d_syntax.h" 30*437bfbebSnyanmisaka #include "h264d_api.h" 31*437bfbebSnyanmisaka 32*437bfbebSnyanmisaka 33*437bfbebSnyanmisaka #define H264D_DBG_ERROR (0x00000001) 34*437bfbebSnyanmisaka #define H264D_DBG_ASSERT (0x00000002) 35*437bfbebSnyanmisaka #define H264D_DBG_WARNNING (0x00000004) 36*437bfbebSnyanmisaka #define H264D_DBG_LOG (0x00000008) 37*437bfbebSnyanmisaka 38*437bfbebSnyanmisaka #define H264D_DBG_INPUT (0x00000010) //!< input packet 39*437bfbebSnyanmisaka #define H264D_DBG_PPS_SPS (0x00000020) 40*437bfbebSnyanmisaka #define H264D_DBG_LOOP_STATE (0x00000040) 41*437bfbebSnyanmisaka #define H264D_DBG_PARSE_NALU (0x00000080) 42*437bfbebSnyanmisaka 43*437bfbebSnyanmisaka #define H264D_DBG_DPB_INFO (0x00000100) //!< dpb size 44*437bfbebSnyanmisaka #define H264D_DBG_DPB_MALLIC (0x00000200) //!< malloc 45*437bfbebSnyanmisaka 46*437bfbebSnyanmisaka 47*437bfbebSnyanmisaka #define H264D_DBG_DPB_REF_ERR (0x00001000) 48*437bfbebSnyanmisaka #define H264D_DBG_SLOT_FLUSH (0x00002000) //!< dpb buffer slot remain 49*437bfbebSnyanmisaka #define H264D_DBG_SEI (0x00004000) 50*437bfbebSnyanmisaka #define H264D_DBG_CALLBACK (0x00008000) 51*437bfbebSnyanmisaka 52*437bfbebSnyanmisaka #define H264D_DBG_WRITE_ES_EN (0x00010000) //!< write input ts stream 53*437bfbebSnyanmisaka #define H264D_DBG_FIELD_PAIRED (0x00020000) 54*437bfbebSnyanmisaka #define H264D_DBG_DISCONTINUOUS (0x00040000) 55*437bfbebSnyanmisaka 56*437bfbebSnyanmisaka extern RK_U32 h264d_debug; 57*437bfbebSnyanmisaka 58*437bfbebSnyanmisaka #define H264D_DBG(level, fmt, ...)\ 59*437bfbebSnyanmisaka do {\ 60*437bfbebSnyanmisaka if (level & h264d_debug)\ 61*437bfbebSnyanmisaka { mpp_log(fmt, ## __VA_ARGS__); }\ 62*437bfbebSnyanmisaka } while (0) 63*437bfbebSnyanmisaka 64*437bfbebSnyanmisaka 65*437bfbebSnyanmisaka #define H264D_ERR(fmt, ...)\ 66*437bfbebSnyanmisaka do {\ 67*437bfbebSnyanmisaka if (H264D_DBG_ERROR & h264d_debug)\ 68*437bfbebSnyanmisaka { mpp_log(fmt, ## __VA_ARGS__); }\ 69*437bfbebSnyanmisaka } while (0) 70*437bfbebSnyanmisaka 71*437bfbebSnyanmisaka #define ASSERT(val)\ 72*437bfbebSnyanmisaka do {\ 73*437bfbebSnyanmisaka if (H264D_DBG_ASSERT & h264d_debug)\ 74*437bfbebSnyanmisaka { mpp_assert(val); }\ 75*437bfbebSnyanmisaka } while (0) 76*437bfbebSnyanmisaka 77*437bfbebSnyanmisaka #define H264D_WARNNING(fmt, ...)\ 78*437bfbebSnyanmisaka do {\ 79*437bfbebSnyanmisaka if (H264D_DBG_WARNNING & h264d_debug)\ 80*437bfbebSnyanmisaka { mpp_log(fmt, ## __VA_ARGS__); }\ 81*437bfbebSnyanmisaka } while (0) 82*437bfbebSnyanmisaka 83*437bfbebSnyanmisaka #define H264D_LOG(fmt, ...)\ 84*437bfbebSnyanmisaka do {\ 85*437bfbebSnyanmisaka if (H264D_DBG_LOG & h264d_debug)\ 86*437bfbebSnyanmisaka { mpp_log(fmt, ## __VA_ARGS__); }\ 87*437bfbebSnyanmisaka } while (0) 88*437bfbebSnyanmisaka 89*437bfbebSnyanmisaka 90*437bfbebSnyanmisaka //!< vaule check 91*437bfbebSnyanmisaka #define VAL_CHECK(ret, val, ...)\ 92*437bfbebSnyanmisaka do{\ 93*437bfbebSnyanmisaka if (!(val)){\ 94*437bfbebSnyanmisaka ret = MPP_ERR_VALUE; \ 95*437bfbebSnyanmisaka H264D_WARNNING("value error(%d).\n", __LINE__); \ 96*437bfbebSnyanmisaka goto __FAILED; \ 97*437bfbebSnyanmisaka }} while (0) 98*437bfbebSnyanmisaka //!< memory malloc check 99*437bfbebSnyanmisaka #define MEM_CHECK(ret, val, ...)\ 100*437bfbebSnyanmisaka do{\ 101*437bfbebSnyanmisaka if (!(val)) {\ 102*437bfbebSnyanmisaka ret = MPP_ERR_MALLOC; \ 103*437bfbebSnyanmisaka H264D_ERR("malloc buffer error(%d).\n", __LINE__); \ 104*437bfbebSnyanmisaka goto __FAILED; \ 105*437bfbebSnyanmisaka }} while (0) 106*437bfbebSnyanmisaka 107*437bfbebSnyanmisaka 108*437bfbebSnyanmisaka //!< input check 109*437bfbebSnyanmisaka #define INP_CHECK(ret, val, ...)\ 110*437bfbebSnyanmisaka do{\ 111*437bfbebSnyanmisaka if ((val)) {\ 112*437bfbebSnyanmisaka ret = MPP_ERR_INIT; \ 113*437bfbebSnyanmisaka H264D_WARNNING("input empty(%d).\n", __LINE__); \ 114*437bfbebSnyanmisaka goto __RETURN; \ 115*437bfbebSnyanmisaka }} while (0) 116*437bfbebSnyanmisaka //!< function return check 117*437bfbebSnyanmisaka #define FUN_CHECK(val)\ 118*437bfbebSnyanmisaka do{\ 119*437bfbebSnyanmisaka if ((val) < 0) {\ 120*437bfbebSnyanmisaka H264D_WARNNING("Function error(%d).\n", __LINE__); \ 121*437bfbebSnyanmisaka goto __FAILED; \ 122*437bfbebSnyanmisaka }} while (0) 123*437bfbebSnyanmisaka 124*437bfbebSnyanmisaka 125*437bfbebSnyanmisaka #define START_PREFIX_3BYTE 3 126*437bfbebSnyanmisaka #define MAX_NUM_DPB_LAYERS 2 //!< must >= 2 127*437bfbebSnyanmisaka #define MAX_LIST_SIZE 33 //!< for init list reorder 128*437bfbebSnyanmisaka #define MAX_DPB_SIZE 16 //!< for prepare dpb info 129*437bfbebSnyanmisaka #define MAX_REF_SIZE 32 //!< for prepare ref pic info 130*437bfbebSnyanmisaka 131*437bfbebSnyanmisaka 132*437bfbebSnyanmisaka #define MAX_MARK_SIZE 35 //!< for malloc buffer mark, can be changed 133*437bfbebSnyanmisaka 134*437bfbebSnyanmisaka #define HEAD_BUF_MAX_SIZE (1*1024*1024) 135*437bfbebSnyanmisaka #define HEAD_BUF_ADD_SIZE (512) 136*437bfbebSnyanmisaka #define NALU_BUF_MAX_SIZE (2*1024*1024) 137*437bfbebSnyanmisaka #define NALU_BUF_ADD_SIZE (512) 138*437bfbebSnyanmisaka #define SODB_BUF_MAX_SIZE (2*1024*1024) 139*437bfbebSnyanmisaka #define SODB_BUF_ADD_SIZE (512) 140*437bfbebSnyanmisaka 141*437bfbebSnyanmisaka //!< PPS parameters 142*437bfbebSnyanmisaka #define MAXnum_slice_groups_minus1 8 143*437bfbebSnyanmisaka typedef enum { 144*437bfbebSnyanmisaka H264ScalingList4x4Length = 16, 145*437bfbebSnyanmisaka H264ScalingList8x8Length = 64, 146*437bfbebSnyanmisaka } ScalingListLength; 147*437bfbebSnyanmisaka 148*437bfbebSnyanmisaka typedef enum { 149*437bfbebSnyanmisaka STRUCT_NULL = 0, 150*437bfbebSnyanmisaka TOP_FIELD = 0x1, 151*437bfbebSnyanmisaka BOTTOM_FIELD = 0x2, 152*437bfbebSnyanmisaka FRAME = 0x3, 153*437bfbebSnyanmisaka STRUCT_MAX, 154*437bfbebSnyanmisaka } PictureStructure; //!< New enum for field processing 155*437bfbebSnyanmisaka 156*437bfbebSnyanmisaka typedef enum { 157*437bfbebSnyanmisaka PIC_ERR_NULL = 0, 158*437bfbebSnyanmisaka PIC_ERR_TOP = 0x1, 159*437bfbebSnyanmisaka PIC_ERR_BOT = 0x2, 160*437bfbebSnyanmisaka PIC_ERR_FRAME = 0x3, 161*437bfbebSnyanmisaka PIC_ERR_WHOLE = 0x3, 162*437bfbebSnyanmisaka PIC_ERR_MAX, 163*437bfbebSnyanmisaka } PictureError; 164*437bfbebSnyanmisaka 165*437bfbebSnyanmisaka typedef enum { 166*437bfbebSnyanmisaka FIELD_ORDER_NULL, 167*437bfbebSnyanmisaka FIELD_ORDER_TOP_FIRST, 168*437bfbebSnyanmisaka FIELD_ORDER_BOT_FIRST, 169*437bfbebSnyanmisaka FIELD_ORDER_SAME, 170*437bfbebSnyanmisaka FIELD_ORDER_MAX 171*437bfbebSnyanmisaka } FieldOrder; 172*437bfbebSnyanmisaka 173*437bfbebSnyanmisaka //!< Field Coding Types 174*437bfbebSnyanmisaka typedef enum { 175*437bfbebSnyanmisaka FRAME_CODING = 0, 176*437bfbebSnyanmisaka FIELD_CODING = 1, 177*437bfbebSnyanmisaka ADAPTIVE_CODING = 2, 178*437bfbebSnyanmisaka FRAME_MB_PAIR_CODING = 3 179*437bfbebSnyanmisaka } CodingType; 180*437bfbebSnyanmisaka 181*437bfbebSnyanmisaka typedef enum { 182*437bfbebSnyanmisaka LIST_0 = 0, 183*437bfbebSnyanmisaka LIST_1 = 1, 184*437bfbebSnyanmisaka BI_PRED = 2, 185*437bfbebSnyanmisaka BI_PRED_L0 = 3, 186*437bfbebSnyanmisaka BI_PRED_L1 = 4 187*437bfbebSnyanmisaka } ListType; 188*437bfbebSnyanmisaka 189*437bfbebSnyanmisaka //!< NAL Unit structure 190*437bfbebSnyanmisaka typedef struct h264_nalu_t { 191*437bfbebSnyanmisaka RK_S32 startcodeprefix_len; //!< 4 for parameter sets and first slice in picture, 3 for everything else (suggested) 192*437bfbebSnyanmisaka RK_U32 sodb_len; //!< Length of the NAL unit (Excluding the start code, which does not belong to the NALU) 193*437bfbebSnyanmisaka RK_S32 forbidden_bit; //!< should be always FALSE 194*437bfbebSnyanmisaka H264NaluType nalu_type; //!< NALU_TYPE_xxxx 195*437bfbebSnyanmisaka H264NalRefIdcType nal_reference_idc; //!< NALU_PRIORITY_xxxx 196*437bfbebSnyanmisaka RK_U8 *sodb_buf; //!< Data of the NAL unit (Excluding the start code, which does not belong to the NALU) 197*437bfbebSnyanmisaka RK_U16 lost_packets; //!< true, if packet loss is detected, used in RTPNALU 198*437bfbebSnyanmisaka //---- MVC extension 199*437bfbebSnyanmisaka RK_S32 svc_extension_flag; //!< should be always 0, for MVC 200*437bfbebSnyanmisaka RK_S32 non_idr_flag; //!< 0 = current is IDR 201*437bfbebSnyanmisaka RK_S32 priority_id; //!< a lower value of priority_id specifies a higher priority 202*437bfbebSnyanmisaka RK_S32 view_id; //!< view identifier for the NAL unit 203*437bfbebSnyanmisaka RK_S32 temporal_id; //!< temporal identifier for the NAL unit 204*437bfbebSnyanmisaka RK_S32 anchor_pic_flag; //!< anchor access unit 205*437bfbebSnyanmisaka RK_S32 inter_view_flag; //!< inter-view prediction enable 206*437bfbebSnyanmisaka RK_S32 reserved_one_bit; //!< shall be equal to 1 207*437bfbebSnyanmisaka RK_S32 MVCExt_is_valid; 208*437bfbebSnyanmisaka RK_S32 MVCExt_is_prefixNALU; 209*437bfbebSnyanmisaka //------ 210*437bfbebSnyanmisaka RK_U8 ualu_header_bytes; //!< for rbsp start 211*437bfbebSnyanmisaka RK_S32 used_bits; 212*437bfbebSnyanmisaka 213*437bfbebSnyanmisaka } H264_Nalu_t; 214*437bfbebSnyanmisaka 215*437bfbebSnyanmisaka typedef struct h264_nalu_svc_ext_t { 216*437bfbebSnyanmisaka RK_U32 valid; 217*437bfbebSnyanmisaka RK_U32 idr_flag; 218*437bfbebSnyanmisaka RK_U32 priority_id; 219*437bfbebSnyanmisaka RK_U32 no_inter_layer_pred_flag; 220*437bfbebSnyanmisaka RK_U32 dependency_id; 221*437bfbebSnyanmisaka RK_U32 quality_id; 222*437bfbebSnyanmisaka RK_U32 temporal_id; 223*437bfbebSnyanmisaka RK_U32 use_ref_base_pic_flag; 224*437bfbebSnyanmisaka RK_U32 discardable_flag; 225*437bfbebSnyanmisaka RK_U32 output_flag; 226*437bfbebSnyanmisaka } H264_NaluSvcExt_t; 227*437bfbebSnyanmisaka 228*437bfbebSnyanmisaka typedef struct h264_nalu_mvc_ext_t { 229*437bfbebSnyanmisaka RK_U32 valid; 230*437bfbebSnyanmisaka RK_U32 non_idr_flag; 231*437bfbebSnyanmisaka RK_U32 priority_id; 232*437bfbebSnyanmisaka RK_U32 view_id; 233*437bfbebSnyanmisaka RK_U32 temporal_id; 234*437bfbebSnyanmisaka RK_U32 anchor_pic_flag; 235*437bfbebSnyanmisaka RK_U32 inter_view_flag; 236*437bfbebSnyanmisaka RK_U32 reserved_one_bit; 237*437bfbebSnyanmisaka RK_U32 iPrefixNALU; 238*437bfbebSnyanmisaka } H264_NaluMvcExt_t; 239*437bfbebSnyanmisaka 240*437bfbebSnyanmisaka //!< decoder refence picture marking 241*437bfbebSnyanmisaka typedef struct h264_drpm_t { 242*437bfbebSnyanmisaka RK_S32 memory_management_control_operation; 243*437bfbebSnyanmisaka RK_S32 difference_of_pic_nums_minus1; 244*437bfbebSnyanmisaka RK_S32 long_term_pic_num; 245*437bfbebSnyanmisaka RK_S32 long_term_frame_idx; 246*437bfbebSnyanmisaka RK_S32 max_long_term_frame_idx_plus1; 247*437bfbebSnyanmisaka struct h264_drpm_t *Next; 248*437bfbebSnyanmisaka } H264_DRPM_t; 249*437bfbebSnyanmisaka 250*437bfbebSnyanmisaka typedef enum { 251*437bfbebSnyanmisaka Mem_NULL = 0, 252*437bfbebSnyanmisaka Mem_Malloc = 1, 253*437bfbebSnyanmisaka Mem_Clone = 2, 254*437bfbebSnyanmisaka Mem_UnPaired = 3, 255*437bfbebSnyanmisaka Mem_TopOnly = 4, 256*437bfbebSnyanmisaka Mem_BotOnly = 5, 257*437bfbebSnyanmisaka Mem_Fake = 6, 258*437bfbebSnyanmisaka Mem_Max, 259*437bfbebSnyanmisaka } H264_Mem_type; 260*437bfbebSnyanmisaka 261*437bfbebSnyanmisaka //!< decoder picture memory 262*437bfbebSnyanmisaka typedef struct h264_dpb_mark_t { 263*437bfbebSnyanmisaka RK_U8 top_used; 264*437bfbebSnyanmisaka RK_U8 bot_used; 265*437bfbebSnyanmisaka RK_U8 out_flag; 266*437bfbebSnyanmisaka RK_U8 mark_idx; 267*437bfbebSnyanmisaka MppFrame mframe; 268*437bfbebSnyanmisaka RK_S32 slot_idx; 269*437bfbebSnyanmisaka struct h264_store_pic_t *pic; 270*437bfbebSnyanmisaka } H264_DpbMark_t; 271*437bfbebSnyanmisaka 272*437bfbebSnyanmisaka //!< decoder picture buffer information 273*437bfbebSnyanmisaka typedef struct h264_dpb_info_t { 274*437bfbebSnyanmisaka RK_U8 colmv_is_used; 275*437bfbebSnyanmisaka RK_S32 slot_index; 276*437bfbebSnyanmisaka 277*437bfbebSnyanmisaka RK_S32 TOP_POC; 278*437bfbebSnyanmisaka RK_S32 BOT_POC; 279*437bfbebSnyanmisaka RK_U16 frame_num; 280*437bfbebSnyanmisaka RK_U32 field_flag; 281*437bfbebSnyanmisaka RK_U32 is_long_term; 282*437bfbebSnyanmisaka RK_U32 is_ilt_flag; 283*437bfbebSnyanmisaka RK_U32 long_term_frame_idx; 284*437bfbebSnyanmisaka RK_U32 long_term_pic_num; 285*437bfbebSnyanmisaka RK_U32 voidx; 286*437bfbebSnyanmisaka RK_U32 view_id; 287*437bfbebSnyanmisaka RK_U32 is_used; 288*437bfbebSnyanmisaka RK_U32 top_valid; 289*437bfbebSnyanmisaka RK_U32 bot_valid; 290*437bfbebSnyanmisaka struct h264_store_pic_t *refpic; 291*437bfbebSnyanmisaka 292*437bfbebSnyanmisaka RK_U32 have_same; 293*437bfbebSnyanmisaka } H264_DpbInfo_t; 294*437bfbebSnyanmisaka 295*437bfbebSnyanmisaka //!< refence picture information 296*437bfbebSnyanmisaka typedef struct h264_refpic_info_t { 297*437bfbebSnyanmisaka RK_U32 valid; 298*437bfbebSnyanmisaka RK_S32 dpb_idx; 299*437bfbebSnyanmisaka RK_S32 bottom_flag; 300*437bfbebSnyanmisaka } H264_RefPicInfo_t; 301*437bfbebSnyanmisaka 302*437bfbebSnyanmisaka //!< definition a picture (field or frame) 303*437bfbebSnyanmisaka typedef struct h264_store_pic_t { 304*437bfbebSnyanmisaka RK_S32 structure; 305*437bfbebSnyanmisaka RK_S32 poc; 306*437bfbebSnyanmisaka RK_S32 top_poc; 307*437bfbebSnyanmisaka RK_S32 bottom_poc; 308*437bfbebSnyanmisaka RK_S32 frame_poc; 309*437bfbebSnyanmisaka RK_S32 ThisPOC; 310*437bfbebSnyanmisaka RK_S32 pic_num; 311*437bfbebSnyanmisaka RK_S32 long_term_pic_num; 312*437bfbebSnyanmisaka RK_S32 long_term_frame_idx; 313*437bfbebSnyanmisaka 314*437bfbebSnyanmisaka RK_U32 frame_num; 315*437bfbebSnyanmisaka RK_U8 is_long_term; 316*437bfbebSnyanmisaka RK_S32 used_for_reference; 317*437bfbebSnyanmisaka RK_S32 is_output; 318*437bfbebSnyanmisaka RK_S32 non_existing; 319*437bfbebSnyanmisaka RK_S16 max_slice_id; 320*437bfbebSnyanmisaka RK_S32 mb_aff_frame_flag; 321*437bfbebSnyanmisaka RK_U32 PicWidthInMbs; 322*437bfbebSnyanmisaka RK_U8 colmv_no_used_flag; 323*437bfbebSnyanmisaka struct h264_store_pic_t *top_field; //!< for mb aff, if frame for referencing the top field 324*437bfbebSnyanmisaka struct h264_store_pic_t *bottom_field; //!< for mb aff, if frame for referencing the bottom field 325*437bfbebSnyanmisaka struct h264_store_pic_t *frame; //!< for mb aff, if field for referencing the combined frame 326*437bfbebSnyanmisaka 327*437bfbebSnyanmisaka RK_S32 slice_type; 328*437bfbebSnyanmisaka RK_S32 idr_flag; 329*437bfbebSnyanmisaka RK_S32 no_output_of_prior_pics_flag; 330*437bfbebSnyanmisaka RK_S32 long_term_reference_flag; 331*437bfbebSnyanmisaka RK_S32 adaptive_ref_pic_buffering_flag; 332*437bfbebSnyanmisaka RK_S32 chroma_format_idc; 333*437bfbebSnyanmisaka RK_S32 frame_mbs_only_flag; 334*437bfbebSnyanmisaka RK_S32 frame_cropping_flag; 335*437bfbebSnyanmisaka 336*437bfbebSnyanmisaka RK_S32 frame_crop_left_offset; 337*437bfbebSnyanmisaka RK_S32 frame_crop_right_offset; 338*437bfbebSnyanmisaka RK_S32 frame_crop_top_offset; 339*437bfbebSnyanmisaka RK_S32 frame_crop_bottom_offset; 340*437bfbebSnyanmisaka RK_S32 width; 341*437bfbebSnyanmisaka RK_S32 height; 342*437bfbebSnyanmisaka RK_U32 width_after_crop; 343*437bfbebSnyanmisaka RK_U32 height_after_crop; 344*437bfbebSnyanmisaka 345*437bfbebSnyanmisaka struct h264_drpm_t *dec_ref_pic_marking_buffer; //!< stores the memory management control operations 346*437bfbebSnyanmisaka RK_S32 proc_flag; 347*437bfbebSnyanmisaka RK_S32 view_id; 348*437bfbebSnyanmisaka RK_S32 inter_view_flag; 349*437bfbebSnyanmisaka RK_S32 anchor_pic_flag; 350*437bfbebSnyanmisaka RK_S32 iCodingType; 351*437bfbebSnyanmisaka 352*437bfbebSnyanmisaka RK_S32 layer_id; 353*437bfbebSnyanmisaka RK_U8 is_mmco_5; 354*437bfbebSnyanmisaka RK_S32 poc_mmco5; 355*437bfbebSnyanmisaka RK_S32 top_poc_mmco5; 356*437bfbebSnyanmisaka RK_S32 bot_poc_mmco5; 357*437bfbebSnyanmisaka RK_S32 combine_flag; // top && bottom field combined flag 358*437bfbebSnyanmisaka H264_Mem_type mem_malloc_type; 359*437bfbebSnyanmisaka struct h264_dpb_mark_t *mem_mark; 360*437bfbebSnyanmisaka } H264_StorePic_t; 361*437bfbebSnyanmisaka 362*437bfbebSnyanmisaka //!< Frame Stores for Decoded Picture Buffer 363*437bfbebSnyanmisaka typedef struct h264_frame_store_t { 364*437bfbebSnyanmisaka RK_S32 is_used; //!< 0=empty; 1=top; 2=bottom; 3=both fields (or frame) 365*437bfbebSnyanmisaka RK_S32 is_reference; //!< 0=not used for ref; 1=top used; 2=bottom used; 3=both fields (or frame) used 366*437bfbebSnyanmisaka RK_S32 is_long_term; //!< 0=not used for ref; 1=top used; 2=bottom used; 3=both fields (or frame) used 367*437bfbebSnyanmisaka RK_S32 is_orig_reference; //!< original marking by nal_ref_idc: 0=not used for ref; 1=top used; 2=bottom used; 3=both fields (or frame) used 368*437bfbebSnyanmisaka RK_S32 is_non_existent; 369*437bfbebSnyanmisaka RK_S32 frame_num_wrap; 370*437bfbebSnyanmisaka RK_S32 long_term_frame_idx; 371*437bfbebSnyanmisaka RK_S32 is_output; 372*437bfbebSnyanmisaka RK_S32 poc; 373*437bfbebSnyanmisaka RK_S32 view_id; 374*437bfbebSnyanmisaka RK_S32 inter_view_flag[2]; 375*437bfbebSnyanmisaka RK_S32 anchor_pic_flag[2]; 376*437bfbebSnyanmisaka RK_S32 layer_id; 377*437bfbebSnyanmisaka RK_S32 slice_type; 378*437bfbebSnyanmisaka RK_U32 frame_num; 379*437bfbebSnyanmisaka RK_S32 structure; 380*437bfbebSnyanmisaka RK_U32 is_directout; 381*437bfbebSnyanmisaka struct h264_store_pic_t *frame; 382*437bfbebSnyanmisaka struct h264_store_pic_t *top_field; 383*437bfbebSnyanmisaka struct h264_store_pic_t *bottom_field; 384*437bfbebSnyanmisaka 385*437bfbebSnyanmisaka } H264_FrameStore_t; 386*437bfbebSnyanmisaka 387*437bfbebSnyanmisaka //!< decode picture buffer 388*437bfbebSnyanmisaka typedef struct h264_dpb_buf_t { 389*437bfbebSnyanmisaka RK_U32 size; 390*437bfbebSnyanmisaka RK_U32 used_size; 391*437bfbebSnyanmisaka RK_U32 allocated_size; 392*437bfbebSnyanmisaka RK_U32 ref_frames_in_buffer; 393*437bfbebSnyanmisaka RK_U32 ltref_frames_in_buffer; 394*437bfbebSnyanmisaka RK_U32 used_size_il; 395*437bfbebSnyanmisaka 396*437bfbebSnyanmisaka RK_S32 poc_interval; 397*437bfbebSnyanmisaka RK_S32 last_output_poc; 398*437bfbebSnyanmisaka RK_S32 last_output_view_id; 399*437bfbebSnyanmisaka RK_S32 max_long_term_pic_idx; 400*437bfbebSnyanmisaka RK_S32 init_done; 401*437bfbebSnyanmisaka RK_S32 num_ref_frames; 402*437bfbebSnyanmisaka RK_S32 layer_id; 403*437bfbebSnyanmisaka 404*437bfbebSnyanmisaka struct h264_frame_store_t **fs; 405*437bfbebSnyanmisaka struct h264_frame_store_t **fs_ref; 406*437bfbebSnyanmisaka struct h264_frame_store_t **fs_ltref; 407*437bfbebSnyanmisaka struct h264_frame_store_t **fs_ilref; //!< inter-layer reference (for multi-layered codecs) 408*437bfbebSnyanmisaka struct h264_frame_store_t *last_picture; 409*437bfbebSnyanmisaka 410*437bfbebSnyanmisaka struct h264d_video_ctx_t *p_Vid; 411*437bfbebSnyanmisaka } H264_DpbBuf_t; 412*437bfbebSnyanmisaka 413*437bfbebSnyanmisaka //!< HRD 414*437bfbebSnyanmisaka #define MAXIMUMVALUEOFcpb_cnt 32 415*437bfbebSnyanmisaka typedef struct h264_hrd_t { 416*437bfbebSnyanmisaka RK_U32 cpb_cnt_minus1; // ue(v) 417*437bfbebSnyanmisaka RK_U32 bit_rate_scale; // u(4) 418*437bfbebSnyanmisaka RK_U32 cpb_size_scale; // u(4) 419*437bfbebSnyanmisaka RK_U32 bit_rate_value_minus1[MAXIMUMVALUEOFcpb_cnt]; // ue(v) 420*437bfbebSnyanmisaka RK_U32 cpb_size_value_minus1[MAXIMUMVALUEOFcpb_cnt]; // ue(v) 421*437bfbebSnyanmisaka RK_U32 cbr_flag[MAXIMUMVALUEOFcpb_cnt]; // u(1) 422*437bfbebSnyanmisaka RK_U32 initial_cpb_removal_delay_length_minus1; // u(5) 423*437bfbebSnyanmisaka RK_U32 cpb_removal_delay_length_minus1; // u(5) 424*437bfbebSnyanmisaka RK_U32 dpb_output_delay_length_minus1; // u(5) 425*437bfbebSnyanmisaka RK_U32 time_offset_length; // u(5) 426*437bfbebSnyanmisaka } H264_HRD_t; 427*437bfbebSnyanmisaka 428*437bfbebSnyanmisaka //!< VUI 429*437bfbebSnyanmisaka typedef struct h264_vui_t { 430*437bfbebSnyanmisaka RK_S32 aspect_ratio_info_present_flag; // u(1) 431*437bfbebSnyanmisaka RK_U32 aspect_ratio_idc; // u(8) 432*437bfbebSnyanmisaka RK_U16 sar_width; // u(16) 433*437bfbebSnyanmisaka RK_U16 sar_height; // u(16) 434*437bfbebSnyanmisaka RK_S32 overscan_info_present_flag; // u(1) 435*437bfbebSnyanmisaka RK_S32 overscan_appropriate_flag; // u(1) 436*437bfbebSnyanmisaka RK_S32 video_signal_type_present_flag; // u(1) 437*437bfbebSnyanmisaka RK_U32 video_format; // u(3) 438*437bfbebSnyanmisaka RK_S32 video_full_range_flag; // u(1) 439*437bfbebSnyanmisaka RK_S32 colour_description_present_flag; // u(1) 440*437bfbebSnyanmisaka RK_U32 colour_primaries; // u(8) 441*437bfbebSnyanmisaka RK_U32 transfer_characteristics; // u(8) 442*437bfbebSnyanmisaka RK_U32 matrix_coefficients; // u(8) 443*437bfbebSnyanmisaka RK_S32 chroma_location_info_present_flag; // u(1) 444*437bfbebSnyanmisaka RK_U32 chroma_sample_loc_type_top_field; // ue(v) 445*437bfbebSnyanmisaka RK_U32 chroma_sample_loc_type_bottom_field; // ue(v) 446*437bfbebSnyanmisaka RK_S32 timing_info_present_flag; // u(1) 447*437bfbebSnyanmisaka RK_U32 num_units_in_tick; // u(32) 448*437bfbebSnyanmisaka RK_U32 time_scale; // u(32) 449*437bfbebSnyanmisaka RK_S32 fixed_frame_rate_flag; // u(1) 450*437bfbebSnyanmisaka RK_S32 nal_hrd_parameters_present_flag; // u(1) 451*437bfbebSnyanmisaka struct h264_hrd_t nal_hrd_parameters; // hrd_paramters_t 452*437bfbebSnyanmisaka RK_S32 vcl_hrd_parameters_present_flag; // u(1) 453*437bfbebSnyanmisaka struct h264_hrd_t vcl_hrd_parameters; // hrd_paramters_t 454*437bfbebSnyanmisaka // if ((nal_hrd_parameters_present_flag || (vcl_hrd_parameters_present_flag)) 455*437bfbebSnyanmisaka RK_S32 low_delay_hrd_flag; // u(1) 456*437bfbebSnyanmisaka RK_S32 pic_struct_present_flag; // u(1) 457*437bfbebSnyanmisaka RK_S32 bitstream_restriction_flag; // u(1) 458*437bfbebSnyanmisaka RK_S32 motion_vectors_over_pic_boundaries_flag; // u(1) 459*437bfbebSnyanmisaka RK_U32 max_bytes_per_pic_denom; // ue(v) 460*437bfbebSnyanmisaka RK_U32 max_bits_per_mb_denom; // ue(v) 461*437bfbebSnyanmisaka RK_U32 log2_max_mv_length_vertical; // ue(v) 462*437bfbebSnyanmisaka RK_U32 log2_max_mv_length_horizontal; // ue(v) 463*437bfbebSnyanmisaka RK_U32 num_reorder_frames; // ue(v) 464*437bfbebSnyanmisaka RK_U32 max_dec_frame_buffering; // ue(v) 465*437bfbebSnyanmisaka } H264_VUI_t; 466*437bfbebSnyanmisaka 467*437bfbebSnyanmisaka //!< MVC_VUI 468*437bfbebSnyanmisaka typedef struct h264_mvc_vui_t { 469*437bfbebSnyanmisaka RK_S32 num_ops_minus1; 470*437bfbebSnyanmisaka RK_S8 *temporal_id; 471*437bfbebSnyanmisaka RK_S32 *num_target_output_views_minus1; 472*437bfbebSnyanmisaka RK_S32 **view_id; 473*437bfbebSnyanmisaka RK_S8 *timing_info_present_flag; 474*437bfbebSnyanmisaka RK_S32 *num_units_in_tick; 475*437bfbebSnyanmisaka RK_S32 *time_scale; 476*437bfbebSnyanmisaka RK_S8 *fixed_frame_rate_flag; 477*437bfbebSnyanmisaka RK_S8 *nal_hrd_parameters_present_flag; 478*437bfbebSnyanmisaka RK_S8 *vcl_hrd_parameters_present_flag; 479*437bfbebSnyanmisaka RK_S8 *low_delay_hrd_flag; 480*437bfbebSnyanmisaka RK_S8 *pic_struct_present_flag; 481*437bfbebSnyanmisaka 482*437bfbebSnyanmisaka //hrd parameters; 483*437bfbebSnyanmisaka RK_S8 cpb_cnt_minus1; 484*437bfbebSnyanmisaka RK_S8 bit_rate_scale; 485*437bfbebSnyanmisaka RK_S8 cpb_size_scale; 486*437bfbebSnyanmisaka RK_S32 bit_rate_value_minus1[32]; 487*437bfbebSnyanmisaka RK_S32 cpb_size_value_minus1[32]; 488*437bfbebSnyanmisaka RK_S8 cbr_flag[32]; 489*437bfbebSnyanmisaka RK_S8 initial_cpb_removal_delay_length_minus1; 490*437bfbebSnyanmisaka RK_S8 cpb_removal_delay_length_minus1; 491*437bfbebSnyanmisaka RK_S8 dpb_output_delay_length_minus1; 492*437bfbebSnyanmisaka RK_S8 time_offset_length; 493*437bfbebSnyanmisaka } H264_mvcVUI_t; 494*437bfbebSnyanmisaka 495*437bfbebSnyanmisaka //!< PREFIX 496*437bfbebSnyanmisaka 497*437bfbebSnyanmisaka typedef struct h264_prefix_t { 498*437bfbebSnyanmisaka RK_S32 Valid; // indicates the prefix set is valid 499*437bfbebSnyanmisaka // nal svc syntax 500*437bfbebSnyanmisaka RK_S32 store_ref_base_pic_flag; // u(1) 501*437bfbebSnyanmisaka // svc base pic marking 502*437bfbebSnyanmisaka RK_S32 adaptive_ref_base_pic_marking_mode_flag; 503*437bfbebSnyanmisaka RK_S32 memory_management_base_control_operation; 504*437bfbebSnyanmisaka RK_S32 difference_of_base_pic_nums_minus1; 505*437bfbebSnyanmisaka RK_S32 long_term_base_pic_num; 506*437bfbebSnyanmisaka 507*437bfbebSnyanmisaka RK_S32 additional_prefix_nal_unit_extension_flag; // u(1) 508*437bfbebSnyanmisaka RK_S32 additional_prefix_nal_unit_extension_data_flag; // u(1) 509*437bfbebSnyanmisaka } H264_PREFIX_t; 510*437bfbebSnyanmisaka 511*437bfbebSnyanmisaka //!< SPS 512*437bfbebSnyanmisaka #define MAXnum_ref_frames_in_POC_cycle 256 513*437bfbebSnyanmisaka 514*437bfbebSnyanmisaka typedef struct h264_sps_t { 515*437bfbebSnyanmisaka RK_S32 Valid; // indicates the parameter set is valid 516*437bfbebSnyanmisaka 517*437bfbebSnyanmisaka RK_S32 profile_idc; // u(8) 518*437bfbebSnyanmisaka RK_S32 constrained_set0_flag; // u(1) 519*437bfbebSnyanmisaka RK_S32 constrained_set1_flag; // u(1) 520*437bfbebSnyanmisaka RK_S32 constrained_set2_flag; // u(1) 521*437bfbebSnyanmisaka RK_S32 constrained_set3_flag; // u(1) 522*437bfbebSnyanmisaka RK_S32 constrained_set4_flag; // u(1) 523*437bfbebSnyanmisaka RK_S32 constrained_set5_flag; // u(2) 524*437bfbebSnyanmisaka 525*437bfbebSnyanmisaka RK_S32 level_idc; // u(8) 526*437bfbebSnyanmisaka RK_U32 seq_parameter_set_id; // ue(v) 527*437bfbebSnyanmisaka RK_S32 chroma_format_idc; // ue(v) 528*437bfbebSnyanmisaka 529*437bfbebSnyanmisaka RK_S32 seq_scaling_matrix_present_flag; // u(1) 530*437bfbebSnyanmisaka RK_S32 seq_scaling_list_present_flag[12]; // u(1) 531*437bfbebSnyanmisaka RK_S32 ScalingList4x4[6][H264ScalingList4x4Length]; // se(v) 532*437bfbebSnyanmisaka RK_S32 ScalingList8x8[6][H264ScalingList8x8Length]; // se(v) 533*437bfbebSnyanmisaka RK_S32 UseDefaultScalingMatrix4x4Flag[6]; 534*437bfbebSnyanmisaka RK_S32 UseDefaultScalingMatrix8x8Flag[6]; 535*437bfbebSnyanmisaka 536*437bfbebSnyanmisaka RK_S32 bit_depth_luma_minus8; // ue(v) 537*437bfbebSnyanmisaka RK_S32 bit_depth_chroma_minus8; // ue(v) 538*437bfbebSnyanmisaka RK_S32 log2_max_frame_num_minus4; // ue(v) 539*437bfbebSnyanmisaka RK_S32 pic_order_cnt_type; 540*437bfbebSnyanmisaka // if( pic_order_cnt_type == 0 ) 541*437bfbebSnyanmisaka RK_S32 log2_max_pic_order_cnt_lsb_minus4; // ue(v) 542*437bfbebSnyanmisaka // else if( pic_order_cnt_type == 1 ) 543*437bfbebSnyanmisaka RK_S32 delta_pic_order_always_zero_flag; // u(1) 544*437bfbebSnyanmisaka RK_S32 offset_for_non_ref_pic; // se(v) 545*437bfbebSnyanmisaka RK_S32 offset_for_top_to_bottom_field; // se(v) 546*437bfbebSnyanmisaka RK_S32 num_ref_frames_in_pic_order_cnt_cycle; // ue(v) 547*437bfbebSnyanmisaka // for( i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++ ) 548*437bfbebSnyanmisaka RK_S32 offset_for_ref_frame[MAXnum_ref_frames_in_POC_cycle]; // se(v) 549*437bfbebSnyanmisaka RK_S32 max_num_ref_frames; // ue(v) 550*437bfbebSnyanmisaka RK_S32 gaps_in_frame_num_value_allowed_flag; // u(1) 551*437bfbebSnyanmisaka RK_S32 pic_width_in_mbs_minus1; // ue(v) 552*437bfbebSnyanmisaka RK_S32 pic_height_in_map_units_minus1; // ue(v) 553*437bfbebSnyanmisaka RK_S32 frame_mbs_only_flag; // u(1) 554*437bfbebSnyanmisaka // if( !frame_mbs_only_flag ) 555*437bfbebSnyanmisaka RK_S32 mb_adaptive_frame_field_flag; // u(1) 556*437bfbebSnyanmisaka RK_S32 direct_8x8_inference_flag; // u(1) 557*437bfbebSnyanmisaka RK_S32 frame_cropping_flag; // u(1) 558*437bfbebSnyanmisaka RK_S32 frame_crop_left_offset; // ue(v) 559*437bfbebSnyanmisaka RK_S32 frame_crop_right_offset; // ue(v) 560*437bfbebSnyanmisaka RK_S32 frame_crop_top_offset; // ue(v) 561*437bfbebSnyanmisaka RK_S32 frame_crop_bottom_offset; // ue(v) 562*437bfbebSnyanmisaka RK_S32 vui_parameters_present_flag; // u(1) 563*437bfbebSnyanmisaka struct h264_vui_t vui_seq_parameters; // vui_seq_parameters_t 564*437bfbebSnyanmisaka RK_S32 separate_colour_plane_flag; // u(1) 565*437bfbebSnyanmisaka RK_S32 max_dec_frame_buffering; 566*437bfbebSnyanmisaka RK_S32 qpprime_y_zero_transform_bypass_flag; 567*437bfbebSnyanmisaka //---- 568*437bfbebSnyanmisaka RK_S32 expected_delta_per_pic_order_cnt_cycle; 569*437bfbebSnyanmisaka 570*437bfbebSnyanmisaka } H264_SPS_t; 571*437bfbebSnyanmisaka 572*437bfbebSnyanmisaka //!< subSPS 573*437bfbebSnyanmisaka typedef struct h264_subsps_t { 574*437bfbebSnyanmisaka struct h264_sps_t sps; 575*437bfbebSnyanmisaka 576*437bfbebSnyanmisaka RK_S32 bit_equal_to_one; 577*437bfbebSnyanmisaka RK_S32 num_views_minus1; 578*437bfbebSnyanmisaka RK_S32 *view_id; 579*437bfbebSnyanmisaka RK_S32 *num_anchor_refs_l0; 580*437bfbebSnyanmisaka RK_S32 **anchor_ref_l0; 581*437bfbebSnyanmisaka RK_S32 *num_anchor_refs_l1; 582*437bfbebSnyanmisaka RK_S32 **anchor_ref_l1; 583*437bfbebSnyanmisaka 584*437bfbebSnyanmisaka RK_S32 *num_non_anchor_refs_l0; 585*437bfbebSnyanmisaka RK_S32 **non_anchor_ref_l0; 586*437bfbebSnyanmisaka RK_S32 *num_non_anchor_refs_l1; 587*437bfbebSnyanmisaka RK_S32 **non_anchor_ref_l1; 588*437bfbebSnyanmisaka 589*437bfbebSnyanmisaka RK_S32 num_level_values_signalled_minus1; 590*437bfbebSnyanmisaka RK_S32 *level_idc; 591*437bfbebSnyanmisaka RK_S32 *num_applicable_ops_minus1; 592*437bfbebSnyanmisaka RK_S32 **applicable_op_temporal_id; 593*437bfbebSnyanmisaka RK_S32 **applicable_op_num_target_views_minus1; 594*437bfbebSnyanmisaka RK_S32 ***applicable_op_target_view_id; 595*437bfbebSnyanmisaka RK_S32 **applicable_op_num_views_minus1; 596*437bfbebSnyanmisaka 597*437bfbebSnyanmisaka RK_S32 mvc_vui_parameters_present_flag; 598*437bfbebSnyanmisaka RK_S32 Valid; // indicates the parameter set is valid 599*437bfbebSnyanmisaka 600*437bfbebSnyanmisaka } H264_subSPS_t; 601*437bfbebSnyanmisaka 602*437bfbebSnyanmisaka //!< PPS 603*437bfbebSnyanmisaka 604*437bfbebSnyanmisaka typedef struct h264_pps_t { 605*437bfbebSnyanmisaka RK_S32 Valid; // indicates the parameter set is valid 606*437bfbebSnyanmisaka RK_U32 pic_parameter_set_id; // ue(v) 607*437bfbebSnyanmisaka RK_U32 seq_parameter_set_id; // ue(v) 608*437bfbebSnyanmisaka RK_S32 entropy_coding_mode_flag; // u(1) 609*437bfbebSnyanmisaka RK_S32 transform_8x8_mode_flag; // u(1) 610*437bfbebSnyanmisaka 611*437bfbebSnyanmisaka RK_S32 pic_scaling_matrix_present_flag; // u(1) 612*437bfbebSnyanmisaka RK_S32 pic_scaling_list_present_flag[12]; // u(1) 613*437bfbebSnyanmisaka RK_S32 ScalingList4x4[6][H264ScalingList4x4Length]; // se(v) 614*437bfbebSnyanmisaka RK_S32 ScalingList8x8[6][H264ScalingList8x8Length]; // se(v) 615*437bfbebSnyanmisaka RK_S32 UseDefaultScalingMatrix4x4Flag[6]; 616*437bfbebSnyanmisaka RK_S32 UseDefaultScalingMatrix8x8Flag[6]; 617*437bfbebSnyanmisaka 618*437bfbebSnyanmisaka // if( pic_order_cnt_type < 2 ) in the sequence parameter set 619*437bfbebSnyanmisaka RK_S32 bottom_field_pic_order_in_frame_present_flag; // u(1) 620*437bfbebSnyanmisaka RK_S32 num_slice_groups_minus1; // ue(v) 621*437bfbebSnyanmisaka RK_S32 slice_group_map_type; // ue(v) 622*437bfbebSnyanmisaka // if( slice_group_map_type = = 0 ) 623*437bfbebSnyanmisaka RK_S32 run_length_minus1[MAXnum_slice_groups_minus1]; // ue(v) 624*437bfbebSnyanmisaka // else if( slice_group_map_type = = 2 ) 625*437bfbebSnyanmisaka RK_S32 top_left[MAXnum_slice_groups_minus1]; // ue(v) 626*437bfbebSnyanmisaka RK_S32 bottom_right[MAXnum_slice_groups_minus1]; // ue(v) 627*437bfbebSnyanmisaka // else if( slice_group_map_type = = 3 || 4 || 5 628*437bfbebSnyanmisaka RK_S32 slice_group_change_direction_flag; // u(1) 629*437bfbebSnyanmisaka RK_S32 slice_group_change_rate_minus1; // ue(v) 630*437bfbebSnyanmisaka // else if( slice_group_map_type = = 6 ) 631*437bfbebSnyanmisaka RK_S32 pic_size_in_map_units_minus1; // ue(v) 632*437bfbebSnyanmisaka RK_U8 *slice_group_id; // complete MBAmap u(v) 633*437bfbebSnyanmisaka 634*437bfbebSnyanmisaka RK_S32 num_ref_idx_l0_default_active_minus1; // ue(v) 635*437bfbebSnyanmisaka RK_S32 num_ref_idx_l1_default_active_minus1; // ue(v) 636*437bfbebSnyanmisaka RK_S32 weighted_pred_flag; // u(1) 637*437bfbebSnyanmisaka RK_S32 weighted_bipred_idc; // u(2) 638*437bfbebSnyanmisaka RK_S32 pic_init_qp_minus26; // se(v) 639*437bfbebSnyanmisaka RK_S32 pic_init_qs_minus26; // se(v) 640*437bfbebSnyanmisaka RK_S32 chroma_qp_index_offset; // se(v) 641*437bfbebSnyanmisaka 642*437bfbebSnyanmisaka RK_S32 cb_qp_index_offset; // se(v) 643*437bfbebSnyanmisaka RK_S32 cr_qp_index_offset; // se(v) 644*437bfbebSnyanmisaka RK_S32 second_chroma_qp_index_offset; // se(v) 645*437bfbebSnyanmisaka 646*437bfbebSnyanmisaka RK_S32 deblocking_filter_control_present_flag; // u(1) 647*437bfbebSnyanmisaka RK_S32 constrained_intra_pred_flag; // u(1) 648*437bfbebSnyanmisaka RK_S32 redundant_pic_cnt_present_flag; // u(1) 649*437bfbebSnyanmisaka RK_S32 vui_pic_parameters_flag; // u(1) 650*437bfbebSnyanmisaka RK_S32 scaleing_list_enable_flag; 651*437bfbebSnyanmisaka RK_U32 scaleing_list_address; 652*437bfbebSnyanmisaka 653*437bfbebSnyanmisaka } H264_PPS_t; 654*437bfbebSnyanmisaka 655*437bfbebSnyanmisaka //!< MVC_scalable_nesting 656*437bfbebSnyanmisaka typedef struct { 657*437bfbebSnyanmisaka RK_S32 operation_point_flag; 658*437bfbebSnyanmisaka RK_S32 all_view_components_in_au_flag; 659*437bfbebSnyanmisaka RK_S32 num_view_components_minus1; 660*437bfbebSnyanmisaka RK_S32 *sei_view_id; 661*437bfbebSnyanmisaka RK_S32 num_view_components_op_minus1; 662*437bfbebSnyanmisaka RK_S32 *sei_op_view_id; 663*437bfbebSnyanmisaka RK_S32 sei_op_temporal_id; 664*437bfbebSnyanmisaka RK_S32 Valid; 665*437bfbebSnyanmisaka } MVC_scalable_nesting_t; 666*437bfbebSnyanmisaka 667*437bfbebSnyanmisaka //!< MVC_scalability_info 668*437bfbebSnyanmisaka typedef struct { 669*437bfbebSnyanmisaka RK_S32 num_operation_points_minus1; 670*437bfbebSnyanmisaka RK_S32 *operation_point_id; 671*437bfbebSnyanmisaka RK_S32 *priority_id; 672*437bfbebSnyanmisaka RK_S32 *temporal_id; 673*437bfbebSnyanmisaka RK_S32 *num_target_output_views_minus1; 674*437bfbebSnyanmisaka RK_S32 **view_id; 675*437bfbebSnyanmisaka RK_S32 *profile_level_info_present_flag; 676*437bfbebSnyanmisaka RK_S32 *bitrate_info_present_flag; 677*437bfbebSnyanmisaka RK_S32 *frm_rate_info_present_flag; 678*437bfbebSnyanmisaka 679*437bfbebSnyanmisaka RK_S32 *view_dependency_info_present_flag; 680*437bfbebSnyanmisaka RK_S32 *parameter_sets_info_present_flag; 681*437bfbebSnyanmisaka RK_S32 *bitstream_restriction_info_present_flag; 682*437bfbebSnyanmisaka RK_S32 *op_profile_level_idc; 683*437bfbebSnyanmisaka RK_S32 *avg_bitrate; 684*437bfbebSnyanmisaka RK_S32 *max_bitrate; 685*437bfbebSnyanmisaka RK_S32 *max_bitrate_calc_window; 686*437bfbebSnyanmisaka RK_S32 *constant_frm_rate_idc; 687*437bfbebSnyanmisaka RK_S32 *avg_frm_rate; 688*437bfbebSnyanmisaka RK_S32 *num_directly_dependent_views; 689*437bfbebSnyanmisaka RK_S32 **directly_dependent_view_id; 690*437bfbebSnyanmisaka RK_S32 *view_dependency_info_src_op_id; 691*437bfbebSnyanmisaka RK_S32 *num_seq_parameter_sets; 692*437bfbebSnyanmisaka RK_S32 **seq_parameter_set_id_delta; 693*437bfbebSnyanmisaka RK_S32 *num_subset_seq_parameter_sets; 694*437bfbebSnyanmisaka RK_S32 **subset_seq_parameter_set_id_delta; 695*437bfbebSnyanmisaka RK_S32 *num_pic_parameter_sets_minus1; 696*437bfbebSnyanmisaka RK_S32 **pic_parameter_set_id_delta; 697*437bfbebSnyanmisaka RK_S32 *parameter_sets_info_src_op_id; 698*437bfbebSnyanmisaka RK_S32 *motion_vectors_over_pic_boundaries_flag; 699*437bfbebSnyanmisaka RK_S32 *max_bytes_per_pic_denom; 700*437bfbebSnyanmisaka RK_S32 *max_bits_per_mb_denom; 701*437bfbebSnyanmisaka RK_S32 *log2_max_mv_length_horizontal; 702*437bfbebSnyanmisaka RK_S32 *log2_max_mv_length_vertical; 703*437bfbebSnyanmisaka RK_S32 *max_num_reorder_frames; 704*437bfbebSnyanmisaka RK_S32 *max_dec_frame_buffering; 705*437bfbebSnyanmisaka } MVC_scalability_info_t; 706*437bfbebSnyanmisaka 707*437bfbebSnyanmisaka typedef struct h264_sei_pic_timing_t { 708*437bfbebSnyanmisaka RK_S32 cpb_removal_delay; 709*437bfbebSnyanmisaka RK_S32 dpb_output_delay; 710*437bfbebSnyanmisaka RK_S32 pic_struct; 711*437bfbebSnyanmisaka RK_S32 clock_timestamp_flag[3]; 712*437bfbebSnyanmisaka RK_S32 clock_timestamp[3]; 713*437bfbebSnyanmisaka RK_S32 ct_type[3]; 714*437bfbebSnyanmisaka RK_S32 nuit_field_based_flag[3]; 715*437bfbebSnyanmisaka RK_S32 counting_type[3]; 716*437bfbebSnyanmisaka RK_S32 full_timestamp_flag[3]; 717*437bfbebSnyanmisaka RK_S32 discontinuity_flag[3]; 718*437bfbebSnyanmisaka RK_S32 cnt_dropped_flag[3]; 719*437bfbebSnyanmisaka RK_S32 n_frames[3]; 720*437bfbebSnyanmisaka RK_S32 seconds_flag[3]; 721*437bfbebSnyanmisaka RK_S32 seconds_value[3]; 722*437bfbebSnyanmisaka RK_S32 minutes_flag[3]; 723*437bfbebSnyanmisaka RK_S32 minutes_value[3]; 724*437bfbebSnyanmisaka RK_S32 hours_flag[3]; 725*437bfbebSnyanmisaka RK_S32 hours_value[3]; 726*437bfbebSnyanmisaka RK_S32 time_offset[3]; 727*437bfbebSnyanmisaka } H264_SEI_PIC_TIMING_t; 728*437bfbebSnyanmisaka 729*437bfbebSnyanmisaka //!< SEI struct 730*437bfbebSnyanmisaka typedef struct h264_sei_t { 731*437bfbebSnyanmisaka RK_S32 type; 732*437bfbebSnyanmisaka RK_S32 payload_size; 733*437bfbebSnyanmisaka struct { 734*437bfbebSnyanmisaka RK_U32 recovery_frame_cnt; 735*437bfbebSnyanmisaka RK_S32 exact_match_flag; 736*437bfbebSnyanmisaka RK_S32 broken_link_flag; 737*437bfbebSnyanmisaka RK_S32 changing_slice_group_idc; 738*437bfbebSnyanmisaka } recovery_point; 739*437bfbebSnyanmisaka struct { 740*437bfbebSnyanmisaka RK_S32 operation_point_flag; 741*437bfbebSnyanmisaka //-- for adding 742*437bfbebSnyanmisaka } scalable_nesting; 743*437bfbebSnyanmisaka 744*437bfbebSnyanmisaka // Placeholder; in future more supported types will contribute to more 745*437bfbebSnyanmisaka //---- follow is used in other parts 746*437bfbebSnyanmisaka RK_S32 mvc_scalable_nesting_flag; 747*437bfbebSnyanmisaka RK_U32 seq_parameter_set_id; 748*437bfbebSnyanmisaka 749*437bfbebSnyanmisaka H264_SEI_PIC_TIMING_t pic_timing; 750*437bfbebSnyanmisaka 751*437bfbebSnyanmisaka struct h264_dec_ctx_t *p_Dec; 752*437bfbebSnyanmisaka } H264_SEI_t; 753*437bfbebSnyanmisaka 754*437bfbebSnyanmisaka //!< SLICE 755*437bfbebSnyanmisaka typedef struct h264_slice_t { 756*437bfbebSnyanmisaka struct h264_nalu_svc_ext_t svcExt; 757*437bfbebSnyanmisaka struct h264_nalu_mvc_ext_t mvcExt; 758*437bfbebSnyanmisaka //--- slice property; 759*437bfbebSnyanmisaka RK_S32 layer_id; 760*437bfbebSnyanmisaka RK_S32 idr_flag; 761*437bfbebSnyanmisaka RK_S32 idr_pic_id; 762*437bfbebSnyanmisaka RK_S32 nal_reference_idc; //!< nal_reference_idc from NAL unit 763*437bfbebSnyanmisaka RK_U32 start_mb_nr; //!< MUST be set by NAL even in case of ei_flag == 1 764*437bfbebSnyanmisaka RK_S32 slice_type; //!< slice type 765*437bfbebSnyanmisaka RK_U32 pic_parameter_set_id; 766*437bfbebSnyanmisaka RK_S32 colour_plane_id; 767*437bfbebSnyanmisaka RK_S32 frame_num; 768*437bfbebSnyanmisaka RK_S32 field_pic_flag; 769*437bfbebSnyanmisaka RK_S32 bottom_field_flag; 770*437bfbebSnyanmisaka RK_S32 structure; 771*437bfbebSnyanmisaka RK_S32 mb_aff_frame_flag; 772*437bfbebSnyanmisaka RK_S32 pic_order_cnt_lsb; // for poc mode 0 773*437bfbebSnyanmisaka RK_S32 delta_pic_order_cnt_bottom; 774*437bfbebSnyanmisaka RK_S32 delta_pic_order_cnt[2]; // for poc mode 1 775*437bfbebSnyanmisaka RK_U32 poc_used_bitlen; 776*437bfbebSnyanmisaka RK_S32 redundant_pic_cnt; 777*437bfbebSnyanmisaka RK_S32 direct_spatial_mv_pred_flag; 778*437bfbebSnyanmisaka RK_S32 num_ref_idx_active[2]; //!< number of available list references 779*437bfbebSnyanmisaka RK_S32 num_ref_idx_override_flag; 780*437bfbebSnyanmisaka RK_S32 ref_pic_list_reordering_flag[2]; 781*437bfbebSnyanmisaka RK_S32 *modification_of_pic_nums_idc[2]; 782*437bfbebSnyanmisaka RK_S32 *abs_diff_pic_num_minus1[2]; 783*437bfbebSnyanmisaka RK_S32 *long_term_pic_idx[2]; 784*437bfbebSnyanmisaka RK_S32 *abs_diff_view_idx_minus1[2]; 785*437bfbebSnyanmisaka struct h264_drpm_t *dec_ref_pic_marking_buffer; 786*437bfbebSnyanmisaka RK_U32 drpm_used_bitlen; 787*437bfbebSnyanmisaka RK_S32 no_output_of_prior_pics_flag; 788*437bfbebSnyanmisaka RK_S32 long_term_reference_flag; 789*437bfbebSnyanmisaka RK_S32 adaptive_ref_pic_buffering_flag; 790*437bfbebSnyanmisaka RK_U32 model_number; 791*437bfbebSnyanmisaka RK_S32 slice_qp_delta; 792*437bfbebSnyanmisaka RK_S32 qp; 793*437bfbebSnyanmisaka RK_S32 current_mb_nr; 794*437bfbebSnyanmisaka RK_S32 ThisPOC; 795*437bfbebSnyanmisaka RK_S32 toppoc; //poc for this top field 796*437bfbebSnyanmisaka RK_S32 bottompoc; //poc of bottom field of frame 797*437bfbebSnyanmisaka RK_S32 framepoc; //poc of this frame 798*437bfbebSnyanmisaka RK_U32 AbsFrameNum; 799*437bfbebSnyanmisaka RK_S32 PicOrderCntMsb; 800*437bfbebSnyanmisaka //RK_S32 new_frame_flag; 801*437bfbebSnyanmisaka struct h264_sps_t *active_sps; 802*437bfbebSnyanmisaka struct h264_subsps_t *active_subsps; 803*437bfbebSnyanmisaka struct h264_pps_t *active_pps; 804*437bfbebSnyanmisaka 805*437bfbebSnyanmisaka struct h264_dpb_buf_t *p_Dpb; 806*437bfbebSnyanmisaka struct h264_dpb_buf_t *p_Dpb_layer[MAX_NUM_DPB_LAYERS]; 807*437bfbebSnyanmisaka //---- 808*437bfbebSnyanmisaka RK_S32 listinterviewidx0; 809*437bfbebSnyanmisaka RK_S32 listinterviewidx1; 810*437bfbebSnyanmisaka 811*437bfbebSnyanmisaka RK_U8 listXsizeP[2]; 812*437bfbebSnyanmisaka RK_U8 listXsizeB[2]; 813*437bfbebSnyanmisaka 814*437bfbebSnyanmisaka struct h264_frame_store_t **fs_listinterview0; 815*437bfbebSnyanmisaka struct h264_frame_store_t **fs_listinterview1; 816*437bfbebSnyanmisaka //struct h264_store_pic_t **listX[6]; 817*437bfbebSnyanmisaka struct h264_store_pic_t **listP[MAX_NUM_DPB_LAYERS]; 818*437bfbebSnyanmisaka struct h264_store_pic_t **listB[MAX_NUM_DPB_LAYERS]; 819*437bfbebSnyanmisaka 820*437bfbebSnyanmisaka //---- MVC extend ---- 821*437bfbebSnyanmisaka RK_S32 svc_extension_flag; // should be always 0, for MVC 822*437bfbebSnyanmisaka RK_S32 non_idr_flag; // 0 = current is IDR 823*437bfbebSnyanmisaka RK_S32 priority_id; // a lower value of priority_id specifies a higher priority 824*437bfbebSnyanmisaka RK_S32 view_id; // view identifier for the NAL unit 825*437bfbebSnyanmisaka RK_S32 temporal_id; // temporal identifier for the NAL unit 826*437bfbebSnyanmisaka RK_S32 anchor_pic_flag; // anchor access unit 827*437bfbebSnyanmisaka RK_S32 inter_view_flag; // inter-view prediction enable 828*437bfbebSnyanmisaka RK_S32 reserved_one_bit; // shall be equal to 1 829*437bfbebSnyanmisaka RK_S32 MVCExt_is_valid; 830*437bfbebSnyanmisaka RK_S32 MVCExt_is_prefixNALU; 831*437bfbebSnyanmisaka 832*437bfbebSnyanmisaka struct h264_dec_ctx_t *p_Dec; // H264_DecCtx_t 833*437bfbebSnyanmisaka struct h264d_input_ctx_t *p_Inp; // H264_InputParameters 834*437bfbebSnyanmisaka struct h264d_cur_ctx_t *p_Cur; // H264_CurParameters 835*437bfbebSnyanmisaka struct h264d_video_ctx_t *p_Vid; 836*437bfbebSnyanmisaka } H264_SLICE_t; 837*437bfbebSnyanmisaka 838*437bfbebSnyanmisaka //!< Old slice parameter for check new frame 839*437bfbebSnyanmisaka typedef struct h264_old_slice_par_t { 840*437bfbebSnyanmisaka RK_U32 current_mb_nr; 841*437bfbebSnyanmisaka RK_U8 field_pic_flag; 842*437bfbebSnyanmisaka RK_U8 frame_num; 843*437bfbebSnyanmisaka RK_S32 nal_ref_idc; 844*437bfbebSnyanmisaka RK_U8 pic_oder_cnt_lsb; 845*437bfbebSnyanmisaka RK_S32 delta_pic_oder_cnt_bottom; 846*437bfbebSnyanmisaka RK_S32 delta_pic_order_cnt[2]; 847*437bfbebSnyanmisaka RK_U8 bottom_field_flag; 848*437bfbebSnyanmisaka RK_U8 idr_flag; 849*437bfbebSnyanmisaka RK_S32 idr_pic_id; 850*437bfbebSnyanmisaka RK_U32 pps_id; 851*437bfbebSnyanmisaka RK_S32 view_id; 852*437bfbebSnyanmisaka RK_S32 inter_view_flag; 853*437bfbebSnyanmisaka RK_S32 anchor_pic_flag; 854*437bfbebSnyanmisaka RK_S32 layer_id; 855*437bfbebSnyanmisaka } H264_OldSlice_t; 856*437bfbebSnyanmisaka 857*437bfbebSnyanmisaka //!< DXVA context 858*437bfbebSnyanmisaka #define MAX_SLICE_NUM (20) 859*437bfbebSnyanmisaka #define ADD_SLICE_SIZE (5) 860*437bfbebSnyanmisaka #define BITSTREAM_MAX_SIZE (2*1024*1024) 861*437bfbebSnyanmisaka #define BITSTREAM_ADD_SIZE (512) 862*437bfbebSnyanmisaka #define SYNTAX_BUF_SIZE (5) 863*437bfbebSnyanmisaka typedef struct h264d_dxva_ctx_t { 864*437bfbebSnyanmisaka RK_U8 cfgBitstrmRaw; 865*437bfbebSnyanmisaka struct _DXVA_PicParams_H264_MVC pp; 866*437bfbebSnyanmisaka struct _DXVA_Qmatrix_H264 qm; 867*437bfbebSnyanmisaka RK_U32 max_slice_size; 868*437bfbebSnyanmisaka RK_U32 slice_count; 869*437bfbebSnyanmisaka struct _DXVA_Slice_H264_Long *slice_long; //!< MAX_SLICES 870*437bfbebSnyanmisaka RK_U8 *bitstream; 871*437bfbebSnyanmisaka RK_U32 max_strm_size; 872*437bfbebSnyanmisaka RK_U32 strm_offset; 873*437bfbebSnyanmisaka struct h264d_syntax_t syn; 874*437bfbebSnyanmisaka struct h264_dec_ctx_t *p_Dec; 875*437bfbebSnyanmisaka } H264dDxvaCtx_t; 876*437bfbebSnyanmisaka 877*437bfbebSnyanmisaka //!< input parameter 878*437bfbebSnyanmisaka typedef struct h264d_input_ctx_t { 879*437bfbebSnyanmisaka struct h264_dec_ctx_t *p_Dec; 880*437bfbebSnyanmisaka struct h264d_cur_ctx_t *p_Cur; //!< current parameters, use in read nalu 881*437bfbebSnyanmisaka struct h264d_video_ctx_t *p_Vid; //!< parameters for video decoder 882*437bfbebSnyanmisaka enum mpp_decmtd_type dec_mtd; 883*437bfbebSnyanmisaka 884*437bfbebSnyanmisaka //!< input data 885*437bfbebSnyanmisaka RK_U8 *in_buf; 886*437bfbebSnyanmisaka size_t in_length; 887*437bfbebSnyanmisaka RK_U32 pkt_eos; 888*437bfbebSnyanmisaka 889*437bfbebSnyanmisaka MppPacket in_pkt; 890*437bfbebSnyanmisaka 891*437bfbebSnyanmisaka RK_S64 in_pts; 892*437bfbebSnyanmisaka RK_S64 in_dts; 893*437bfbebSnyanmisaka RK_U8 has_get_eos; 894*437bfbebSnyanmisaka RK_U32 max_buf_size; 895*437bfbebSnyanmisaka //!< output data 896*437bfbebSnyanmisaka RK_U8 task_valid; 897*437bfbebSnyanmisaka RK_U32 task_eos; 898*437bfbebSnyanmisaka 899*437bfbebSnyanmisaka //!< have extradata 900*437bfbebSnyanmisaka RK_U8 is_nalff; 901*437bfbebSnyanmisaka RK_U8 profile; 902*437bfbebSnyanmisaka RK_U8 level; 903*437bfbebSnyanmisaka RK_U32 nal_size; 904*437bfbebSnyanmisaka RK_S32 sps_num; 905*437bfbebSnyanmisaka RK_S32 pps_num; 906*437bfbebSnyanmisaka //!< write stream 907*437bfbebSnyanmisaka char fname[2][512]; 908*437bfbebSnyanmisaka FILE *fp; 909*437bfbebSnyanmisaka RK_U8 *spspps_buf; 910*437bfbebSnyanmisaka RK_U32 spspps_size; 911*437bfbebSnyanmisaka RK_U32 spspps_len; 912*437bfbebSnyanmisaka RK_U32 spspps_offset; 913*437bfbebSnyanmisaka RK_U32 spspps_update_flag; 914*437bfbebSnyanmisaka 915*437bfbebSnyanmisaka } H264dInputCtx_t; 916*437bfbebSnyanmisaka 917*437bfbebSnyanmisaka 918*437bfbebSnyanmisaka //!< current stream 919*437bfbebSnyanmisaka typedef struct h264d_curstrm_t { 920*437bfbebSnyanmisaka RK_U32 nalu_offset; //!< The offset of the input stream 921*437bfbebSnyanmisaka RK_U32 nalu_max_size; //!< Cur Unit Buffer size 922*437bfbebSnyanmisaka RK_U8 *curdata; 923*437bfbebSnyanmisaka 924*437bfbebSnyanmisaka RK_S32 nalu_type; 925*437bfbebSnyanmisaka RK_U32 nalu_len; 926*437bfbebSnyanmisaka RK_U8 *nalu_buf; //!< store read nalu data 927*437bfbebSnyanmisaka 928*437bfbebSnyanmisaka RK_U32 head_offset; 929*437bfbebSnyanmisaka RK_U32 head_max_size; 930*437bfbebSnyanmisaka RK_U8 *head_buf; //!< store header data, sps/pps/slice header 931*437bfbebSnyanmisaka 932*437bfbebSnyanmisaka RK_U32 first_mb_in_slice; //!< mark current slice 933*437bfbebSnyanmisaka RK_U32 tmp_offset; 934*437bfbebSnyanmisaka RK_U32 tmp_max_size; 935*437bfbebSnyanmisaka RK_U8 *tmp_buf; //!< store temporary header data 936*437bfbebSnyanmisaka 937*437bfbebSnyanmisaka RK_U32 prefixdata; 938*437bfbebSnyanmisaka RK_U8 startcode_found; 939*437bfbebSnyanmisaka RK_U8 endcode_found; 940*437bfbebSnyanmisaka 941*437bfbebSnyanmisaka } H264dCurStream_t; 942*437bfbebSnyanmisaka 943*437bfbebSnyanmisaka #define MAX_REORDER_TIMES 33 // MVC: 2 * H264_MAX_REFS + 1 944*437bfbebSnyanmisaka #define MAX_MARKING_TIMES 35 945*437bfbebSnyanmisaka //!< current parameters 946*437bfbebSnyanmisaka typedef struct h264d_cur_ctx_t { 947*437bfbebSnyanmisaka struct h264_sps_t sps; 948*437bfbebSnyanmisaka struct h264_subsps_t *subsps; 949*437bfbebSnyanmisaka struct h264_pps_t pps; 950*437bfbebSnyanmisaka struct h264_prefix_t prefix; 951*437bfbebSnyanmisaka struct h264_sei_t *sei; 952*437bfbebSnyanmisaka struct h264_nalu_t nalu; 953*437bfbebSnyanmisaka struct bitread_ctx_t bitctx; //!< for control bit_read 954*437bfbebSnyanmisaka struct h264d_curstrm_t strm; 955*437bfbebSnyanmisaka struct h264_slice_t slice; 956*437bfbebSnyanmisaka 957*437bfbebSnyanmisaka struct h264_store_pic_t **listP[MAX_NUM_DPB_LAYERS]; 958*437bfbebSnyanmisaka struct h264_store_pic_t **listB[MAX_NUM_DPB_LAYERS]; 959*437bfbebSnyanmisaka struct h264d_input_ctx_t *p_Inp; 960*437bfbebSnyanmisaka struct h264_dec_ctx_t *p_Dec; 961*437bfbebSnyanmisaka struct h264d_video_ctx_t *p_Vid; //!< parameters for video decoder 962*437bfbebSnyanmisaka 963*437bfbebSnyanmisaka RK_S64 last_pts; 964*437bfbebSnyanmisaka RK_S64 last_dts; 965*437bfbebSnyanmisaka RK_S64 curr_pts; 966*437bfbebSnyanmisaka RK_S64 curr_dts; 967*437bfbebSnyanmisaka //!< malloc buffer for current slice 968*437bfbebSnyanmisaka RK_S32 modification_of_pic_nums_idc[2][MAX_REORDER_TIMES]; 969*437bfbebSnyanmisaka RK_S32 abs_diff_pic_num_minus1[2][MAX_REORDER_TIMES]; 970*437bfbebSnyanmisaka RK_S32 long_term_pic_idx[2][MAX_REORDER_TIMES]; 971*437bfbebSnyanmisaka RK_S32 abs_diff_view_idx_minus1[2][MAX_REORDER_TIMES]; 972*437bfbebSnyanmisaka 973*437bfbebSnyanmisaka struct h264_drpm_t *dec_ref_pic_marking_buffer[MAX_MARKING_TIMES]; 974*437bfbebSnyanmisaka MppFrameHdrDynamicMeta *hdr_dynamic_meta; 975*437bfbebSnyanmisaka RK_U32 hdr_dynamic; 976*437bfbebSnyanmisaka } H264dCurCtx_t; 977*437bfbebSnyanmisaka 978*437bfbebSnyanmisaka //!< parameters for video decoder 979*437bfbebSnyanmisaka typedef struct h264d_video_ctx_t { 980*437bfbebSnyanmisaka struct h264_sps_t *spsSet[MAXSPS]; //!< MAXSPS, all sps storage 981*437bfbebSnyanmisaka struct h264_subsps_t *subspsSet[MAXSPS]; //!< MAXSPS, all subpps storage 982*437bfbebSnyanmisaka struct h264_pps_t *ppsSet[MAXPPS]; //!< MAXPPS, all pps storage 983*437bfbebSnyanmisaka struct h264_sps_t *active_sps; 984*437bfbebSnyanmisaka struct h264_subsps_t *active_subsps; 985*437bfbebSnyanmisaka struct h264_pps_t *active_pps; 986*437bfbebSnyanmisaka struct h264_dec_ctx_t *p_Dec; //!< H264_DecCtx_t 987*437bfbebSnyanmisaka struct h264d_input_ctx_t *p_Inp; //!< H264_InputParameters 988*437bfbebSnyanmisaka struct h264d_cur_ctx_t *p_Cur; //!< H264_CurParameters 989*437bfbebSnyanmisaka struct h264_dpb_buf_t *p_Dpb_layer[MAX_NUM_DPB_LAYERS]; 990*437bfbebSnyanmisaka struct h264_store_pic_t *dec_pic; //!< current decoder picture 991*437bfbebSnyanmisaka struct h264_store_pic_t *last_pic; 992*437bfbebSnyanmisaka 993*437bfbebSnyanmisaka struct h264_store_pic_t *no_ref_pic; //!< no reference picture 994*437bfbebSnyanmisaka struct h264_frame_store_t out_buffer; 995*437bfbebSnyanmisaka struct h264_dpb_mark_t *active_dpb_mark[MAX_NUM_DPB_LAYERS]; //!< acitve_dpb_memory 996*437bfbebSnyanmisaka 997*437bfbebSnyanmisaka struct h264_store_pic_t old_pic; 998*437bfbebSnyanmisaka 999*437bfbebSnyanmisaka RK_S32 *qmatrix[12]; //!< scanlist pointer 1000*437bfbebSnyanmisaka RK_U32 stream_size; 1001*437bfbebSnyanmisaka RK_S32 last_toppoc[MAX_NUM_DPB_LAYERS]; 1002*437bfbebSnyanmisaka RK_S32 last_bottompoc[MAX_NUM_DPB_LAYERS]; 1003*437bfbebSnyanmisaka RK_S32 last_framepoc[MAX_NUM_DPB_LAYERS]; 1004*437bfbebSnyanmisaka RK_S32 last_thispoc[MAX_NUM_DPB_LAYERS]; 1005*437bfbebSnyanmisaka //!< 1006*437bfbebSnyanmisaka RK_S32 profile_idc; // u(8) 1007*437bfbebSnyanmisaka RK_S32 slice_type; 1008*437bfbebSnyanmisaka RK_S32 structure; 1009*437bfbebSnyanmisaka RK_S32 iNumOfSlicesDecoded; 1010*437bfbebSnyanmisaka RK_S32 no_output_of_prior_pics_flag; 1011*437bfbebSnyanmisaka RK_S32 last_has_mmco_5; 1012*437bfbebSnyanmisaka RK_S32 max_frame_num; 1013*437bfbebSnyanmisaka RK_U32 active_sps_id[MAX_NUM_DPB_LAYERS]; 1014*437bfbebSnyanmisaka RK_U32 PicWidthInMbs; 1015*437bfbebSnyanmisaka RK_U32 FrameHeightInMbs; 1016*437bfbebSnyanmisaka RK_S32 frame_mbs_only_flag; 1017*437bfbebSnyanmisaka RK_S32 yuv_format; 1018*437bfbebSnyanmisaka RK_U32 bit_depth_chroma; 1019*437bfbebSnyanmisaka RK_U32 bit_depth_luma; 1020*437bfbebSnyanmisaka RK_S32 width; 1021*437bfbebSnyanmisaka RK_S32 height; 1022*437bfbebSnyanmisaka RK_U32 width_after_crop; 1023*437bfbebSnyanmisaka RK_U32 height_after_crop; 1024*437bfbebSnyanmisaka RK_S32 width_cr; //!< width chroma 1025*437bfbebSnyanmisaka RK_S32 height_cr; //!< height chroma 1026*437bfbebSnyanmisaka RK_S32 last_pic_structure; 1027*437bfbebSnyanmisaka RK_S32 last_pic_bottom_field; 1028*437bfbebSnyanmisaka RK_S32 last_pic_width_in_mbs_minus1[2]; 1029*437bfbebSnyanmisaka RK_S32 last_pic_height_in_map_units_minus1[2]; 1030*437bfbebSnyanmisaka RK_S32 last_profile_idc[2]; 1031*437bfbebSnyanmisaka RK_S32 last_level_idc[2]; 1032*437bfbebSnyanmisaka RK_U32 last_sps_id; 1033*437bfbebSnyanmisaka RK_U32 last_pps_id; 1034*437bfbebSnyanmisaka RK_S32 PrevPicOrderCntMsb; 1035*437bfbebSnyanmisaka RK_S32 PrevPicOrderCntLsb; 1036*437bfbebSnyanmisaka RK_U32 PreviousFrameNum; 1037*437bfbebSnyanmisaka RK_U32 FrameNumOffset; 1038*437bfbebSnyanmisaka RK_S32 PreviousFrameNumOffset; 1039*437bfbebSnyanmisaka RK_S32 ExpectedDeltaPerPicOrderCntCycle; 1040*437bfbebSnyanmisaka RK_S32 ExpectedPicOrderCnt; 1041*437bfbebSnyanmisaka RK_S32 PicOrderCntCycleCnt; 1042*437bfbebSnyanmisaka RK_S32 FrameNumInPicOrderCntCycle; 1043*437bfbebSnyanmisaka RK_S32 ThisPOC; 1044*437bfbebSnyanmisaka RK_S32 type; 1045*437bfbebSnyanmisaka //!< for control running 1046*437bfbebSnyanmisaka RK_S32 have_outpicture_flag; 1047*437bfbebSnyanmisaka RK_S32 exit_picture_flag; 1048*437bfbebSnyanmisaka RK_S32 active_mvc_sps_flag; 1049*437bfbebSnyanmisaka //!< for error tolerance 1050*437bfbebSnyanmisaka RK_U32 g_framecnt; 1051*437bfbebSnyanmisaka RK_U32 dpb_size[MAX_NUM_DPB_LAYERS]; 1052*437bfbebSnyanmisaka 1053*437bfbebSnyanmisaka MppMemPool pic_st; 1054*437bfbebSnyanmisaka //!< spspps data update 1055*437bfbebSnyanmisaka RK_U32 spspps_update; 1056*437bfbebSnyanmisaka 1057*437bfbebSnyanmisaka RK_U32 dpb_fast_out; 1058*437bfbebSnyanmisaka RK_U32 dpb_first_fast_played; 1059*437bfbebSnyanmisaka RK_U32 last_ref_frame_num; 1060*437bfbebSnyanmisaka RK_U32 deny_flag; 1061*437bfbebSnyanmisaka RecoveryPoint recovery; 1062*437bfbebSnyanmisaka } H264dVideoCtx_t; 1063*437bfbebSnyanmisaka 1064*437bfbebSnyanmisaka typedef struct h264d_mem_t { 1065*437bfbebSnyanmisaka struct h264_dpb_mark_t dpb_mark[MAX_MARK_SIZE]; //!< for fpga register check, dpb mark 1066*437bfbebSnyanmisaka struct h264_dpb_info_t dpb_info[MAX_DPB_SIZE]; //!< 16 1067*437bfbebSnyanmisaka struct h264_refpic_info_t refpic_info_p[MAX_REF_SIZE]; //!< 32 1068*437bfbebSnyanmisaka struct h264_refpic_info_t refpic_info_b[2][MAX_REF_SIZE]; //!< [2][32] 1069*437bfbebSnyanmisaka struct h264d_dxva_ctx_t dxva_ctx; 1070*437bfbebSnyanmisaka } H264_DecMem_t; 1071*437bfbebSnyanmisaka 1072*437bfbebSnyanmisaka //!< nalu state used in read nalu 1073*437bfbebSnyanmisaka typedef enum nalu_state_tpye { 1074*437bfbebSnyanmisaka NALU_NULL = 0, 1075*437bfbebSnyanmisaka 1076*437bfbebSnyanmisaka StreamError, 1077*437bfbebSnyanmisaka HaveNoStream, 1078*437bfbebSnyanmisaka NaluNotSupport, 1079*437bfbebSnyanmisaka ReadNaluError, 1080*437bfbebSnyanmisaka StartofNalu, 1081*437bfbebSnyanmisaka EndofStream, 1082*437bfbebSnyanmisaka MvcDisAble, 1083*437bfbebSnyanmisaka MidOfNalu, 1084*437bfbebSnyanmisaka EndOfNalu, 1085*437bfbebSnyanmisaka StartOfPicture, 1086*437bfbebSnyanmisaka StartOfSlice, 1087*437bfbebSnyanmisaka SkipNALU, 1088*437bfbebSnyanmisaka NALU_SPS, 1089*437bfbebSnyanmisaka NALU_SubSPS, 1090*437bfbebSnyanmisaka NALU_PPS, 1091*437bfbebSnyanmisaka NALU_SEI, 1092*437bfbebSnyanmisaka 1093*437bfbebSnyanmisaka NALU_MAX, 1094*437bfbebSnyanmisaka } NALU_STATUS; 1095*437bfbebSnyanmisaka 1096*437bfbebSnyanmisaka //!< slice state used in parse loop 1097*437bfbebSnyanmisaka typedef enum slice_state_type { 1098*437bfbebSnyanmisaka SliceSTATE_NULL = 0, 1099*437bfbebSnyanmisaka SliceSTATE_IDLE, 1100*437bfbebSnyanmisaka 1101*437bfbebSnyanmisaka SliceSTATE_ResetSlice, 1102*437bfbebSnyanmisaka SliceSTATE_ReadNalu, 1103*437bfbebSnyanmisaka SliceSTATE_ParseNalu, 1104*437bfbebSnyanmisaka SliceSTATE_InitPicture, 1105*437bfbebSnyanmisaka ////SliceSTATE_InitSlice, 1106*437bfbebSnyanmisaka SliceSTATE_GetSliceData, 1107*437bfbebSnyanmisaka //SliceSTATE_RegisterOneSlice, 1108*437bfbebSnyanmisaka SliceSTATE_RegisterOneFrame, 1109*437bfbebSnyanmisaka SliceSTATE_Error, 1110*437bfbebSnyanmisaka SliceSTATE_MAX, 1111*437bfbebSnyanmisaka 1112*437bfbebSnyanmisaka } SLICE_STATUS; 1113*437bfbebSnyanmisaka 1114*437bfbebSnyanmisaka typedef struct h264_err_ctx_t { 1115*437bfbebSnyanmisaka RK_U32 un_spt_flag; 1116*437bfbebSnyanmisaka RK_U32 cur_err_flag; //!< current decoded picture error 1117*437bfbebSnyanmisaka RK_U32 used_ref_flag; 1118*437bfbebSnyanmisaka RK_U32 dpb_err_flag; //!< dpb storage had error 1119*437bfbebSnyanmisaka 1120*437bfbebSnyanmisaka RK_U32 i_slice_no; 1121*437bfbebSnyanmisaka RK_S32 first_iframe_poc; 1122*437bfbebSnyanmisaka RK_S32 first_iframe_is_output; 1123*437bfbebSnyanmisaka } H264dErrCtx_t; 1124*437bfbebSnyanmisaka //!< decoder video parameter 1125*437bfbebSnyanmisaka typedef struct h264_dec_ctx_t { 1126*437bfbebSnyanmisaka struct h264d_mem_t *mem; 1127*437bfbebSnyanmisaka struct h264_dpb_mark_t *dpb_mark; //!< for write out, MAX_DPB_SIZE 1128*437bfbebSnyanmisaka struct h264_dpb_info_t *dpb_info; //!< 16 1129*437bfbebSnyanmisaka struct h264_refpic_info_t *refpic_info_p; //!< 32 1130*437bfbebSnyanmisaka struct h264_refpic_info_t *refpic_info_b[2]; //!< [2][32] 1131*437bfbebSnyanmisaka struct h264d_dxva_ctx_t *dxva_ctx; 1132*437bfbebSnyanmisaka 1133*437bfbebSnyanmisaka struct h264d_input_ctx_t *p_Inp; 1134*437bfbebSnyanmisaka struct h264d_cur_ctx_t *p_Cur; //!< current parameters, use in read nalu 1135*437bfbebSnyanmisaka struct h264d_video_ctx_t *p_Vid; //!< parameters for video decoder 1136*437bfbebSnyanmisaka RK_U32 spt_decode_mtds; //!< support decoder methods 1137*437bfbebSnyanmisaka NALU_STATUS nalu_ret; //!< current nalu state 1138*437bfbebSnyanmisaka SLICE_STATUS next_state; //!< RKV_SLICE_STATUS 1139*437bfbebSnyanmisaka RK_U8 have_slice_data; 1140*437bfbebSnyanmisaka RK_U8 is_new_frame; 1141*437bfbebSnyanmisaka RK_U8 is_parser_end; 1142*437bfbebSnyanmisaka RK_U8 svc_valid; 1143*437bfbebSnyanmisaka RK_U8 mvc_valid; 1144*437bfbebSnyanmisaka //!< add 1145*437bfbebSnyanmisaka MppBufSlots frame_slots; //!< corresponding to dpb_mark 1146*437bfbebSnyanmisaka MppBufSlots packet_slots; 1147*437bfbebSnyanmisaka MppDecCfgSet *cfg; 1148*437bfbebSnyanmisaka const MppDecHwCap *hw_info; 1149*437bfbebSnyanmisaka 1150*437bfbebSnyanmisaka MppFrame curframe; 1151*437bfbebSnyanmisaka MppPacket task_pkt; 1152*437bfbebSnyanmisaka 1153*437bfbebSnyanmisaka RK_S64 task_pts; 1154*437bfbebSnyanmisaka RK_U32 task_eos; 1155*437bfbebSnyanmisaka HalDecTask *in_task; 1156*437bfbebSnyanmisaka RK_S32 last_frame_slot_idx; 1157*437bfbebSnyanmisaka RK_U32 immediate_out; 1158*437bfbebSnyanmisaka struct h264_err_ctx_t errctx; 1159*437bfbebSnyanmisaka } H264_DecCtx_t; 1160*437bfbebSnyanmisaka 1161*437bfbebSnyanmisaka #endif /* __H264D_GLOBAL_H__ */ 1162