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 * 24 * @file ihevce_cabac.h 25 * 26 * @brief 27 * This file contains encoder cabac engine related structures and 28 * interface prototypes 29 * 30 * @author 31 * ittiam 32 * 33 ****************************************************************************** 34 */ 35 36 #ifndef _IHEVCE_CABAC_H_ 37 #define _IHEVCE_CABAC_H_ 38 39 #include "ihevc_debug.h" 40 #include "ihevc_macros.h" 41 42 /*****************************************************************************/ 43 /* Constant Macros */ 44 /*****************************************************************************/ 45 /** 46 ******************************************************************************* 47 @brief Bit precision of cabac engine; 48 ******************************************************************************* 49 */ 50 #define CABAC_BITS 9 51 52 /** 53 ******************************************************************************* 54 @brief q format to account for the fractional bits encoded in cabac 55 ******************************************************************************* 56 */ 57 #define CABAC_FRAC_BITS_Q 12 58 59 /** 60 ******************************************************************************* 61 @brief Enables bit-efficient chroma cbf signalling by peeking into cbfs of 62 children nodes 63 ******************************************************************************* 64 */ 65 #define CABAC_BIT_EFFICIENT_CHROMA_PARENT_CBF 1 66 67 /*****************************************************************************/ 68 /* Function Macros */ 69 /*****************************************************************************/ 70 71 /** 72 ******************************************************************************* 73 @brief converts floating point number to CABAC_FRAC_BITS_Q q format and 74 rounds the results to 16 bit integer 75 ******************************************************************************* 76 */ 77 #define ROUND_Q12(x) ((UWORD16)(((x) * (1 << CABAC_FRAC_BITS_Q)) + 0.5)) 78 79 /*****************************************************************************/ 80 /* Enums */ 81 /*****************************************************************************/ 82 83 /** 84 ******************************************************************************* 85 @brief Enums for controlling the operating mode of cabac engine 86 ******************************************************************************* 87 */ 88 typedef enum 89 { 90 /** in this mode, bits are encoded in the bit stream buffer */ 91 CABAC_MODE_ENCODE_BITS = 0, 92 93 /** in this mode, only num bits gen are computed but not put in the stream */ 94 CABAC_MODE_COMPUTE_BITS = 1 95 96 } CABAC_OP_MODE; 97 98 /*****************************************************************************/ 99 /* Structures */ 100 /*****************************************************************************/ 101 102 /** 103 ****************************************************************************** 104 * @brief Cabac context for encoder 105 ****************************************************************************** 106 */ 107 typedef struct cab_ctxt 108 { 109 /** 110 * indicates if cabac encode works in put bits mode or bit compute mode 111 * In puts bits mode, bitstream and cabac engine fields L,R etc are used 112 * In bit compute mode, bitstream and cabac engine fields are not used 113 */ 114 CABAC_OP_MODE e_cabac_op_mode; 115 116 /** 117 * total bits estimated (for a cu) when mode is CABAC_MODE_COMPUTE_BITS 118 * This is in q12 format to account for the fractional bits as well 119 */ 120 UWORD32 u4_bits_estimated_q12; 121 122 /** 123 * total texture bits estimated (for a cu) when mode is CABAC_MODE_COMPUTE_BITS 124 * This is in q12 format to account for the fractional bits as well 125 */ 126 UWORD32 u4_texture_bits_estimated_q12; 127 128 /** 129 * total header bits estimated (for a cu) when mode is CABAC_MODE_COMPUTE_BITS 130 * This is in q12 format to account for the fractional bits as well 131 */ 132 UWORD32 u4_header_bits_estimated_q12; 133 134 UWORD32 u4_cbf_bits_q12; 135 136 UWORD32 u4_true_tu_split_flag_q12; 137 /*********************************************************************/ 138 /* CABAC ENGINE related fields; not used in CABAC_MODE_COMPUTE_BITS */ 139 /*********************************************************************/ 140 /** cabac interval range R */ 141 UWORD32 u4_range; 142 143 /** cabac interval start L */ 144 UWORD32 u4_low; 145 146 /** bits generated during renormalization 147 * A byte is put to stream/u4_out_standing_bytes from u4_low(L) when 148 * u4_bits_gen exceeds 8 149 */ 150 UWORD32 u4_bits_gen; 151 152 /** bytes_outsanding; number of 0xFF bits that occur during renorm 153 * These will be accumulated till the carry bit is knwon 154 */ 155 UWORD32 u4_out_standing_bytes; 156 157 /*************************************************************************/ 158 /* OUTPUT Bitstream related fields; not used in CABAC_MODE_COMPUTE_BITS */ 159 /*************************************************************************/ 160 /** points to start of stream buffer. */ 161 UWORD8 *pu1_strm_buffer; 162 163 /** 164 * max bitstream size (in bytes). 165 * Encoded stream shall not exceed this size. 166 */ 167 UWORD32 u4_max_strm_size; 168 169 /** 170 `* byte offset (w.r.t pu1_strm_buffer) where next byte would be written 171 * Bitstream engine makes sure it would not corrupt data beyond 172 * u4_max_strm_size bytes 173 */ 174 UWORD32 u4_strm_buf_offset; 175 176 /** 177 * signifies the number of consecutive zero bytes propogated from previous 178 * word. It is used for emulation prevention byte insertion in the stream 179 */ 180 WORD32 i4_zero_bytes_run; 181 182 /*********************************************************************/ 183 /* CABAC context models */ 184 /*********************************************************************/ 185 /** All Context models stored in packed form pState[bits6-1] | MPS[bit0] */ 186 UWORD8 au1_ctxt_models[IHEVC_CAB_CTXT_END]; 187 188 /** 189 *Cabac context for start of every row which is same as top right ctxt 190 */ 191 UWORD8 au1_ctxt_models_top_right[IHEVC_CAB_CTXT_END]; 192 193 /** 194 * copy of enable entropy coding sync flag in pps 195 */ 196 WORD8 i1_entropy_coding_sync_enabled_flag; 197 198 /** 199 * store the bitstream offset from which first slice data is generated by cabac 200 */ 201 UWORD32 u4_first_slice_start_offset; 202 203 } cab_ctxt_t; 204 205 /*****************************************************************************/ 206 /* Globals */ 207 /*****************************************************************************/ 208 extern UWORD16 gau2_ihevce_cabac_bin_to_bits[64 * 2]; 209 210 /*****************************************************************************/ 211 /* Extern Function Declarations */ 212 /*****************************************************************************/ 213 WORD32 214 ihevce_cabac_reset(cab_ctxt_t *ps_cabac, bitstrm_t *ps_bitstrm, CABAC_OP_MODE e_cabac_op_mode); 215 216 WORD32 ihevce_cabac_init( 217 cab_ctxt_t *ps_cabac, 218 bitstrm_t *ps_bitstrm, 219 WORD32 slice_qp, 220 WORD32 cabac_init_idc, 221 CABAC_OP_MODE e_cabac_op_mode); 222 223 WORD32 ihevce_cabac_put_byte(cab_ctxt_t *ps_cabac); 224 225 /** 226 ****************************************************************************** 227 * 228 * @brief Codes a bin based on probablilty and mps packed context model 229 * 230 * @par Description 231 * 1. Apart from encoding bin, context model is updated as per state transition 232 * 2. Range and Low renormalization is done based on bin and original state 233 * 3. After renorm bistream is updated (if required) 234 * 235 * @param[inout] ps_cabac 236 * pointer to cabac context (handle) 237 * 238 * @param[in] bin 239 * bin(boolean) to be encoded 240 * 241 * @param[in] ctxt_index 242 * index of cabac context model containing pState[bits6-1] | MPS[bit0] 243 * 244 * @return success or failure error code 245 * 246 ****************************************************************************** 247 */ 248 static INLINE WORD32 ihevce_cabac_encode_bin(cab_ctxt_t *ps_cabac, WORD32 bin, WORD32 ctxt_index) 249 { 250 UWORD32 u4_range = ps_cabac->u4_range; 251 UWORD32 u4_low = ps_cabac->u4_low; 252 UWORD32 u4_rlps; 253 UWORD8 *pu1_ctxt_model = &ps_cabac->au1_ctxt_models[ctxt_index]; 254 WORD32 state_mps = *pu1_ctxt_model; 255 WORD32 shift; 256 257 /* Sanity checks */ 258 ASSERT((bin == 0) || (bin == 1)); 259 ASSERT((ctxt_index >= 0) && (ctxt_index < IHEVC_CAB_CTXT_END)); 260 ASSERT(state_mps < 128); 261 262 if(CABAC_MODE_ENCODE_BITS == ps_cabac->e_cabac_op_mode) 263 { 264 ASSERT((u4_range >= 256) && (u4_range < 512)); 265 266 /* Get the lps range from LUT based on quantized range and state */ 267 u4_rlps = gau1_ihevc_cabac_rlps[state_mps >> 1][(u4_range >> 6) & 0x3]; 268 269 u4_range -= u4_rlps; 270 271 /* check if bin is mps or lps */ 272 if((state_mps & 0x1) ^ bin) 273 { 274 /* lps path; L= L + R; R = RLPS */ 275 u4_low += u4_range; 276 u4_range = u4_rlps; 277 } 278 279 /*Compute bit always to populate the trace*/ 280 /* increment bits generated based on state and bin encoded */ 281 ps_cabac->u4_bits_estimated_q12 += gau2_ihevce_cabac_bin_to_bits[state_mps ^ bin]; 282 283 /* update the context model from state transition LUT */ 284 *pu1_ctxt_model = gau1_ihevc_next_state[(state_mps << 1) | bin]; 285 286 /*****************************************************************/ 287 /* Renormalization; calculate bits generated based on range(R) */ 288 /* Note : 6 <= R < 512; R is 2 only for terminating encode */ 289 /*****************************************************************/ 290 GETRANGE(shift, u4_range); 291 shift = 9 - shift; 292 u4_low <<= shift; 293 u4_range <<= shift; 294 295 /* bits to be inserted in the bitstream */ 296 ps_cabac->u4_bits_gen += shift; 297 ps_cabac->u4_range = u4_range; 298 ps_cabac->u4_low = u4_low; 299 300 /* generate stream when a byte is ready */ 301 if(ps_cabac->u4_bits_gen > CABAC_BITS) 302 { 303 return (ihevce_cabac_put_byte(ps_cabac)); 304 } 305 } 306 else /* (CABAC_MODE_COMPUTE_BITS == e_cabac_op_mode) */ 307 { 308 /* increment bits generated based on state and bin encoded */ 309 ps_cabac->u4_bits_estimated_q12 += gau2_ihevce_cabac_bin_to_bits[state_mps ^ bin]; 310 311 /* update the context model from state transition LUT */ 312 *pu1_ctxt_model = gau1_ihevc_next_state[(state_mps << 1) | bin]; 313 } 314 315 return (IHEVCE_SUCCESS); 316 } 317 318 WORD32 ihevce_cabac_encode_bypass_bin(cab_ctxt_t *ps_cabac, WORD32 bin); 319 320 WORD32 321 ihevce_cabac_encode_terminate(cab_ctxt_t *ps_cabac, WORD32 term_bin, WORD32 i4_end_of_sub_strm); 322 323 /** 324 ****************************************************************************** 325 * 326 * @brief Encodes a series of bypass bins (FLC bypass bins) 327 * 328 * @par Description 329 * This function is more optimal than calling ihevce_cabac_encode_bypass_bin() 330 * in a loop as cabac low, renorm and generating the stream (8bins at a time) 331 * can be done in one operation 332 * 333 * @param[inout]ps_cabac 334 * pointer to cabac context (handle) 335 * 336 * @param[in] u4_sym 337 * syntax element to be coded (as FLC bins) 338 * 339 * @param[in] num_bins 340 * This is the FLC length for u4_sym 341 * 342 * 343 * @return success or failure error code 344 * 345 ****************************************************************************** 346 */ 347 static INLINE WORD32 348 ihevce_cabac_encode_bypass_bins(cab_ctxt_t *ps_cabac, UWORD32 u4_bins, WORD32 num_bins) 349 { 350 UWORD32 u4_range = ps_cabac->u4_range; 351 WORD32 next_byte; 352 WORD32 error = IHEVCE_SUCCESS; 353 354 if(CABAC_MODE_ENCODE_BITS == ps_cabac->e_cabac_op_mode) 355 { 356 /* Sanity checks */ 357 ASSERT((num_bins < 33) && (num_bins > 0)); 358 ASSERT((u4_range >= 256) && (u4_range < 512)); 359 360 /*Compute bit always to populate the trace*/ 361 /* increment bits generated by num_bins */ 362 ps_cabac->u4_bits_estimated_q12 += (num_bins << CABAC_FRAC_BITS_Q); 363 364 /* Encode 8bins at a time and put in the bit-stream */ 365 while(num_bins > 8) 366 { 367 num_bins -= 8; 368 369 /* extract the leading 8 bins */ 370 next_byte = (u4_bins >> num_bins) & 0xff; 371 372 /* L = (L << 8) + (R * next_byte) */ 373 ps_cabac->u4_low <<= 8; 374 ps_cabac->u4_low += (next_byte * u4_range); 375 ps_cabac->u4_bits_gen += 8; 376 377 if(ps_cabac->u4_bits_gen > CABAC_BITS) 378 { 379 /* insert the leading byte of low into stream */ 380 error |= ihevce_cabac_put_byte(ps_cabac); 381 } 382 } 383 384 /* Update low with remaining bins and return */ 385 next_byte = (u4_bins & ((1 << num_bins) - 1)); 386 387 ps_cabac->u4_low <<= num_bins; 388 ps_cabac->u4_low += (next_byte * u4_range); 389 ps_cabac->u4_bits_gen += num_bins; 390 391 if(ps_cabac->u4_bits_gen > CABAC_BITS) 392 { 393 /* insert the leading byte of low into stream */ 394 error |= ihevce_cabac_put_byte(ps_cabac); 395 } 396 } 397 else 398 { 399 /* increment bits generated by num_bins */ 400 ps_cabac->u4_bits_estimated_q12 += (num_bins << CABAC_FRAC_BITS_Q); 401 } 402 403 return (error); 404 } 405 406 WORD32 ihevce_cabac_encode_tunary( 407 cab_ctxt_t *ps_cabac, 408 WORD32 sym, 409 WORD32 c_max, 410 WORD32 ctxt_index, 411 WORD32 ctxt_shift, 412 WORD32 ctxt_inc_max); 413 414 WORD32 ihevce_cabac_encode_tunary_bypass(cab_ctxt_t *ps_cabac, WORD32 sym, WORD32 c_max); 415 416 WORD32 ihevce_cabac_encode_egk(cab_ctxt_t *ps_cabac, UWORD32 u4_sym, WORD32 k); 417 418 WORD32 ihevce_cabac_encode_trunc_rice( 419 cab_ctxt_t *ps_cabac, UWORD32 u4_sym, WORD32 c_rice_param, WORD32 c_rice_max); 420 421 WORD32 ihevce_cabac_flush(cab_ctxt_t *ps_cabac, WORD32 i4_end_of_sub_strm); 422 423 WORD32 ihevce_cabac_ctxt_backup(cab_ctxt_t *ps_cabac); 424 425 WORD32 ihevce_cabac_ctxt_row_init(cab_ctxt_t *ps_cabac); 426 427 #endif /* _IHEVCE_CABAC_H_ */ 428