mirror of
https://github.com/cemu-project/Cemu.git
synced 2024-12-30 19:51:51 +01:00
268 lines
13 KiB
C
268 lines
13 KiB
C
|
/******************************************************************************
|
||
|
*
|
||
|
* Copyright (C) 2015 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 ih264d_cabac.h
|
||
|
*
|
||
|
* \brief
|
||
|
* This file contains declarations of Binary decoding routines and tables.
|
||
|
*
|
||
|
* \date
|
||
|
* 04/02/2003
|
||
|
*
|
||
|
* \author NS
|
||
|
***************************************************************************
|
||
|
*/
|
||
|
|
||
|
#ifndef _IH264D_CABAC_H_
|
||
|
#define _IH264D_CABAC_H_
|
||
|
|
||
|
#include "ih264_typedefs.h"
|
||
|
#include "ih264_macros.h"
|
||
|
#include "ih264_platform_macros.h"
|
||
|
#include "ih264d_bitstrm.h"
|
||
|
#include "ih264d_defs.h"
|
||
|
|
||
|
#define B_BITS 10
|
||
|
|
||
|
#define HALF (1 << (B_BITS-1))
|
||
|
#define QUARTER (1 << (B_BITS-2))
|
||
|
|
||
|
#define CTXT_UNUSED {0,64}
|
||
|
#define NUM_MB_SKIP_CTXT 6
|
||
|
#define NUM_MB_TYPE_CTXT 9
|
||
|
#define NUM_SUBMB_TYPE_CTXT 7
|
||
|
#define NUM_REF_IDX_CTXT 6
|
||
|
#define NUM_MB_QP_DELTA 4
|
||
|
#define NUM_PRED_MODE 6
|
||
|
#define NUM_MB_FIELD 3
|
||
|
#define NUM_CBP 12
|
||
|
#define NUM_CTX_MVD 14
|
||
|
|
||
|
/* Residual block cabac context parameters */
|
||
|
#define NUM_CTX_CAT 6
|
||
|
#define NUM_LUMA_CTX_CAT 3
|
||
|
#define NUM_CTX_CODED_BLOCK 4
|
||
|
/* Luma CtxSigCoeff + CtxLastCoeff = 15 + 15 = 30 */
|
||
|
#define NUM_LUMA_CTX_SIG_COEF 30
|
||
|
/* Chroma DC CtxSigCoeff + CtxLastCoeff = 3 + 3 = 6 */
|
||
|
#define NUM_CTX_CHROMA_DC_SIG_COEF 6
|
||
|
/* Chroma AC CtxSigCoeff + CtxLastCoeff = 14 + 14 = 28 */
|
||
|
#define NUM_CTX_CHROMA_AC_SIG_COEF 28
|
||
|
#define NUM_CTX_ABS_LEVEL 10
|
||
|
|
||
|
#define LUMA_DC_CTXCAT 0
|
||
|
#define LUMA_AC_CTXCAT 1
|
||
|
#define LUMA_4X4_CTXCAT 2
|
||
|
#define CHROMA_DC_CTXCAT 3
|
||
|
#define CHROMA_AC_CTXCAT 4
|
||
|
#define LUMA_8X8_CTXCAT 5
|
||
|
|
||
|
/*****************************************************************************/
|
||
|
/* Constant Macros */
|
||
|
/*****************************************************************************/
|
||
|
#define NUM_CABAC_CTXTS 460
|
||
|
#define QP_RANGE 52
|
||
|
#define NUM_CAB_INIT_IDC_PLUS_ONE 4
|
||
|
#define LAST_COEFF_CTXT_MINUS_SIG_COEFF_CTXT 61
|
||
|
#define LAST_COEFF_CTXT_MINUS_SIG_COEFF_CTXT_8X8 15
|
||
|
|
||
|
/*bits 0 to 5 :state
|
||
|
bit 6:mps*/
|
||
|
typedef struct
|
||
|
{
|
||
|
UWORD8 u1_mps_state; /* state number */
|
||
|
} bin_ctxt_model_t;
|
||
|
|
||
|
typedef struct
|
||
|
|
||
|
{
|
||
|
/* Neighbour availability Variables needed to get CtxtInc, for CABAC */
|
||
|
UWORD8 u1_mb_type; /** macroblock type: I/P/B/SI/SP */
|
||
|
UWORD8 u1_cbp; /** Coded Block Pattern */
|
||
|
UWORD8 u1_intra_chroma_pred_mode;
|
||
|
|
||
|
/*************************************************************************/
|
||
|
/* Arrangnment of DC CSBP */
|
||
|
/* bits: b7 b6 b5 b4 b3 b2 b1 b0 */
|
||
|
/* CSBP: x x x x x Vdc Udc Ydc */
|
||
|
/*************************************************************************/
|
||
|
UWORD8 u1_yuv_dc_csbp;
|
||
|
WORD8 i1_ref_idx[4];
|
||
|
UWORD8 u1_mv[4][4];
|
||
|
UWORD8 u1_transform8x8_ctxt;
|
||
|
} ctxt_inc_mb_info_t;
|
||
|
|
||
|
#define ONE_RIGHT_SHIFTED_BY_8 1<<8
|
||
|
#define ONE_RIGHT_SHIFTED_BY_9 1<<9
|
||
|
#define ONE_RIGHT_SHIFTED_BY_14 1<<14
|
||
|
typedef struct
|
||
|
{
|
||
|
UWORD32 u4_code_int_range;
|
||
|
UWORD32 u4_code_int_val_ofst;
|
||
|
const void *cabac_table;
|
||
|
void * pv_codec_handle; /* For Error Handling */
|
||
|
} decoding_envirnoment_t;
|
||
|
|
||
|
WORD32 ih264d_init_cabac_dec_envirnoment(decoding_envirnoment_t * ps_cab_env,
|
||
|
dec_bit_stream_t *ps_bitstrm);
|
||
|
|
||
|
UWORD32 ih264d_decode_bin(UWORD32 u4_ctx_inc,
|
||
|
bin_ctxt_model_t *ps_bin_ctxt,
|
||
|
dec_bit_stream_t *ps_bitstrm,
|
||
|
decoding_envirnoment_t *ps_cab_env);
|
||
|
UWORD8 ih264d_decode_terminate(decoding_envirnoment_t * ps_cab_env,
|
||
|
dec_bit_stream_t * ps_bitstrm);
|
||
|
|
||
|
UWORD32 ih264d_decode_bins_tunary(UWORD8 u1_max_bins,
|
||
|
UWORD32 u4_ctx_inc,
|
||
|
bin_ctxt_model_t *ps_src_bin_ctxt,
|
||
|
dec_bit_stream_t *ps_bitstrm,
|
||
|
decoding_envirnoment_t *ps_cab_env);
|
||
|
|
||
|
UWORD32 ih264d_decode_bins(UWORD8 u1_max_bins,
|
||
|
UWORD32 u4_ctx_inc,
|
||
|
bin_ctxt_model_t *ps_src_bin_ctxt,
|
||
|
dec_bit_stream_t *ps_bitstrm,
|
||
|
decoding_envirnoment_t *ps_cab_env);
|
||
|
UWORD32 ih264d_decode_bins_unary(UWORD8 u1_max_bins,
|
||
|
UWORD32 u4_ctx_inc,
|
||
|
bin_ctxt_model_t *ps_src_bin_ctxt,
|
||
|
dec_bit_stream_t *ps_bitstrm,
|
||
|
decoding_envirnoment_t *ps_cab_env);
|
||
|
|
||
|
UWORD32 ih264d_decode_bypass_bins_unary(decoding_envirnoment_t *ps_cab_env,
|
||
|
dec_bit_stream_t *ps_bitstrm);
|
||
|
|
||
|
UWORD32 ih264d_decode_bypass_bins(decoding_envirnoment_t *ps_cab_env,
|
||
|
UWORD8 u1_max_bins,
|
||
|
dec_bit_stream_t *ps_bitstrm);
|
||
|
|
||
|
/*****************************************************************************/
|
||
|
/* Function Macros */
|
||
|
/*****************************************************************************/
|
||
|
|
||
|
/*****************************************************************************/
|
||
|
/* Defining a macro for renormalization*/
|
||
|
/*****************************************************************************/
|
||
|
|
||
|
/*we renormalize every time the number bits(which are read ahead of time) we have
|
||
|
consumed in the u4_ofst exceeds 23*/
|
||
|
|
||
|
#define RENORM_RANGE_OFFSET(u4_codeIntRange_m,u4_codeIntValOffset_m,u4_offset_m,pu4_buffer_m) \
|
||
|
{ \
|
||
|
UWORD32 read_bits_m,u4_clz_m ; \
|
||
|
u4_clz_m = CLZ(u4_codeIntRange_m); \
|
||
|
NEXTBITS(read_bits_m,(u4_offset_m+23),pu4_buffer_m,u4_clz_m) \
|
||
|
FLUSHBITS(u4_offset_m,(u4_clz_m)) \
|
||
|
u4_codeIntRange_m = u4_codeIntRange_m << u4_clz_m; \
|
||
|
u4_codeIntValOffset_m = (u4_codeIntValOffset_m << u4_clz_m) | read_bits_m; \
|
||
|
}
|
||
|
|
||
|
/*****************************************************************************/
|
||
|
/* Defining a macro for checking if the symbol is MPS*/
|
||
|
/*****************************************************************************/
|
||
|
|
||
|
#define CHECK_IF_LPS(u4_codeIntRange_m,u4_codeIntValOffset_m,u4_symbol_m, \
|
||
|
u4_codeIntRangeLPS_m,u1_mps_state_m,table_lookup_m) \
|
||
|
{ \
|
||
|
if(u4_codeIntValOffset_m >= u4_codeIntRange_m) \
|
||
|
{ \
|
||
|
u4_symbol_m = 1 - u4_symbol_m; \
|
||
|
u4_codeIntValOffset_m -= u4_codeIntRange_m; \
|
||
|
u4_codeIntRange_m = u4_codeIntRangeLPS_m; \
|
||
|
u1_mps_state_m = (table_lookup_m >> 15) & 0x7F; \
|
||
|
} \
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
**************************************************************************
|
||
|
* \if Function name : DECODE_ONE_BIN_MACRO \endif
|
||
|
*
|
||
|
* \brief
|
||
|
* This function implements decoding process of a decision as defined
|
||
|
* in 9.3.3.2.2.
|
||
|
*
|
||
|
* \return
|
||
|
* Returns symbol decoded.
|
||
|
*
|
||
|
* \note
|
||
|
* It is specified in 9.3.3.2.3.2 that, one of the input to this function
|
||
|
* is CtxIdx. CtxIdx is used to identify state and MPS of that context
|
||
|
* (Refer Fig 9.11 - Flowchart for encoding a decision). To suffice that
|
||
|
* here we pass a pointer bin_ctxt_model_t which contains these values.
|
||
|
*
|
||
|
**************************************************************************
|
||
|
*/
|
||
|
|
||
|
#define DECODE_ONE_BIN_MACRO(p_binCtxt_arg ,u4_code_int_range,u4_code_int_val_ofst, \
|
||
|
pu4_table_arg, \
|
||
|
p_DecBitStream_arg,u4_symbol) \
|
||
|
{ \
|
||
|
bin_ctxt_model_t *p_binCtxt_m = (bin_ctxt_model_t *) p_binCtxt_arg; \
|
||
|
dec_bit_stream_t *p_DecBitStream_m = (dec_bit_stream_t *) p_DecBitStream_arg; \
|
||
|
const UWORD32 *pu4_table_m = (const UWORD32 *) pu4_table_arg; \
|
||
|
\
|
||
|
UWORD32 u4_quantCodeIntRange_m,u4_codeIntRangeLPS_m; \
|
||
|
UWORD32 u1_mps_state_m; \
|
||
|
UWORD32 table_lookup_m; \
|
||
|
UWORD32 u4_clz_m; \
|
||
|
\
|
||
|
u1_mps_state_m = (p_binCtxt_m->u1_mps_state); \
|
||
|
u4_clz_m = CLZ(u4_code_int_range); \
|
||
|
u4_quantCodeIntRange_m = u4_code_int_range << u4_clz_m; \
|
||
|
u4_quantCodeIntRange_m = (u4_quantCodeIntRange_m >> 29) & 0x3; \
|
||
|
table_lookup_m = pu4_table_m[(u1_mps_state_m << 2)+u4_quantCodeIntRange_m]; \
|
||
|
u4_codeIntRangeLPS_m = table_lookup_m & 0xff; \
|
||
|
\
|
||
|
u4_codeIntRangeLPS_m = u4_codeIntRangeLPS_m << (23 - u4_clz_m); \
|
||
|
u4_code_int_range = u4_code_int_range - u4_codeIntRangeLPS_m; \
|
||
|
u4_symbol = ((u1_mps_state_m>> 6) & 0x1); \
|
||
|
/*if mps*/ \
|
||
|
u1_mps_state_m = (table_lookup_m >> 8) & 0x7F; \
|
||
|
if(u4_code_int_val_ofst >= u4_code_int_range) \
|
||
|
{ \
|
||
|
\
|
||
|
u4_symbol = 1 - u4_symbol; \
|
||
|
u4_code_int_val_ofst -= u4_code_int_range; \
|
||
|
u4_code_int_range = u4_codeIntRangeLPS_m; \
|
||
|
u1_mps_state_m = (table_lookup_m >> 15) & 0x7F; \
|
||
|
} \
|
||
|
if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_8) \
|
||
|
{ \
|
||
|
UWORD32 *pu4_buffer,u4_offset; \
|
||
|
UWORD32 read_bits,u4_clz_m ; \
|
||
|
\
|
||
|
pu4_buffer = p_DecBitStream_m->pu4_buffer; \
|
||
|
u4_offset = p_DecBitStream_m->u4_ofst; \
|
||
|
u4_clz_m = CLZ(u4_code_int_range); \
|
||
|
NEXTBITS(read_bits,(u4_offset+23),pu4_buffer,u4_clz_m) \
|
||
|
FLUSHBITS(u4_offset,(u4_clz_m)) \
|
||
|
u4_code_int_range = u4_code_int_range << u4_clz_m; \
|
||
|
u4_code_int_val_ofst= (u4_code_int_val_ofst << u4_clz_m) | read_bits; \
|
||
|
\
|
||
|
\
|
||
|
p_DecBitStream_m->u4_ofst = u4_offset; \
|
||
|
} \
|
||
|
p_binCtxt_m->u1_mps_state = u1_mps_state_m; \
|
||
|
}
|
||
|
|
||
|
#endif /* _IH264D_CABAC_H_ */
|