1*c83a76b0SSuyog Pawar /****************************************************************************** 2*c83a76b0SSuyog Pawar * 3*c83a76b0SSuyog Pawar * Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore 4*c83a76b0SSuyog Pawar * 5*c83a76b0SSuyog Pawar * Licensed under the Apache License, Version 2.0 (the "License"); 6*c83a76b0SSuyog Pawar * you may not use this file except in compliance with the License. 7*c83a76b0SSuyog Pawar * You may obtain a copy of the License at: 8*c83a76b0SSuyog Pawar * 9*c83a76b0SSuyog Pawar * http://www.apache.org/licenses/LICENSE-2.0 10*c83a76b0SSuyog Pawar * 11*c83a76b0SSuyog Pawar * Unless required by applicable law or agreed to in writing, software 12*c83a76b0SSuyog Pawar * distributed under the License is distributed on an "AS IS" BASIS, 13*c83a76b0SSuyog Pawar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*c83a76b0SSuyog Pawar * See the License for the specific language governing permissions and 15*c83a76b0SSuyog Pawar * limitations under the License. 16*c83a76b0SSuyog Pawar * 17*c83a76b0SSuyog Pawar ******************************************************************************/ 18*c83a76b0SSuyog Pawar 19*c83a76b0SSuyog Pawar /** 20*c83a76b0SSuyog Pawar ****************************************************************************** 21*c83a76b0SSuyog Pawar * @file ihevcd_cabac.h 22*c83a76b0SSuyog Pawar * 23*c83a76b0SSuyog Pawar * @brief 24*c83a76b0SSuyog Pawar * This file contains decoder cabac engine related structures and 25*c83a76b0SSuyog Pawar * interface prototypes 26*c83a76b0SSuyog Pawar * 27*c83a76b0SSuyog Pawar * @author 28*c83a76b0SSuyog Pawar * Ittiam 29*c83a76b0SSuyog Pawar ****************************************************************************** 30*c83a76b0SSuyog Pawar */ 31*c83a76b0SSuyog Pawar 32*c83a76b0SSuyog Pawar #ifndef _IHEVCD_CABAC_H_ 33*c83a76b0SSuyog Pawar #define _IHEVCD_CABAC_H_ 34*c83a76b0SSuyog Pawar 35*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h" 36*c83a76b0SSuyog Pawar /*****************************************************************************/ 37*c83a76b0SSuyog Pawar /* Constant Macros */ 38*c83a76b0SSuyog Pawar /*****************************************************************************/ 39*c83a76b0SSuyog Pawar /** 40*c83a76b0SSuyog Pawar ******************************************************************************* 41*c83a76b0SSuyog Pawar @brief 42*c83a76b0SSuyog Pawar ******************************************************************************* 43*c83a76b0SSuyog Pawar */ 44*c83a76b0SSuyog Pawar #define CABAC_BITS 9 45*c83a76b0SSuyog Pawar 46*c83a76b0SSuyog Pawar /** 47*c83a76b0SSuyog Pawar * Following definitions control whether cabac functions are inlined as macros or 48*c83a76b0SSuyog Pawar * are called as functions. Set these to 0 to debug cabac leaf level functions 49*c83a76b0SSuyog Pawar * Note these macros assume FULLRANGE is 1. 50*c83a76b0SSuyog Pawar */ 51*c83a76b0SSuyog Pawar #define CABAC_DECODE_BIN 1 52*c83a76b0SSuyog Pawar #define CABAC_DECODE_BYPASS_BIN 1 53*c83a76b0SSuyog Pawar #define CABAC_DECODE_BYPASS_BINS 1 54*c83a76b0SSuyog Pawar 55*c83a76b0SSuyog Pawar /*****************************************************************************/ 56*c83a76b0SSuyog Pawar /* Function Macros */ 57*c83a76b0SSuyog Pawar /*****************************************************************************/ 58*c83a76b0SSuyog Pawar #if CABAC_DECODE_BIN 59*c83a76b0SSuyog Pawar #define IHEVCD_CABAC_DECODE_BIN(u4_bin, ps_cabac, ps_bitstrm, ctxt_index) \ 60*c83a76b0SSuyog Pawar { \ 61*c83a76b0SSuyog Pawar UWORD32 u4_range = ps_cabac->u4_range; \ 62*c83a76b0SSuyog Pawar UWORD32 u4_ofst = ps_cabac->u4_ofst; \ 63*c83a76b0SSuyog Pawar UWORD32 u4_rlps; \ 64*c83a76b0SSuyog Pawar UWORD8 *pu1_ctxt_model = &ps_cabac->au1_ctxt_models[ctxt_index]; \ 65*c83a76b0SSuyog Pawar WORD32 state_mps = *pu1_ctxt_model; \ 66*c83a76b0SSuyog Pawar WORD32 clz; \ 67*c83a76b0SSuyog Pawar UWORD32 u4_qnt_range; \ 68*c83a76b0SSuyog Pawar \ 69*c83a76b0SSuyog Pawar /* Sanity checks */ \ 70*c83a76b0SSuyog Pawar ASSERT(FULLRANGE == 1); \ 71*c83a76b0SSuyog Pawar ASSERT(u4_range >= 256); \ 72*c83a76b0SSuyog Pawar ASSERT((ctxt_index >= 0) && (ctxt_index < IHEVC_CAB_CTXT_END)); \ 73*c83a76b0SSuyog Pawar ASSERT(state_mps < 128); \ 74*c83a76b0SSuyog Pawar clz = CLZ(u4_range); \ 75*c83a76b0SSuyog Pawar clz -= (32 - RANGE_NUMBITS); \ 76*c83a76b0SSuyog Pawar u4_qnt_range = u4_range << clz; \ 77*c83a76b0SSuyog Pawar u4_qnt_range = (u4_qnt_range >> (RANGE_SHIFT + 6)) & 0x3; \ 78*c83a76b0SSuyog Pawar /* Get the lps range from LUT based on quantized range and state */ \ 79*c83a76b0SSuyog Pawar u4_rlps = gau1_ihevc_cabac_rlps[state_mps >> 1][u4_qnt_range]; \ 80*c83a76b0SSuyog Pawar u4_rlps = u4_rlps << (RANGE_SHIFT - clz); \ 81*c83a76b0SSuyog Pawar u4_range -= u4_rlps; \ 82*c83a76b0SSuyog Pawar \ 83*c83a76b0SSuyog Pawar u4_bin = state_mps & 1; \ 84*c83a76b0SSuyog Pawar \ 85*c83a76b0SSuyog Pawar if(u4_ofst >= u4_range) \ 86*c83a76b0SSuyog Pawar { \ 87*c83a76b0SSuyog Pawar u4_bin = 1 - u4_bin; \ 88*c83a76b0SSuyog Pawar u4_ofst -= u4_range; \ 89*c83a76b0SSuyog Pawar u4_range = u4_rlps; \ 90*c83a76b0SSuyog Pawar } \ 91*c83a76b0SSuyog Pawar \ 92*c83a76b0SSuyog Pawar *pu1_ctxt_model = gau1_ihevc_next_state[(state_mps << 1) | u4_bin]; \ 93*c83a76b0SSuyog Pawar \ 94*c83a76b0SSuyog Pawar /*****************************************************************/ \ 95*c83a76b0SSuyog Pawar /* Re-normalization; calculate bits generated based on range(R) */ \ 96*c83a76b0SSuyog Pawar /*****************************************************************/ \ 97*c83a76b0SSuyog Pawar if(u4_range < (1 << 8)) \ 98*c83a76b0SSuyog Pawar { \ 99*c83a76b0SSuyog Pawar UWORD32 u4_bits; \ 100*c83a76b0SSuyog Pawar WORD32 numbits; \ 101*c83a76b0SSuyog Pawar numbits = CLZ(u4_range); \ 102*c83a76b0SSuyog Pawar numbits -= (32 - RANGE_NUMBITS); \ 103*c83a76b0SSuyog Pawar BITS_GET(u4_bits, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst, \ 104*c83a76b0SSuyog Pawar ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word, numbits); \ 105*c83a76b0SSuyog Pawar \ 106*c83a76b0SSuyog Pawar u4_ofst <<= numbits; \ 107*c83a76b0SSuyog Pawar u4_ofst |= u4_bits; \ 108*c83a76b0SSuyog Pawar u4_range <<= numbits; \ 109*c83a76b0SSuyog Pawar \ 110*c83a76b0SSuyog Pawar } \ 111*c83a76b0SSuyog Pawar /* Update the cabac context */ \ 112*c83a76b0SSuyog Pawar ps_cabac->u4_range = u4_range; \ 113*c83a76b0SSuyog Pawar ps_cabac->u4_ofst = u4_ofst; \ 114*c83a76b0SSuyog Pawar \ 115*c83a76b0SSuyog Pawar } 116*c83a76b0SSuyog Pawar #else 117*c83a76b0SSuyog Pawar #define IHEVCD_CABAC_DECODE_BIN(u4_bin, ps_cabac, ps_bitstrm, ctxt_index) \ 118*c83a76b0SSuyog Pawar u4_bin = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_index); 119*c83a76b0SSuyog Pawar #endif 120*c83a76b0SSuyog Pawar 121*c83a76b0SSuyog Pawar #if CABAC_DECODE_BYPASS_BIN 122*c83a76b0SSuyog Pawar #define IHEVCD_CABAC_DECODE_BYPASS_BIN(u4_bin, ps_cabac, ps_bitstrm) \ 123*c83a76b0SSuyog Pawar { \ 124*c83a76b0SSuyog Pawar \ 125*c83a76b0SSuyog Pawar UWORD32 u4_range = ps_cabac->u4_range; \ 126*c83a76b0SSuyog Pawar UWORD32 u4_ofst = ps_cabac->u4_ofst; \ 127*c83a76b0SSuyog Pawar UWORD32 u4_bits; \ 128*c83a76b0SSuyog Pawar \ 129*c83a76b0SSuyog Pawar /* Sanity checks */ \ 130*c83a76b0SSuyog Pawar ASSERT(FULLRANGE == 1); \ 131*c83a76b0SSuyog Pawar ASSERT(u4_range >= 256); \ 132*c83a76b0SSuyog Pawar \ 133*c83a76b0SSuyog Pawar BIT_GET(u4_bits, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst, \ 134*c83a76b0SSuyog Pawar ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word); \ 135*c83a76b0SSuyog Pawar \ 136*c83a76b0SSuyog Pawar u4_ofst <<= 1; \ 137*c83a76b0SSuyog Pawar u4_ofst |= u4_bits; \ 138*c83a76b0SSuyog Pawar \ 139*c83a76b0SSuyog Pawar u4_bin = 0; \ 140*c83a76b0SSuyog Pawar if(u4_ofst >= u4_range) \ 141*c83a76b0SSuyog Pawar { \ 142*c83a76b0SSuyog Pawar u4_bin = 1; \ 143*c83a76b0SSuyog Pawar u4_ofst -= u4_range; \ 144*c83a76b0SSuyog Pawar } \ 145*c83a76b0SSuyog Pawar \ 146*c83a76b0SSuyog Pawar /* Update the cabac context */ \ 147*c83a76b0SSuyog Pawar ps_cabac->u4_ofst = u4_ofst; \ 148*c83a76b0SSuyog Pawar } 149*c83a76b0SSuyog Pawar #else 150*c83a76b0SSuyog Pawar 151*c83a76b0SSuyog Pawar #define IHEVCD_CABAC_DECODE_BYPASS_BIN(u4_bin, ps_cabac, ps_bitstrm) \ 152*c83a76b0SSuyog Pawar u4_bin = ihevcd_cabac_decode_bypass_bin(ps_cabac, ps_bitstrm); 153*c83a76b0SSuyog Pawar #endif 154*c83a76b0SSuyog Pawar 155*c83a76b0SSuyog Pawar #if CABAC_DECODE_BYPASS_BINS 156*c83a76b0SSuyog Pawar #define IHEVCD_CABAC_DECODE_BYPASS_BINS(u4_bins, ps_cabac, ps_bitstrm, numbins) \ 157*c83a76b0SSuyog Pawar { \ 158*c83a76b0SSuyog Pawar UWORD32 u4_range = ps_cabac->u4_range; \ 159*c83a76b0SSuyog Pawar UWORD32 u4_ofst = ps_cabac->u4_ofst; \ 160*c83a76b0SSuyog Pawar UWORD32 u4_bits; \ 161*c83a76b0SSuyog Pawar ASSERT(FULLRANGE == 1); \ 162*c83a76b0SSuyog Pawar ASSERT(u4_range >= 256); \ 163*c83a76b0SSuyog Pawar ASSERT(numbins > 0); \ 164*c83a76b0SSuyog Pawar { \ 165*c83a76b0SSuyog Pawar WORD32 numbins_tmp = numbins; \ 166*c83a76b0SSuyog Pawar /* Sanity checks */ \ 167*c83a76b0SSuyog Pawar ASSERT(numbins < 17); \ 168*c83a76b0SSuyog Pawar \ 169*c83a76b0SSuyog Pawar u4_bins = 0; \ 170*c83a76b0SSuyog Pawar \ 171*c83a76b0SSuyog Pawar BITS_GET(u4_bits, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst, \ 172*c83a76b0SSuyog Pawar ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word, numbins); \ 173*c83a76b0SSuyog Pawar do \ 174*c83a76b0SSuyog Pawar { \ 175*c83a76b0SSuyog Pawar UWORD32 u4_bit; \ 176*c83a76b0SSuyog Pawar numbins_tmp--; \ 177*c83a76b0SSuyog Pawar u4_bit = (u4_bits >> numbins_tmp) & 1; \ 178*c83a76b0SSuyog Pawar u4_ofst <<= 1; \ 179*c83a76b0SSuyog Pawar u4_ofst |= u4_bit; \ 180*c83a76b0SSuyog Pawar \ 181*c83a76b0SSuyog Pawar u4_bins <<= 1; \ 182*c83a76b0SSuyog Pawar if(u4_ofst >= u4_range) \ 183*c83a76b0SSuyog Pawar { \ 184*c83a76b0SSuyog Pawar u4_bins += 1; \ 185*c83a76b0SSuyog Pawar u4_ofst -= u4_range; \ 186*c83a76b0SSuyog Pawar } \ 187*c83a76b0SSuyog Pawar }while(numbins_tmp); \ 188*c83a76b0SSuyog Pawar \ 189*c83a76b0SSuyog Pawar /* Update the cabac context */ \ 190*c83a76b0SSuyog Pawar ps_cabac->u4_ofst = u4_ofst; \ 191*c83a76b0SSuyog Pawar } \ 192*c83a76b0SSuyog Pawar } 193*c83a76b0SSuyog Pawar 194*c83a76b0SSuyog Pawar 195*c83a76b0SSuyog Pawar #else 196*c83a76b0SSuyog Pawar 197*c83a76b0SSuyog Pawar #define IHEVCD_CABAC_DECODE_BYPASS_BINS(u4_bins, ps_cabac, ps_bitstrm, numbins) \ 198*c83a76b0SSuyog Pawar u4_bins = ihevcd_cabac_decode_bypass_bins(ps_cabac, ps_bitstrm, numbins); 199*c83a76b0SSuyog Pawar 200*c83a76b0SSuyog Pawar #endif 201*c83a76b0SSuyog Pawar /*****************************************************************************/ 202*c83a76b0SSuyog Pawar /* Structures */ 203*c83a76b0SSuyog Pawar /*****************************************************************************/ 204*c83a76b0SSuyog Pawar 205*c83a76b0SSuyog Pawar 206*c83a76b0SSuyog Pawar 207*c83a76b0SSuyog Pawar /*****************************************************************************/ 208*c83a76b0SSuyog Pawar /* Extern Function Declarations */ 209*c83a76b0SSuyog Pawar /*****************************************************************************/ 210*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_cabac_init 211*c83a76b0SSuyog Pawar ( 212*c83a76b0SSuyog Pawar cab_ctxt_t *ps_cabac, 213*c83a76b0SSuyog Pawar bitstrm_t *ps_bitstrm, 214*c83a76b0SSuyog Pawar WORD32 slice_qp, 215*c83a76b0SSuyog Pawar WORD32 cabac_init_idc, 216*c83a76b0SSuyog Pawar const UWORD8 *pu1_init_ctxt 217*c83a76b0SSuyog Pawar ); 218*c83a76b0SSuyog Pawar 219*c83a76b0SSuyog Pawar 220*c83a76b0SSuyog Pawar 221*c83a76b0SSuyog Pawar UWORD32 ihevcd_cabac_decode_bin 222*c83a76b0SSuyog Pawar ( 223*c83a76b0SSuyog Pawar cab_ctxt_t *ps_cabac, 224*c83a76b0SSuyog Pawar bitstrm_t *ps_bitstrm, 225*c83a76b0SSuyog Pawar WORD32 ctxt_index 226*c83a76b0SSuyog Pawar ); 227*c83a76b0SSuyog Pawar 228*c83a76b0SSuyog Pawar UWORD32 ihevcd_cabac_decode_bypass_bin 229*c83a76b0SSuyog Pawar ( 230*c83a76b0SSuyog Pawar cab_ctxt_t *ps_cabac, 231*c83a76b0SSuyog Pawar bitstrm_t *ps_bitstrm 232*c83a76b0SSuyog Pawar ); 233*c83a76b0SSuyog Pawar 234*c83a76b0SSuyog Pawar UWORD32 ihevcd_cabac_decode_terminate 235*c83a76b0SSuyog Pawar ( 236*c83a76b0SSuyog Pawar cab_ctxt_t *ps_cabac, 237*c83a76b0SSuyog Pawar bitstrm_t *ps_bitstrm 238*c83a76b0SSuyog Pawar ); 239*c83a76b0SSuyog Pawar 240*c83a76b0SSuyog Pawar UWORD32 ihevcd_cabac_decode_bypass_bins 241*c83a76b0SSuyog Pawar ( 242*c83a76b0SSuyog Pawar cab_ctxt_t *ps_cabac, 243*c83a76b0SSuyog Pawar bitstrm_t *ps_bitstrm, 244*c83a76b0SSuyog Pawar WORD32 num_bins 245*c83a76b0SSuyog Pawar ); 246*c83a76b0SSuyog Pawar 247*c83a76b0SSuyog Pawar UWORD32 ihevcd_cabac_decode_bins_tunary 248*c83a76b0SSuyog Pawar ( 249*c83a76b0SSuyog Pawar cab_ctxt_t *ps_cabac, 250*c83a76b0SSuyog Pawar bitstrm_t *ps_bitstrm, 251*c83a76b0SSuyog Pawar WORD32 c_max, 252*c83a76b0SSuyog Pawar WORD32 ctxt_index, 253*c83a76b0SSuyog Pawar WORD32 ctxt_shift, 254*c83a76b0SSuyog Pawar WORD32 ctxt_inc_max 255*c83a76b0SSuyog Pawar 256*c83a76b0SSuyog Pawar ); 257*c83a76b0SSuyog Pawar 258*c83a76b0SSuyog Pawar UWORD32 ihevcd_cabac_decode_bypass_bins_tunary 259*c83a76b0SSuyog Pawar ( 260*c83a76b0SSuyog Pawar cab_ctxt_t *ps_cabac, 261*c83a76b0SSuyog Pawar bitstrm_t *ps_bitstrm, 262*c83a76b0SSuyog Pawar WORD32 c_max 263*c83a76b0SSuyog Pawar 264*c83a76b0SSuyog Pawar ); 265*c83a76b0SSuyog Pawar 266*c83a76b0SSuyog Pawar UWORD32 ihevcd_cabac_decode_bypass_bins_egk 267*c83a76b0SSuyog Pawar ( 268*c83a76b0SSuyog Pawar cab_ctxt_t *ps_cabac, 269*c83a76b0SSuyog Pawar bitstrm_t *ps_bitstrm, 270*c83a76b0SSuyog Pawar WORD32 k 271*c83a76b0SSuyog Pawar ); 272*c83a76b0SSuyog Pawar 273*c83a76b0SSuyog Pawar UWORD32 ihevcd_cabac_decode_bypass_bins_trunc_rice 274*c83a76b0SSuyog Pawar ( 275*c83a76b0SSuyog Pawar cab_ctxt_t *ps_cabac, 276*c83a76b0SSuyog Pawar bitstrm_t *ps_bitstrm, 277*c83a76b0SSuyog Pawar WORD32 c_rice_param, 278*c83a76b0SSuyog Pawar WORD32 c_rice_max 279*c83a76b0SSuyog Pawar ); 280*c83a76b0SSuyog Pawar 281*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_cabac_flush(cab_ctxt_t *ps_cabac); 282*c83a76b0SSuyog Pawar 283*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_cabac_reset(cab_ctxt_t *ps_cabac, 284*c83a76b0SSuyog Pawar bitstrm_t *ps_bitstrm); 285*c83a76b0SSuyog Pawar 286*c83a76b0SSuyog Pawar #endif /* _IHEVCD_CABAC_H_ */ 287