| /****************************************************************************** |
| * |
| * Copyright (C) 2018 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at: |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| ***************************************************************************** |
| * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore |
| */ |
| |
| /** |
| ****************************************************************************** |
| * @file ihevce_entropy_structs.h |
| * |
| * @brief |
| * This file contains encoder entropy context related structures and |
| * interface prototypes |
| * |
| * @author |
| * Ittiam |
| ****************************************************************************** |
| */ |
| |
| #ifndef _IHEVCE_ENTROPY_STRUCTS_H_ |
| #define _IHEVCE_ENTROPY_STRUCTS_H_ |
| |
| /*****************************************************************************/ |
| /* Constant Macros */ |
| /*****************************************************************************/ |
| /** |
| ****************************************************************************** |
| * @brief defines maximum transform depth in HEVC (32 to 4) |
| ****************************************************************************** |
| */ |
| #define MAX_TFR_DEPTH 5 |
| |
| /** |
| ****************************************************************************** |
| * @brief defines maximum qp delta to be coded as truncated unary code |
| ****************************************************************************** |
| */ |
| #define TU_MAX_QP_DELTA_ABS 5 |
| |
| /** |
| ****************************************************************************** |
| * @brief defines maximum value of context increment used for qp delta encode |
| ****************************************************************************** |
| */ |
| #define CTXT_MAX_QP_DELTA_ABS 1 |
| |
| /** |
| ****************************************************************************** |
| * @brief header length in the compressed scan coeff buffer of a TU |
| ****************************************************************************** |
| */ |
| #define COEFF_BUF_HEADER_LEN 4 |
| |
| /** |
| ****************************************************************************** |
| * @brief extracts the "bitpos" bit of a input variable x |
| ****************************************************************************** |
| */ |
| #define EXTRACT_BIT(val, x, bitpos) \ |
| { \ |
| val = ((((x) >> (bitpos)) & 0x1)); \ |
| } |
| |
| /** |
| ****************************************************************************** |
| * @brief inserts bit y in "bitpos' position of input varaible x |
| ****************************************************************************** |
| */ |
| #define INSERT_BIT(x, bitpos, y) ((x) |= ((y) << (bitpos))) |
| |
| /** |
| ****************************************************************************** |
| * @brief sets n bits starting from "bitpos' position of input varaible x |
| ****************************************************************************** |
| */ |
| #define SET_BITS(x, bitpos, n) ((x) |= (((1 << (n)) - 1) << (bitpos))) |
| |
| /** |
| ****************************************************************************** |
| * @brief clears n bits starting from "bitpos' position of input varaible x |
| ****************************************************************************** |
| */ |
| #define CLEAR_BITS(x, bitpos, n) ((x) &= (~(((1 << (n)) - 1) << (bitpos)))) |
| |
| /*****************************************************************************/ |
| /* Enums */ |
| /*****************************************************************************/ |
| |
| /** |
| ****************************************************************************** |
| * @brief Enumeration for memory records requested by entropy module |
| ****************************************************************************** |
| */ |
| typedef enum |
| { |
| ENTROPY_CTXT = 0, |
| ENTROPY_TOP_SKIP_FLAGS, |
| ENTROPY_TOP_CU_DEPTH, |
| ENTROPY_DUMMY_OUT_BUF, |
| |
| /* should always be the last entry */ |
| NUM_ENTROPY_MEM_RECS |
| |
| } IHEVCE_ENTROPY_MEM_TABS_T; |
| |
| /*****************************************************************************/ |
| /* Structures */ |
| /*****************************************************************************/ |
| |
| /** |
| ****************************************************************************** |
| * @brief Entropy context for encoder |
| ****************************************************************************** |
| */ |
| typedef struct entropy_context |
| { |
| /** cabac engine context */ |
| cab_ctxt_t s_cabac_ctxt; |
| |
| /** bitstream context */ |
| bitstrm_t s_bit_strm; |
| |
| /** |
| * duplicate bitstream to generate entry offset |
| * to support entropy sync |
| */ |
| bitstrm_t s_dup_bit_strm_ent_offset; |
| |
| /** pointer to top row cu skip flags (1 bit per 8x8CU) */ |
| UWORD8 *pu1_skip_cu_top; |
| |
| /** pointer to top row cu depth buffer (1 byte per 8x8CU) */ |
| UWORD8 *pu1_cu_depth_top; |
| |
| /** pointer to parent coded block flags based on trasform depth */ |
| UWORD8 *apu1_cbf_cb[2]; |
| |
| /** pointer to parent coded block flags based on trasform depth */ |
| UWORD8 *apu1_cbf_cr[2]; |
| |
| /** left cu skip flags (max of 8) (1 bit per 8x8) */ |
| UWORD32 u4_skip_cu_left; |
| |
| /** array of left cu skip flags (max of 8) (1 byte per 8x8) */ |
| UWORD8 au1_cu_depth_left[8]; |
| |
| /** scratch array of cb coded block flags for tu recursion */ |
| UWORD8 au1_cbf_cb[2][MAX_TFR_DEPTH + 1]; |
| |
| /** scratch array of cr coded block flags for tu recursion */ |
| UWORD8 au1_cbf_cr[2][MAX_TFR_DEPTH + 1]; |
| |
| /** current ctb x offset w.r.t frame start */ |
| WORD32 i4_ctb_x; |
| |
| /** current ctb y offset w.r.t frame start */ |
| WORD32 i4_ctb_y; |
| |
| //These values are never consumed apart from test-bench. Observed on June16 2014. |
| /** current slice first ctb x offset w.r.t frame start */ |
| /** current slice first ctb y offset w.r.t frame start */ |
| WORD32 i4_ctb_slice_x; |
| WORD32 i4_ctb_slice_y; |
| |
| /** Address of first CTB of next slice segment. In ctb unit */ |
| WORD32 i4_next_slice_seg_x; |
| |
| /** Address of first CTB of next slice segment. In ctb unit */ |
| WORD32 i4_next_slice_seg_y; |
| |
| /** sracth place holder for cu index of a ctb in context */ |
| WORD32 i4_cu_idx; |
| |
| /** sracth place holder for tu index of a cu in context */ |
| WORD32 i4_tu_idx; |
| |
| /** pcm not supported currently; this parameter shall be 0 */ |
| WORD8 i1_ctb_num_pcm_blks; |
| |
| /** indicates if qp delta is to be coded in trasform unit of a cu */ |
| WORD8 i1_encode_qp_delta; |
| |
| /** place holder for current qp of a cu */ |
| WORD8 i1_cur_qp; |
| |
| /** log2ctbsize indicated in SPS */ |
| WORD8 i1_log2_ctb_size; |
| |
| /**************************************************************************/ |
| /* Following are shared structures with the encoder loop */ |
| /* entropy context is not the owner of these and hence not allocated here */ |
| /**************************************************************************/ |
| /** pointer to current vps parameters */ |
| vps_t *ps_vps; |
| |
| /** pointer to current sps parameters */ |
| sps_t *ps_sps; |
| |
| /** pointer to current pps parameters */ |
| pps_t *ps_pps; |
| |
| /** pointer to current sei parameters */ |
| sei_params_t *ps_sei; |
| |
| /** pointer to current slice header parameters */ |
| slice_header_t *ps_slice_hdr; |
| |
| /** pointer to frame level ctb structures prepared by main encode loop */ |
| ctb_enc_loop_out_t *ps_frm_ctb; |
| |
| /** |
| * array to store cu level qp for entire 64x64 ctb |
| */ |
| WORD32 ai4_8x8_cu_qp[64]; |
| |
| /** |
| * flag to check if cbf all tu in a given cu is zero |
| */ |
| WORD32 i4_is_cu_cbf_zero; |
| |
| /** |
| * flag to enable / disbale residue encoding (used for RD opt bits estimate mode) |
| */ |
| WORD32 i4_enable_res_encode; |
| |
| /* flag to enable/disable insertion of SPS, VPS, PPS at CRA pictures */ |
| WORD32 i4_sps_at_cdr_enable; |
| |
| /* quantization group position variables which stores the aligned position */ |
| WORD32 i4_qg_pos_x; |
| |
| WORD32 i4_qg_pos_y; |
| |
| void *pv_tile_params_base; |
| |
| s_pic_level_acc_info_t *ps_pic_level_info; |
| |
| void *pv_sys_api; |
| |
| /* Flag to control dependent slices. |
| 0: Disable all slice segment limits |
| 1: Enforce max number of CTBs (not supported) |
| 2: Enforce max number of bytes */ |
| WORD32 i4_slice_segment_mode; |
| |
| /* Max number of CTBs/bytes in encoded slice. Will be used only when |
| i4_slice_mode_enable is set to 1 or 2 in configuration file. This parameter is |
| used for limiting the size of encoded slice under user-configured value */ |
| WORD32 i4_slice_segment_max_length; |
| |
| /* Accumulated number of CTBs/bytes in current slice */ |
| WORD32 i4_slice_seg_len; |
| |
| /** Number of slice segments generated per picture |
| this parameter is to track the number of slices generated |
| and comapre aganist MAX NUM VCL Nals allowed at a given level */ |
| WORD32 i4_num_slice_seg; |
| |
| /** Codec Level */ |
| WORD32 i4_codec_level; |
| |
| /** |
| * number of neigbour cus coded as skips; Cannot exceed 2 (1 left, 1 top) |
| */ |
| WORD32 i4_num_nbr_skip_cus; |
| |
| void *pv_dummy_out_buf; |
| |
| WORD32 i4_bitstream_buf_size; |
| } entropy_context_t; |
| |
| /*****************************************************************************/ |
| /* Extern Function Declarations */ |
| /*****************************************************************************/ |
| WORD32 ihevce_encode_transform_tree( |
| entropy_context_t *ps_entropy_ctxt, |
| WORD32 x0_ctb, |
| WORD32 y0_ctb, |
| WORD32 log2_tr_size, |
| WORD32 tr_depth, |
| WORD32 blk_num, |
| cu_enc_loop_out_t *ps_enc_cu); |
| |
| WORD32 ihevce_cabac_residue_encode( |
| entropy_context_t *ps_entropy_ctxt, void *pv_coeff, WORD32 log2_tr_size, WORD32 is_luma); |
| |
| WORD32 ihevce_cabac_residue_encode_rdopt( |
| entropy_context_t *ps_entropy_ctxt, |
| void *pv_coeff, |
| WORD32 log2_tr_size, |
| WORD32 is_luma, |
| WORD32 perform_rdoq); |
| |
| WORD32 ihevce_cabac_residue_encode_rdoq( |
| entropy_context_t *ps_entropy_ctxt, |
| void *pv_coeff, |
| WORD32 log2_tr_size, |
| WORD32 is_luma, |
| void *ps_rdoq_ctxt_1, |
| LWORD64 *pi8_tu_coded_dist, |
| LWORD64 *pi8_not_coded_dist, |
| WORD32 perform_sbh); |
| |
| WORD32 ihevce_find_new_last_csb( |
| WORD32 *pi4_subBlock2csbfId_map, |
| WORD32 cur_last_csb_pos, |
| void *pv_rdoq_ctxt, |
| UWORD8 *pu1_trans_table, |
| UWORD8 *pu1_csb_table, |
| WORD16 *pi2_coeffs, |
| WORD32 shift_value, |
| WORD32 mask_value, |
| UWORD8 **ppu1_addr); |
| |
| WORD32 ihevce_code_all_sig_coeffs_as_0_explicitly( |
| void *pv_rdoq_ctxt, |
| WORD32 i, |
| UWORD8 *pu1_trans_table, |
| WORD32 is_luma, |
| WORD32 scan_type, |
| WORD32 infer_coeff, |
| WORD32 nbr_csbf, |
| cab_ctxt_t *ps_cabac); |
| |
| void ihevce_copy_backup_ctxt( |
| void *pv_dest, void *pv_src, void *pv_backup_ctxt_dest, void *pv_backup_ctxt_src); |
| |
| WORD32 ihevce_cabac_encode_coding_unit( |
| entropy_context_t *ps_entropy_ctxt, |
| cu_enc_loop_out_t *ps_enc_cu, |
| WORD32 cu_depth, |
| WORD32 top_avail, |
| WORD32 left_avail); |
| |
| WORD32 ihevce_encode_slice_data( |
| entropy_context_t *ps_entropy_ctxt, |
| ihevce_tile_params_t *ps_tile_params, |
| WORD32 *pi4_end_of_slice_flag); |
| |
| WORD32 ihevce_cabac_encode_sao( |
| entropy_context_t *ps_entropy_ctxt, ctb_enc_loop_out_t *ps_ctb_enc_loop_out); |
| |
| #endif /* _IHEVCE_ENTROPY_STRUCTS_H_ */ |