You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
287 lines
14 KiB
287 lines
14 KiB
/******************************************************************************
|
|
*
|
|
* Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
|
|
*
|
|
* 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.
|
|
*
|
|
******************************************************************************/
|
|
|
|
/**
|
|
******************************************************************************
|
|
* @file ihevcd_cabac.h
|
|
*
|
|
* @brief
|
|
* This file contains decoder cabac engine related structures and
|
|
* interface prototypes
|
|
*
|
|
* @author
|
|
* Ittiam
|
|
******************************************************************************
|
|
*/
|
|
|
|
#ifndef _IHEVCD_CABAC_H_
|
|
#define _IHEVCD_CABAC_H_
|
|
|
|
#include "ihevc_typedefs.h"
|
|
/*****************************************************************************/
|
|
/* Constant Macros */
|
|
/*****************************************************************************/
|
|
/**
|
|
*******************************************************************************
|
|
@brief
|
|
*******************************************************************************
|
|
*/
|
|
#define CABAC_BITS 9
|
|
|
|
/**
|
|
* Following definitions control whether cabac functions are inlined as macros or
|
|
* are called as functions. Set these to 0 to debug cabac leaf level functions
|
|
* Note these macros assume FULLRANGE is 1.
|
|
*/
|
|
#define CABAC_DECODE_BIN 1
|
|
#define CABAC_DECODE_BYPASS_BIN 1
|
|
#define CABAC_DECODE_BYPASS_BINS 1
|
|
|
|
/*****************************************************************************/
|
|
/* Function Macros */
|
|
/*****************************************************************************/
|
|
#if CABAC_DECODE_BIN
|
|
#define IHEVCD_CABAC_DECODE_BIN(u4_bin, ps_cabac, ps_bitstrm, ctxt_index) \
|
|
{ \
|
|
UWORD32 u4_range = ps_cabac->u4_range; \
|
|
UWORD32 u4_ofst = ps_cabac->u4_ofst; \
|
|
UWORD32 u4_rlps; \
|
|
UWORD8 *pu1_ctxt_model = &ps_cabac->au1_ctxt_models[ctxt_index]; \
|
|
WORD32 state_mps = *pu1_ctxt_model; \
|
|
WORD32 clz; \
|
|
UWORD32 u4_qnt_range; \
|
|
\
|
|
/* Sanity checks */ \
|
|
ASSERT(FULLRANGE == 1); \
|
|
ASSERT(u4_range >= 256); \
|
|
ASSERT((ctxt_index >= 0) && (ctxt_index < IHEVC_CAB_CTXT_END)); \
|
|
ASSERT(state_mps < 128); \
|
|
clz = CLZ(u4_range); \
|
|
clz -= (32 - RANGE_NUMBITS); \
|
|
u4_qnt_range = u4_range << clz; \
|
|
u4_qnt_range = (u4_qnt_range >> (RANGE_SHIFT + 6)) & 0x3; \
|
|
/* Get the lps range from LUT based on quantized range and state */ \
|
|
u4_rlps = gau1_ihevc_cabac_rlps[state_mps >> 1][u4_qnt_range]; \
|
|
u4_rlps = u4_rlps << (RANGE_SHIFT - clz); \
|
|
u4_range -= u4_rlps; \
|
|
\
|
|
u4_bin = state_mps & 1; \
|
|
\
|
|
if(u4_ofst >= u4_range) \
|
|
{ \
|
|
u4_bin = 1 - u4_bin; \
|
|
u4_ofst -= u4_range; \
|
|
u4_range = u4_rlps; \
|
|
} \
|
|
\
|
|
*pu1_ctxt_model = gau1_ihevc_next_state[(state_mps << 1) | u4_bin]; \
|
|
\
|
|
/*****************************************************************/ \
|
|
/* Re-normalization; calculate bits generated based on range(R) */ \
|
|
/*****************************************************************/ \
|
|
if(u4_range < (1 << 8)) \
|
|
{ \
|
|
UWORD32 u4_bits; \
|
|
WORD32 numbits; \
|
|
numbits = CLZ(u4_range); \
|
|
numbits -= (32 - RANGE_NUMBITS); \
|
|
BITS_GET(u4_bits, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst, \
|
|
ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word, numbits); \
|
|
\
|
|
u4_ofst <<= numbits; \
|
|
u4_ofst |= u4_bits; \
|
|
u4_range <<= numbits; \
|
|
\
|
|
} \
|
|
/* Update the cabac context */ \
|
|
ps_cabac->u4_range = u4_range; \
|
|
ps_cabac->u4_ofst = u4_ofst; \
|
|
\
|
|
}
|
|
#else
|
|
#define IHEVCD_CABAC_DECODE_BIN(u4_bin, ps_cabac, ps_bitstrm, ctxt_index) \
|
|
u4_bin = ihevcd_cabac_decode_bin(ps_cabac, ps_bitstrm, ctxt_index);
|
|
#endif
|
|
|
|
#if CABAC_DECODE_BYPASS_BIN
|
|
#define IHEVCD_CABAC_DECODE_BYPASS_BIN(u4_bin, ps_cabac, ps_bitstrm) \
|
|
{ \
|
|
\
|
|
UWORD32 u4_range = ps_cabac->u4_range; \
|
|
UWORD32 u4_ofst = ps_cabac->u4_ofst; \
|
|
UWORD32 u4_bits; \
|
|
\
|
|
/* Sanity checks */ \
|
|
ASSERT(FULLRANGE == 1); \
|
|
ASSERT(u4_range >= 256); \
|
|
\
|
|
BIT_GET(u4_bits, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst, \
|
|
ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word); \
|
|
\
|
|
u4_ofst <<= 1; \
|
|
u4_ofst |= u4_bits; \
|
|
\
|
|
u4_bin = 0; \
|
|
if(u4_ofst >= u4_range) \
|
|
{ \
|
|
u4_bin = 1; \
|
|
u4_ofst -= u4_range; \
|
|
} \
|
|
\
|
|
/* Update the cabac context */ \
|
|
ps_cabac->u4_ofst = u4_ofst; \
|
|
}
|
|
#else
|
|
|
|
#define IHEVCD_CABAC_DECODE_BYPASS_BIN(u4_bin, ps_cabac, ps_bitstrm) \
|
|
u4_bin = ihevcd_cabac_decode_bypass_bin(ps_cabac, ps_bitstrm);
|
|
#endif
|
|
|
|
#if CABAC_DECODE_BYPASS_BINS
|
|
#define IHEVCD_CABAC_DECODE_BYPASS_BINS(u4_bins, ps_cabac, ps_bitstrm, numbins) \
|
|
{ \
|
|
UWORD32 u4_range = ps_cabac->u4_range; \
|
|
UWORD32 u4_ofst = ps_cabac->u4_ofst; \
|
|
UWORD32 u4_bits; \
|
|
ASSERT(FULLRANGE == 1); \
|
|
ASSERT(u4_range >= 256); \
|
|
ASSERT(numbins > 0); \
|
|
{ \
|
|
WORD32 numbins_tmp = numbins; \
|
|
/* Sanity checks */ \
|
|
ASSERT(numbins < 17); \
|
|
\
|
|
u4_bins = 0; \
|
|
\
|
|
BITS_GET(u4_bits, ps_bitstrm->pu4_buf, ps_bitstrm->u4_bit_ofst, \
|
|
ps_bitstrm->u4_cur_word, ps_bitstrm->u4_nxt_word, numbins); \
|
|
do \
|
|
{ \
|
|
UWORD32 u4_bit; \
|
|
numbins_tmp--; \
|
|
u4_bit = (u4_bits >> numbins_tmp) & 1; \
|
|
u4_ofst <<= 1; \
|
|
u4_ofst |= u4_bit; \
|
|
\
|
|
u4_bins <<= 1; \
|
|
if(u4_ofst >= u4_range) \
|
|
{ \
|
|
u4_bins += 1; \
|
|
u4_ofst -= u4_range; \
|
|
} \
|
|
}while(numbins_tmp); \
|
|
\
|
|
/* Update the cabac context */ \
|
|
ps_cabac->u4_ofst = u4_ofst; \
|
|
} \
|
|
}
|
|
|
|
|
|
#else
|
|
|
|
#define IHEVCD_CABAC_DECODE_BYPASS_BINS(u4_bins, ps_cabac, ps_bitstrm, numbins) \
|
|
u4_bins = ihevcd_cabac_decode_bypass_bins(ps_cabac, ps_bitstrm, numbins);
|
|
|
|
#endif
|
|
/*****************************************************************************/
|
|
/* Structures */
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* Extern Function Declarations */
|
|
/*****************************************************************************/
|
|
IHEVCD_ERROR_T ihevcd_cabac_init
|
|
(
|
|
cab_ctxt_t *ps_cabac,
|
|
bitstrm_t *ps_bitstrm,
|
|
WORD32 slice_qp,
|
|
WORD32 cabac_init_idc,
|
|
const UWORD8 *pu1_init_ctxt
|
|
);
|
|
|
|
|
|
|
|
UWORD32 ihevcd_cabac_decode_bin
|
|
(
|
|
cab_ctxt_t *ps_cabac,
|
|
bitstrm_t *ps_bitstrm,
|
|
WORD32 ctxt_index
|
|
);
|
|
|
|
UWORD32 ihevcd_cabac_decode_bypass_bin
|
|
(
|
|
cab_ctxt_t *ps_cabac,
|
|
bitstrm_t *ps_bitstrm
|
|
);
|
|
|
|
UWORD32 ihevcd_cabac_decode_terminate
|
|
(
|
|
cab_ctxt_t *ps_cabac,
|
|
bitstrm_t *ps_bitstrm
|
|
);
|
|
|
|
UWORD32 ihevcd_cabac_decode_bypass_bins
|
|
(
|
|
cab_ctxt_t *ps_cabac,
|
|
bitstrm_t *ps_bitstrm,
|
|
WORD32 num_bins
|
|
);
|
|
|
|
UWORD32 ihevcd_cabac_decode_bins_tunary
|
|
(
|
|
cab_ctxt_t *ps_cabac,
|
|
bitstrm_t *ps_bitstrm,
|
|
WORD32 c_max,
|
|
WORD32 ctxt_index,
|
|
WORD32 ctxt_shift,
|
|
WORD32 ctxt_inc_max
|
|
|
|
);
|
|
|
|
UWORD32 ihevcd_cabac_decode_bypass_bins_tunary
|
|
(
|
|
cab_ctxt_t *ps_cabac,
|
|
bitstrm_t *ps_bitstrm,
|
|
WORD32 c_max
|
|
|
|
);
|
|
|
|
UWORD32 ihevcd_cabac_decode_bypass_bins_egk
|
|
(
|
|
cab_ctxt_t *ps_cabac,
|
|
bitstrm_t *ps_bitstrm,
|
|
WORD32 k
|
|
);
|
|
|
|
UWORD32 ihevcd_cabac_decode_bypass_bins_trunc_rice
|
|
(
|
|
cab_ctxt_t *ps_cabac,
|
|
bitstrm_t *ps_bitstrm,
|
|
WORD32 c_rice_param,
|
|
WORD32 c_rice_max
|
|
);
|
|
|
|
IHEVCD_ERROR_T ihevcd_cabac_flush(cab_ctxt_t *ps_cabac);
|
|
|
|
IHEVCD_ERROR_T ihevcd_cabac_reset(cab_ctxt_t *ps_cabac,
|
|
bitstrm_t *ps_bitstrm);
|
|
|
|
#endif /* _IHEVCD_CABAC_H_ */
|