1 /****************************************************************************** 2 * 3 * Copyright (C) 2018 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ***************************************************************************** 18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19 */ 20 21 /** 22 ****************************************************************************** 23 * @file ihevce_entropy_structs.h 24 * 25 * @brief 26 * This file contains encoder entropy context related structures and 27 * interface prototypes 28 * 29 * @author 30 * Ittiam 31 ****************************************************************************** 32 */ 33 34 #ifndef _IHEVCE_ENTROPY_STRUCTS_H_ 35 #define _IHEVCE_ENTROPY_STRUCTS_H_ 36 37 /*****************************************************************************/ 38 /* Constant Macros */ 39 /*****************************************************************************/ 40 /** 41 ****************************************************************************** 42 * @brief defines maximum transform depth in HEVC (32 to 4) 43 ****************************************************************************** 44 */ 45 #define MAX_TFR_DEPTH 5 46 47 /** 48 ****************************************************************************** 49 * @brief defines maximum qp delta to be coded as truncated unary code 50 ****************************************************************************** 51 */ 52 #define TU_MAX_QP_DELTA_ABS 5 53 54 /** 55 ****************************************************************************** 56 * @brief defines maximum value of context increment used for qp delta encode 57 ****************************************************************************** 58 */ 59 #define CTXT_MAX_QP_DELTA_ABS 1 60 61 /** 62 ****************************************************************************** 63 * @brief header length in the compressed scan coeff buffer of a TU 64 ****************************************************************************** 65 */ 66 #define COEFF_BUF_HEADER_LEN 4 67 68 /** 69 ****************************************************************************** 70 * @brief extracts the "bitpos" bit of a input variable x 71 ****************************************************************************** 72 */ 73 #define EXTRACT_BIT(val, x, bitpos) \ 74 { \ 75 val = ((((x) >> (bitpos)) & 0x1)); \ 76 } 77 78 /** 79 ****************************************************************************** 80 * @brief inserts bit y in "bitpos' position of input varaible x 81 ****************************************************************************** 82 */ 83 #define INSERT_BIT(x, bitpos, y) ((x) |= ((y) << (bitpos))) 84 85 /** 86 ****************************************************************************** 87 * @brief sets n bits starting from "bitpos' position of input varaible x 88 ****************************************************************************** 89 */ 90 #define SET_BITS(x, bitpos, n) ((x) |= (((1 << (n)) - 1) << (bitpos))) 91 92 /** 93 ****************************************************************************** 94 * @brief clears n bits starting from "bitpos' position of input varaible x 95 ****************************************************************************** 96 */ 97 #define CLEAR_BITS(x, bitpos, n) ((x) &= (~(((1 << (n)) - 1) << (bitpos)))) 98 99 /*****************************************************************************/ 100 /* Enums */ 101 /*****************************************************************************/ 102 103 /** 104 ****************************************************************************** 105 * @brief Enumeration for memory records requested by entropy module 106 ****************************************************************************** 107 */ 108 typedef enum 109 { 110 ENTROPY_CTXT = 0, 111 ENTROPY_TOP_SKIP_FLAGS, 112 ENTROPY_TOP_CU_DEPTH, 113 ENTROPY_DUMMY_OUT_BUF, 114 115 /* should always be the last entry */ 116 NUM_ENTROPY_MEM_RECS 117 118 } IHEVCE_ENTROPY_MEM_TABS_T; 119 120 /*****************************************************************************/ 121 /* Structures */ 122 /*****************************************************************************/ 123 124 /** 125 ****************************************************************************** 126 * @brief Entropy context for encoder 127 ****************************************************************************** 128 */ 129 typedef struct entropy_context 130 { 131 /** cabac engine context */ 132 cab_ctxt_t s_cabac_ctxt; 133 134 /** bitstream context */ 135 bitstrm_t s_bit_strm; 136 137 /** 138 * duplicate bitstream to generate entry offset 139 * to support entropy sync 140 */ 141 bitstrm_t s_dup_bit_strm_ent_offset; 142 143 /** pointer to top row cu skip flags (1 bit per 8x8CU) */ 144 UWORD8 *pu1_skip_cu_top; 145 146 /** pointer to top row cu depth buffer (1 byte per 8x8CU) */ 147 UWORD8 *pu1_cu_depth_top; 148 149 /** pointer to parent coded block flags based on trasform depth */ 150 UWORD8 *apu1_cbf_cb[2]; 151 152 /** pointer to parent coded block flags based on trasform depth */ 153 UWORD8 *apu1_cbf_cr[2]; 154 155 /** left cu skip flags (max of 8) (1 bit per 8x8) */ 156 UWORD32 u4_skip_cu_left; 157 158 /** array of left cu skip flags (max of 8) (1 byte per 8x8) */ 159 UWORD8 au1_cu_depth_left[8]; 160 161 /** scratch array of cb coded block flags for tu recursion */ 162 UWORD8 au1_cbf_cb[2][MAX_TFR_DEPTH + 1]; 163 164 /** scratch array of cr coded block flags for tu recursion */ 165 UWORD8 au1_cbf_cr[2][MAX_TFR_DEPTH + 1]; 166 167 /** current ctb x offset w.r.t frame start */ 168 WORD32 i4_ctb_x; 169 170 /** current ctb y offset w.r.t frame start */ 171 WORD32 i4_ctb_y; 172 173 //These values are never consumed apart from test-bench. Observed on June16 2014. 174 /** current slice first ctb x offset w.r.t frame start */ 175 /** current slice first ctb y offset w.r.t frame start */ 176 WORD32 i4_ctb_slice_x; 177 WORD32 i4_ctb_slice_y; 178 179 /** Address of first CTB of next slice segment. In ctb unit */ 180 WORD32 i4_next_slice_seg_x; 181 182 /** Address of first CTB of next slice segment. In ctb unit */ 183 WORD32 i4_next_slice_seg_y; 184 185 /** sracth place holder for cu index of a ctb in context */ 186 WORD32 i4_cu_idx; 187 188 /** sracth place holder for tu index of a cu in context */ 189 WORD32 i4_tu_idx; 190 191 /** pcm not supported currently; this parameter shall be 0 */ 192 WORD8 i1_ctb_num_pcm_blks; 193 194 /** indicates if qp delta is to be coded in trasform unit of a cu */ 195 WORD8 i1_encode_qp_delta; 196 197 /** place holder for current qp of a cu */ 198 WORD8 i1_cur_qp; 199 200 /** log2ctbsize indicated in SPS */ 201 WORD8 i1_log2_ctb_size; 202 203 /**************************************************************************/ 204 /* Following are shared structures with the encoder loop */ 205 /* entropy context is not the owner of these and hence not allocated here */ 206 /**************************************************************************/ 207 /** pointer to current vps parameters */ 208 vps_t *ps_vps; 209 210 /** pointer to current sps parameters */ 211 sps_t *ps_sps; 212 213 /** pointer to current pps parameters */ 214 pps_t *ps_pps; 215 216 /** pointer to current sei parameters */ 217 sei_params_t *ps_sei; 218 219 /** pointer to current slice header parameters */ 220 slice_header_t *ps_slice_hdr; 221 222 /** pointer to frame level ctb structures prepared by main encode loop */ 223 ctb_enc_loop_out_t *ps_frm_ctb; 224 225 /** 226 * array to store cu level qp for entire 64x64 ctb 227 */ 228 WORD32 ai4_8x8_cu_qp[64]; 229 230 /** 231 * flag to check if cbf all tu in a given cu is zero 232 */ 233 WORD32 i4_is_cu_cbf_zero; 234 235 /** 236 * flag to enable / disbale residue encoding (used for RD opt bits estimate mode) 237 */ 238 WORD32 i4_enable_res_encode; 239 240 /* flag to enable/disable insertion of SPS, VPS, PPS at CRA pictures */ 241 WORD32 i4_sps_at_cdr_enable; 242 243 /* quantization group position variables which stores the aligned position */ 244 WORD32 i4_qg_pos_x; 245 246 WORD32 i4_qg_pos_y; 247 248 void *pv_tile_params_base; 249 250 s_pic_level_acc_info_t *ps_pic_level_info; 251 252 void *pv_sys_api; 253 254 /* Flag to control dependent slices. 255 0: Disable all slice segment limits 256 1: Enforce max number of CTBs (not supported) 257 2: Enforce max number of bytes */ 258 WORD32 i4_slice_segment_mode; 259 260 /* Max number of CTBs/bytes in encoded slice. Will be used only when 261 i4_slice_mode_enable is set to 1 or 2 in configuration file. This parameter is 262 used for limiting the size of encoded slice under user-configured value */ 263 WORD32 i4_slice_segment_max_length; 264 265 /* Accumulated number of CTBs/bytes in current slice */ 266 WORD32 i4_slice_seg_len; 267 268 /** Number of slice segments generated per picture 269 this parameter is to track the number of slices generated 270 and comapre aganist MAX NUM VCL Nals allowed at a given level */ 271 WORD32 i4_num_slice_seg; 272 273 /** Codec Level */ 274 WORD32 i4_codec_level; 275 276 /** 277 * number of neigbour cus coded as skips; Cannot exceed 2 (1 left, 1 top) 278 */ 279 WORD32 i4_num_nbr_skip_cus; 280 281 void *pv_dummy_out_buf; 282 283 WORD32 i4_bitstream_buf_size; 284 } entropy_context_t; 285 286 /*****************************************************************************/ 287 /* Extern Function Declarations */ 288 /*****************************************************************************/ 289 WORD32 ihevce_encode_transform_tree( 290 entropy_context_t *ps_entropy_ctxt, 291 WORD32 x0_ctb, 292 WORD32 y0_ctb, 293 WORD32 log2_tr_size, 294 WORD32 tr_depth, 295 WORD32 blk_num, 296 cu_enc_loop_out_t *ps_enc_cu); 297 298 WORD32 ihevce_cabac_residue_encode( 299 entropy_context_t *ps_entropy_ctxt, void *pv_coeff, WORD32 log2_tr_size, WORD32 is_luma); 300 301 WORD32 ihevce_cabac_residue_encode_rdopt( 302 entropy_context_t *ps_entropy_ctxt, 303 void *pv_coeff, 304 WORD32 log2_tr_size, 305 WORD32 is_luma, 306 WORD32 perform_rdoq); 307 308 WORD32 ihevce_cabac_residue_encode_rdoq( 309 entropy_context_t *ps_entropy_ctxt, 310 void *pv_coeff, 311 WORD32 log2_tr_size, 312 WORD32 is_luma, 313 void *ps_rdoq_ctxt_1, 314 LWORD64 *pi8_tu_coded_dist, 315 LWORD64 *pi8_not_coded_dist, 316 WORD32 perform_sbh); 317 318 WORD32 ihevce_find_new_last_csb( 319 WORD32 *pi4_subBlock2csbfId_map, 320 WORD32 cur_last_csb_pos, 321 void *pv_rdoq_ctxt, 322 UWORD8 *pu1_trans_table, 323 UWORD8 *pu1_csb_table, 324 WORD16 *pi2_coeffs, 325 WORD32 shift_value, 326 WORD32 mask_value, 327 UWORD8 **ppu1_addr); 328 329 WORD32 ihevce_code_all_sig_coeffs_as_0_explicitly( 330 void *pv_rdoq_ctxt, 331 WORD32 i, 332 UWORD8 *pu1_trans_table, 333 WORD32 is_luma, 334 WORD32 scan_type, 335 WORD32 infer_coeff, 336 WORD32 nbr_csbf, 337 cab_ctxt_t *ps_cabac); 338 339 void ihevce_copy_backup_ctxt( 340 void *pv_dest, void *pv_src, void *pv_backup_ctxt_dest, void *pv_backup_ctxt_src); 341 342 WORD32 ihevce_cabac_encode_coding_unit( 343 entropy_context_t *ps_entropy_ctxt, 344 cu_enc_loop_out_t *ps_enc_cu, 345 WORD32 cu_depth, 346 WORD32 top_avail, 347 WORD32 left_avail); 348 349 WORD32 ihevce_encode_slice_data( 350 entropy_context_t *ps_entropy_ctxt, 351 ihevce_tile_params_t *ps_tile_params, 352 WORD32 *pi4_end_of_slice_flag); 353 354 WORD32 ihevce_cabac_encode_sao( 355 entropy_context_t *ps_entropy_ctxt, ctb_enc_loop_out_t *ps_ctb_enc_loop_out); 356 357 #endif /* _IHEVCE_ENTROPY_STRUCTS_H_ */ 358