1 /****************************************************************************** 2 * 3 * Copyright (C) 2015 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 24 * ih264e_cabac_structs.h 25 * 26 * @brief 27 * This file contains cabac related structure definitions. 28 * 29 * @author 30 * Doney Alex 31 * 32 * @remarks 33 * none 34 * 35 ******************************************************************************* 36 */ 37 38 #ifndef IH264E_CABAC_STRUCTS_H_ 39 #define IH264E_CABAC_STRUCTS_H_ 40 41 42 43 #define CABAC_INIT_IDC 2 44 45 46 /** 47 ****************************************************************************** 48 * @brief typedef for context model 49 ****************************************************************************** 50 */ 51 52 /* bits 0 to 5 :state 53 bit 6 :mps */ 54 typedef UWORD8 bin_ctxt_model; 55 56 /** 57 ****************************************************************************** 58 * @brief MB info for cabac 59 ****************************************************************************** 60 */ 61 typedef struct 62 { 63 /* Neighbour availability Variables needed to get CtxtInc, for CABAC */ 64 UWORD8 u1_mb_type; /* !< macroblock type: I/P/B/SI/SP */ 65 66 UWORD8 u1_cbp; /* !< Coded Block Pattern */ 67 UWORD8 u1_intrapred_chroma_mode; 68 69 /*************************************************************************/ 70 /* Arrangnment of AC CSBP */ 71 /* bits: b7 b6 b5 b4 b3 b2 b1 b0 */ 72 /* CSBP: V1 V0 U1 U0 Y3 Y2 Y1 Y0 */ 73 /*************************************************************************/ 74 UWORD8 u1_yuv_ac_csbp; 75 /*************************************************************************/ 76 /* Arrangnment of DC CSBP */ 77 /* bits: b7 b6 b5 b4 b3 b2 b1 b0 */ 78 /* CSBP: x x x x x Vdc Udc Ydc */ 79 /*************************************************************************/ 80 UWORD8 u1_yuv_dc_csbp; 81 82 WORD8 i1_ref_idx[4]; 83 UWORD8 u1_mv[4][4]; 84 } mb_info_ctxt_t; 85 86 87 /** 88 ****************************************************************************** 89 * @brief CSBP info for CABAC 90 ****************************************************************************** 91 */ 92 typedef struct 93 { 94 /*************************************************************************/ 95 /* Arrangnment of Luma AC CSBP for leftMb */ 96 /* bits: b7 b6 b5 b4 b3 b2 b1 b0 */ 97 /* CSBP: X X X X Y3 Y2 Y1 Y0 */ 98 /*************************************************************************/ 99 /*************************************************************************/ 100 /* Points either to u1_y_ac_csbp_top_mb or u1_y_ac_csbp_bot_mb */ 101 /*************************************************************************/ 102 UWORD8 u1_y_ac_csbp_top_mb; 103 UWORD8 u1_y_ac_csbp_bot_mb; 104 105 /*************************************************************************/ 106 /* Arrangnment of Chroma AC CSBP for leftMb */ 107 /* bits: b7 b6 b5 b4 b3 b2 b1 b0 */ 108 /* CSBP: X X X X V1 V0 U1 U0 */ 109 /*************************************************************************/ 110 /*************************************************************************/ 111 /* Points either to u1_uv_ac_csbp_top_mb or u1_uv_ac_csbp_bot_mb */ 112 /*************************************************************************/ 113 UWORD8 u1_uv_ac_csbp_top_mb; 114 UWORD8 u1_uv_ac_csbp_bot_mb; 115 116 /*************************************************************************/ 117 /* Arrangnment of DC CSBP */ 118 /* bits: b7 b6 b5 b4 b3 b2 b1 b0 */ 119 /* CSBP: x x x x x Vdc Udc Ydc */ 120 /*************************************************************************/ 121 /*************************************************************************/ 122 /* Points either to u1_yuv_dc_csbp_top_mb or u1_yuv_dc_csbp_bot_mb */ 123 /*************************************************************************/ 124 UWORD8 u1_yuv_dc_csbp_top_mb; 125 UWORD8 u1_yuv_dc_csbp_bot_mb; 126 } cab_csbp_t; 127 128 /** 129 ****************************************************************************** 130 * @brief CABAC Encoding Environment 131 ****************************************************************************** 132 */ 133 134 typedef struct 135 { 136 /** cabac interval start L */ 137 UWORD32 u4_code_int_low; 138 139 /** cabac interval range R */ 140 UWORD32 u4_code_int_range; 141 142 /** bytes_outsanding; number of 0xFF bits that occur during renorm 143 * These will be accumulated till the carry bit is knwon 144 */ 145 UWORD32 u4_out_standing_bytes; 146 147 /** bits generated during renormalization 148 * A byte is put to stream/u4_out_standing_bytes from u4_low(L) when 149 * u4_bits_gen exceeds 8 150 */ 151 UWORD32 u4_bits_gen; 152 } encoding_envirnoment_t; 153 154 155 /** 156 ****************************************************************************** 157 * @brief CABAC Context structure : Variables to handle Cabac 158 ****************************************************************************** 159 */ 160 typedef struct 161 { 162 163 /* Base pointer to all the cabac contexts */ 164 bin_ctxt_model au1_cabac_ctxt_table[NUM_CABAC_CTXTS]; 165 166 167 cab_csbp_t s_lft_csbp; 168 169 /** 170 * pointer to Bitstream structure 171 */ 172 bitstrm_t *ps_bitstrm; 173 174 /* Pointer to mb_info_ctxt_t map_base */ 175 mb_info_ctxt_t *ps_mb_map_ctxt_inc_base; 176 177 /* Pointer to encoding_envirnoment_t */ 178 encoding_envirnoment_t s_cab_enc_env; 179 180 /* These things need to be updated at each MbLevel */ 181 182 /* Prev ps_mb_qp_delta_ctxt */ 183 WORD8 i1_prevps_mb_qp_delta_ctxt; 184 185 /* Pointer to mb_info_ctxt_t map */ 186 mb_info_ctxt_t *ps_mb_map_ctxt_inc; 187 188 /* Pointer to default mb_info_ctxt_t */ 189 mb_info_ctxt_t *ps_def_ctxt_mb_info; 190 191 /* Pointer to current mb_info_ctxt_t */ 192 mb_info_ctxt_t *ps_curr_ctxt_mb_info; 193 194 /* Pointer to left mb_info_ctxt_t */ 195 mb_info_ctxt_t *ps_left_ctxt_mb_info; 196 197 /* Pointer to top mb_info_ctxt_t */ 198 mb_info_ctxt_t *ps_top_ctxt_mb_info; 199 200 /* Poniter to left csbp structure */ 201 cab_csbp_t *ps_lft_csbp; 202 UWORD8 *pu1_left_y_ac_csbp; 203 UWORD8 *pu1_left_uv_ac_csbp; 204 UWORD8 *pu1_left_yuv_dc_csbp; 205 206 /***************************************************************************/ 207 /* Ref_idx contexts are stored in the following way */ 208 /* Array Idx 0,1 for reference indices in Forward direction */ 209 /* Array Idx 2,3 for reference indices in backward direction */ 210 /***************************************************************************/ 211 /* Dimensions for u1_left_ref_ctxt_inc_arr is [2][4] for Mbaff:Top and Bot */ 212 WORD8 i1_left_ref_idx_ctx_inc_arr[2][4]; 213 WORD8 *pi1_left_ref_idx_ctxt_inc; 214 215 /* Dimensions for u1_left_mv_ctxt_inc_arr is [2][4][4] for Mbaff case */ 216 UWORD8 u1_left_mv_ctxt_inc_arr[2][4][4]; 217 UWORD8 (*pu1_left_mv_ctxt_inc)[4]; 218 219 } cabac_ctxt_t; 220 221 #endif /* IH264E_CABAC_STRUCTS_H_ */ 222