| /****************************************************************************** |
| * |
| * 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_parse_cabac.c |
| * |
| * \brief |
| * This file contains cabac Residual decoding routines. |
| * |
| * \date |
| * 20/03/2003 |
| * |
| * \author NS |
| *************************************************************************** |
| */ |
| |
| #include "ih264_typedefs.h" |
| #include "ih264_macros.h" |
| #include "ih264_platform_macros.h" |
| #include "ih264d_defs.h" |
| #include "ih264d_structs.h" |
| |
| #include "ih264d_cabac.h" |
| #include "ih264d_bitstrm.h" |
| #include "ih264d_parse_mb_header.h" |
| #include "ih264d_debug.h" |
| #include "ih264d_tables.h" |
| #include "ih264d_error_handler.h" |
| #include "ih264d_parse_cabac.h" |
| #include "ih264d_parse_slice.h" |
| #include "ih264d_tables.h" |
| #include "ih264d_mb_utils.h" |
| #include "ih264d_utils.h" |
| |
| /*! |
| ******************************************************************************** |
| * \if Function name : ih264d_read_coeff4x4_cabac \endif |
| * |
| * \brief This function encodes residual_block_cabac as defined in 7.3.5.3.2. |
| * |
| * \return |
| * Returns the index of last significant coeff. |
| * |
| ******************************************************************************** |
| */ |
| |
| UWORD8 ih264d_read_coeff4x4_cabac(dec_bit_stream_t *ps_bitstrm, |
| UWORD32 u4_ctxcat, |
| bin_ctxt_model_t *ps_ctxt_sig_coeff, |
| dec_struct_t *ps_dec, /*!< pointer to access global variables*/ |
| bin_ctxt_model_t *ps_ctxt_coded) |
| { |
| |
| decoding_envirnoment_t *ps_cab_env = &ps_dec->s_cab_dec_env; |
| UWORD32 u4_coded_flag; |
| UWORD32 u4_offset, *pu4_buffer; |
| UWORD32 u4_code_int_range, u4_code_int_val_ofst; |
| tu_sblk4x4_coeff_data_t *ps_tu_4x4; |
| WORD16 *pi2_coeff_data; |
| WORD32 num_sig_coeffs = 0; |
| |
| /*loading from strcuctures*/ |
| |
| ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data; |
| ps_tu_4x4->u2_sig_coeff_map = 0; |
| pi2_coeff_data = &ps_tu_4x4->ai2_level[0]; |
| |
| u4_offset = ps_bitstrm->u4_ofst; |
| pu4_buffer = ps_bitstrm->pu4_buffer; |
| |
| u4_code_int_range = ps_cab_env->u4_code_int_range; |
| u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst; |
| |
| { |
| |
| /*inilined DecodeDecision_onebin begins*/ |
| |
| { |
| |
| UWORD32 u4_qnt_int_range, u4_int_range_lps; |
| UWORD32 u4_symbol, u1_mps_state; |
| |
| UWORD32 table_lookup; |
| const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table; |
| UWORD32 u4_clz; |
| |
| u1_mps_state = (ps_ctxt_coded->u1_mps_state); |
| u4_clz = CLZ(u4_code_int_range); |
| u4_qnt_int_range = u4_code_int_range << u4_clz; |
| u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3; |
| table_lookup = |
| pu4_table[(u1_mps_state << 2) + u4_qnt_int_range]; |
| u4_int_range_lps = table_lookup & 0xff; |
| u4_int_range_lps = u4_int_range_lps << (23 - u4_clz); |
| u4_code_int_range = u4_code_int_range - u4_int_range_lps; |
| u4_symbol = ((u1_mps_state >> 6) & 0x1); |
| u1_mps_state = (table_lookup >> 8) & 0x7F; |
| |
| CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, u4_symbol, |
| u4_int_range_lps, u1_mps_state, table_lookup) |
| |
| if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_8) |
| { |
| |
| RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, |
| u4_offset, pu4_buffer) |
| } |
| |
| ps_ctxt_coded->u1_mps_state = u1_mps_state; |
| u4_coded_flag = u4_symbol; |
| |
| /*inilined DecodeDecision_onebin ends*/ |
| |
| } |
| |
| } |
| |
| if(u4_coded_flag) |
| { |
| |
| { |
| bin_ctxt_model_t *p_binCtxt_last, *p_binCtxt_last_org; |
| UWORD32 uc_last_coeff_idx; |
| UWORD32 uc_bin; |
| UWORD32 i; |
| WORD32 first_coeff_offset = 0; |
| |
| if((u4_ctxcat == CHROMA_AC_CTXCAT) || (u4_ctxcat == LUMA_AC_CTXCAT)) |
| { |
| first_coeff_offset = 1; |
| } |
| |
| i = 0; |
| if(u4_ctxcat == CHROMA_DC_CTXCAT) |
| { |
| uc_last_coeff_idx = 3; |
| } |
| else |
| { |
| UWORD32 u4_start; |
| u4_start = (u4_ctxcat & 1) + (u4_ctxcat >> 2); |
| uc_last_coeff_idx = 15 - u4_start; |
| } |
| p_binCtxt_last_org = ps_ctxt_sig_coeff |
| + LAST_COEFF_CTXT_MINUS_SIG_COEFF_CTXT; |
| |
| do |
| { |
| |
| /*inilined DecodeDecision_onebin begins*/ |
| { |
| |
| UWORD32 u4_qnt_int_range, u4_int_range_lps; |
| UWORD32 u4_symbol, u1_mps_state; |
| UWORD32 table_lookup; |
| const UWORD32 *pu4_table = |
| (const UWORD32 *)ps_cab_env->cabac_table; |
| UWORD32 u4_clz; |
| |
| u1_mps_state = (ps_ctxt_sig_coeff->u1_mps_state); |
| |
| u4_clz = CLZ(u4_code_int_range); |
| |
| u4_qnt_int_range = u4_code_int_range << u4_clz; |
| u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3; |
| |
| table_lookup = pu4_table[(u1_mps_state << 2) |
| + u4_qnt_int_range]; |
| |
| u4_int_range_lps = table_lookup & 0xff; |
| |
| u4_int_range_lps = u4_int_range_lps << (23 - u4_clz); |
| u4_code_int_range = u4_code_int_range - u4_int_range_lps; |
| u4_symbol = ((u1_mps_state >> 6) & 0x1); |
| u1_mps_state = (table_lookup >> 8) & 0x7F; |
| |
| CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, |
| u4_symbol, u4_int_range_lps, u1_mps_state, |
| table_lookup) |
| |
| if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_14) |
| { |
| |
| UWORD32 read_bits, u4_clz; |
| u4_clz = CLZ(u4_code_int_range); |
| NEXTBITS(read_bits, (u4_offset + 23), pu4_buffer, |
| u4_clz) |
| FLUSHBITS(u4_offset, (u4_clz)) |
| u4_code_int_range = u4_code_int_range << u4_clz; |
| u4_code_int_val_ofst = (u4_code_int_val_ofst << u4_clz) |
| | read_bits; |
| } |
| |
| INC_BIN_COUNT( |
| ps_cab_env) |
| |
| ps_ctxt_sig_coeff->u1_mps_state = u1_mps_state; |
| uc_bin = u4_symbol; |
| |
| } |
| /*incrementing pointer to point to the context of the next bin*/ |
| ps_ctxt_sig_coeff++; |
| |
| /*inilined DecodeDecision_onebin ends*/ |
| |
| if(uc_bin) |
| { |
| num_sig_coeffs++; |
| SET_BIT(ps_tu_4x4->u2_sig_coeff_map, (i + first_coeff_offset)); |
| |
| p_binCtxt_last = p_binCtxt_last_org + i; |
| |
| /*inilined DecodeDecision_onebin begins*/ |
| |
| { |
| |
| UWORD32 u4_qnt_int_range, u4_int_range_lps; |
| UWORD32 u4_symbol, u1_mps_state; |
| UWORD32 table_lookup; |
| const UWORD32 *pu4_table = |
| (const UWORD32 *)ps_cab_env->cabac_table; |
| UWORD32 u4_clz; |
| |
| u1_mps_state = (p_binCtxt_last->u1_mps_state); |
| |
| u4_clz = CLZ(u4_code_int_range); |
| u4_qnt_int_range = u4_code_int_range << u4_clz; |
| u4_qnt_int_range = (u4_qnt_int_range >> 29) |
| & 0x3; |
| |
| table_lookup = pu4_table[(u1_mps_state << 2) |
| + u4_qnt_int_range]; |
| u4_int_range_lps = table_lookup & 0xff; |
| |
| u4_int_range_lps = u4_int_range_lps |
| << (23 - u4_clz); |
| |
| u4_code_int_range = u4_code_int_range |
| - u4_int_range_lps; |
| u4_symbol = ((u1_mps_state >> 6) & 0x1); |
| u1_mps_state = (table_lookup >> 8) & 0x7F; |
| |
| CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, |
| u4_symbol, u4_int_range_lps, |
| u1_mps_state, table_lookup) |
| |
| INC_BIN_COUNT(ps_cab_env) |
| |
| p_binCtxt_last->u1_mps_state = u1_mps_state; |
| uc_bin = u4_symbol; |
| |
| } |
| |
| /*inilined DecodeDecision_onebin ends*/ |
| if(uc_bin == 1) |
| goto label_read_levels; |
| |
| } |
| |
| i = i + 1; |
| |
| } |
| while(i < uc_last_coeff_idx); |
| |
| num_sig_coeffs++; |
| SET_BIT(ps_tu_4x4->u2_sig_coeff_map, (i + first_coeff_offset)); |
| |
| label_read_levels: ; |
| |
| } |
| |
| /// VALUE of No of Coeff in BLOCK = i + 1 for second case else i; |
| |
| /* Decode coeff_abs_level_minus1 and coeff_sign_flag */ |
| { |
| |
| WORD32 i2_abs_lvl; |
| UWORD32 u1_abs_level_equal1 = 1, u1_abs_level_gt1 = 0; |
| |
| UWORD32 u4_ctx_inc; |
| UWORD32 ui_prefix; |
| bin_ctxt_model_t *p_ctxt_abs_level; |
| |
| |
| p_ctxt_abs_level = ps_dec->p_coeff_abs_level_minus1_t[u4_ctxcat]; |
| u4_ctx_inc = ((0x51)); |
| |
| /*****************************************************/ |
| /* Main Loop runs for no. of Significant coefficient */ |
| /*****************************************************/ |
| |
| |
| do |
| { |
| |
| { |
| INC_SYM_COUNT(&(ps_dec.s_cab_dec_env)); |
| |
| /*****************************************************/ |
| /* inilining a modified ih264d_decode_bins_unary */ |
| /*****************************************************/ |
| |
| { |
| UWORD32 u4_value; |
| UWORD32 u4_symbol; |
| bin_ctxt_model_t *ps_bin_ctxt; |
| UWORD32 u4_ctx_Inc; |
| |
| u4_value = 0; |
| |
| u4_ctx_Inc = u4_ctx_inc & 0xf; |
| ps_bin_ctxt = p_ctxt_abs_level + u4_ctx_Inc; |
| |
| do |
| { |
| |
| { |
| |
| UWORD32 u4_qnt_int_range, |
| u4_int_range_lps; |
| UWORD32 u1_mps_state; |
| UWORD32 table_lookup; |
| const UWORD32 *pu4_table = |
| (const UWORD32 *)ps_cab_env->cabac_table; |
| UWORD32 u4_clz; |
| |
| u1_mps_state = (ps_bin_ctxt->u1_mps_state); |
| u4_clz = CLZ(u4_code_int_range); |
| u4_qnt_int_range = u4_code_int_range |
| << u4_clz; |
| u4_qnt_int_range = (u4_qnt_int_range |
| >> 29) & 0x3; |
| table_lookup = pu4_table[(u1_mps_state << 2) |
| + u4_qnt_int_range]; |
| u4_int_range_lps = table_lookup & 0xff; |
| |
| u4_int_range_lps = u4_int_range_lps |
| << (23 - u4_clz); |
| u4_code_int_range = u4_code_int_range |
| - u4_int_range_lps; |
| u4_symbol = ((u1_mps_state >> 6) & 0x1); |
| u1_mps_state = (table_lookup >> 8) & 0x7F; |
| |
| CHECK_IF_LPS(u4_code_int_range, |
| u4_code_int_val_ofst, u4_symbol, |
| u4_int_range_lps, u1_mps_state, |
| table_lookup) |
| |
| if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9) |
| { |
| |
| RENORM_RANGE_OFFSET(u4_code_int_range, |
| u4_code_int_val_ofst, |
| u4_offset, pu4_buffer) |
| } |
| |
| INC_BIN_COUNT(ps_cab_env); |
| |
| ps_bin_ctxt->u1_mps_state = u1_mps_state; |
| } |
| |
| INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env); |
| |
| u4_value++; |
| ps_bin_ctxt = p_ctxt_abs_level + (u4_ctx_inc >> 4); |
| |
| } |
| while(u4_symbol && (u4_value < UCOFF_LEVEL)); |
| |
| ui_prefix = u4_value - 1 + u4_symbol; |
| |
| } |
| |
| if(ui_prefix == UCOFF_LEVEL) |
| { |
| UWORD32 ui16_sufS = 0; |
| UWORD32 u1_max_bins; |
| UWORD32 u4_value; |
| |
| i2_abs_lvl = UCOFF_LEVEL; |
| /*inlining ih264d_decode_bypass_bins_unary begins*/ |
| |
| { |
| UWORD32 uc_bin; |
| UWORD32 bits_to_flush; |
| UWORD32 max_bits = 32; |
| |
| bits_to_flush = 0; |
| /*renormalize to ensure there 23 bits more in the u4_code_int_val_ofst*/ |
| { |
| UWORD32 u4_clz, read_bits; |
| |
| u4_clz = CLZ(u4_code_int_range); |
| FLUSHBITS(u4_offset, u4_clz) |
| NEXTBITS(read_bits, u4_offset, pu4_buffer, 23) |
| u4_code_int_range = u4_code_int_range << u4_clz; |
| u4_code_int_val_ofst = (u4_code_int_val_ofst |
| << u4_clz) | read_bits; |
| |
| } |
| |
| do |
| { |
| bits_to_flush++; |
| |
| u4_code_int_range = u4_code_int_range >> 1; |
| |
| if(u4_code_int_val_ofst >= u4_code_int_range) |
| { |
| /* S=1 */ |
| uc_bin = 1; |
| u4_code_int_val_ofst -= u4_code_int_range; |
| } |
| else |
| { |
| /* S=0 */ |
| uc_bin = 0; |
| } |
| |
| INC_BIN_COUNT( |
| ps_cab_env);INC_BYPASS_BINS(ps_cab_env); |
| |
| } |
| while(uc_bin && (bits_to_flush < max_bits)); |
| |
| u4_value = (bits_to_flush - 1); |
| |
| } |
| /*inlining ih264d_decode_bypass_bins_unary ends*/ |
| |
| ui16_sufS = (1 << u4_value); |
| u1_max_bins = u4_value; |
| |
| if(u4_value > 0) |
| { |
| |
| /*inline bypassbins_flc begins*/ |
| |
| if(u4_value > 10) |
| { |
| UWORD32 u4_clz, read_bits; |
| |
| u4_clz = CLZ(u4_code_int_range); |
| FLUSHBITS(u4_offset, u4_clz) |
| NEXTBITS(read_bits, u4_offset, pu4_buffer, 23) |
| u4_code_int_range = u4_code_int_range << u4_clz; |
| u4_code_int_val_ofst = (u4_code_int_val_ofst |
| << u4_clz) | read_bits; |
| } |
| |
| { |
| UWORD32 ui_bins; |
| UWORD32 uc_bin; |
| UWORD32 bits_to_flush; |
| |
| ui_bins = 0; |
| bits_to_flush = 0; |
| |
| do |
| { |
| bits_to_flush++; |
| |
| u4_code_int_range = u4_code_int_range >> 1; |
| |
| if(u4_code_int_val_ofst |
| >= u4_code_int_range) |
| { |
| /* S=1 */ |
| uc_bin = 1; |
| u4_code_int_val_ofst -= |
| u4_code_int_range; |
| } |
| else |
| { |
| /* S=0 */ |
| uc_bin = 0; |
| } |
| |
| INC_BIN_COUNT( |
| ps_cab_env);INC_BYPASS_BINS(ps_cab_env); |
| |
| ui_bins = ((ui_bins << 1) | uc_bin); |
| |
| } |
| while(bits_to_flush < u1_max_bins); |
| |
| u4_value = ui_bins; |
| } |
| |
| /*inline bypassbins_flc ends*/ |
| |
| } |
| |
| //Value of K |
| ui16_sufS += u4_value; |
| i2_abs_lvl += ui16_sufS; |
| |
| } |
| else |
| i2_abs_lvl = 1 + ui_prefix; |
| |
| if(i2_abs_lvl > 1) |
| { |
| u1_abs_level_gt1++; |
| } |
| if(!u1_abs_level_gt1) |
| { |
| u1_abs_level_equal1++; |
| u4_ctx_inc = (5 << 4) + MIN(u1_abs_level_equal1, 4); |
| } |
| else |
| u4_ctx_inc = (5 + MIN(u1_abs_level_gt1, 4)) << 4; |
| |
| /*u4_ctx_inc = g_table_temp[u1_abs_level_gt1][u1_abs_level_equal1];*/ |
| |
| /* encode coeff_sign_flag[i] */ |
| |
| { |
| u4_code_int_range = u4_code_int_range >> 1; |
| |
| if(u4_code_int_val_ofst >= (u4_code_int_range)) |
| { |
| /* S=1 */ |
| u4_code_int_val_ofst -= u4_code_int_range; |
| i2_abs_lvl = (-i2_abs_lvl); |
| } |
| |
| } |
| num_sig_coeffs--; |
| *pi2_coeff_data++ = i2_abs_lvl; |
| } |
| } |
| while(num_sig_coeffs > 0); |
| } |
| } |
| |
| if(u4_coded_flag) |
| { |
| WORD32 offset; |
| offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_4x4; |
| offset = ALIGN4(offset); |
| ps_dec->pv_parse_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_parse_tu_coeff_data + offset); |
| } |
| |
| |
| /*updating structures*/ |
| ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst; |
| ps_cab_env->u4_code_int_range = u4_code_int_range; |
| ps_bitstrm->u4_ofst = u4_offset; |
| return (u4_coded_flag); |
| } |
| /*! |
| ******************************************************************************** |
| * \if Function name : ih264d_read_coeff8x8_cabac \endif |
| * |
| * \brief This function encodes residual_block_cabac as defined in 7.3.5.3.2. |
| when transform_8x8_flag = 1 |
| * |
| * \return |
| * Returns the index of last significant coeff. |
| * |
| ******************************************************************************** |
| */ |
| |
| void ih264d_read_coeff8x8_cabac(dec_bit_stream_t *ps_bitstrm, |
| dec_struct_t *ps_dec, /*!< pointer to access global variables*/ |
| dec_mb_info_t *ps_cur_mb_info) |
| { |
| decoding_envirnoment_t *ps_cab_env = &ps_dec->s_cab_dec_env; |
| UWORD32 u4_offset, *pu4_buffer; |
| UWORD32 u4_code_int_range, u4_code_int_val_ofst; |
| |
| /* High profile related declarations */ |
| UWORD8 u1_field_coding_flag = ps_cur_mb_info->ps_curmb->u1_mb_fld; |
| const UWORD8 *pu1_lastcoeff_context_inc = |
| (UWORD8 *)gau1_ih264d_lastcoeff_context_inc; |
| const UWORD8 *pu1_sigcoeff_context_inc; |
| bin_ctxt_model_t *ps_ctxt_sig_coeff; |
| WORD32 num_sig_coeffs = 0; |
| tu_blk8x8_coeff_data_t *ps_tu_8x8; |
| WORD16 *pi2_coeff_data; |
| |
| /*loading from strcuctures*/ |
| |
| ps_tu_8x8 = (tu_blk8x8_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data; |
| ps_tu_8x8->au4_sig_coeff_map[0] = 0; |
| ps_tu_8x8->au4_sig_coeff_map[1] = 0; |
| pi2_coeff_data = &ps_tu_8x8->ai2_level[0]; |
| |
| |
| if(!u1_field_coding_flag) |
| { |
| pu1_sigcoeff_context_inc = |
| (UWORD8 *)gau1_ih264d_sigcoeff_context_inc_frame; |
| |
| /*******************************************************************/ |
| /* last coefficient context is derived from significant coeff u4_flag */ |
| /* only significant coefficient matrix need to be initialized */ |
| /*******************************************************************/ |
| ps_ctxt_sig_coeff = ps_dec->s_high_profile.ps_sigcoeff_8x8_frame; |
| } |
| else |
| { |
| pu1_sigcoeff_context_inc = |
| (UWORD8 *)gau1_ih264d_sigcoeff_context_inc_field; |
| |
| /*******************************************************************/ |
| /* last coefficient context is derived from significant coeff u4_flag */ |
| /* only significant coefficient matrix need to be initialized */ |
| /*******************************************************************/ |
| ps_ctxt_sig_coeff = ps_dec->s_high_profile.ps_sigcoeff_8x8_field; |
| } |
| |
| /*loading from strcuctures*/ |
| |
| u4_offset = ps_bitstrm->u4_ofst; |
| pu4_buffer = ps_bitstrm->pu4_buffer; |
| |
| u4_code_int_range = ps_cab_env->u4_code_int_range; |
| u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst; |
| |
| { |
| { |
| bin_ctxt_model_t *p_binCtxt_last, *p_binCtxt_last_org, |
| *p_ctxt_sig_coeff_org; |
| UWORD32 uc_last_coeff_idx; |
| UWORD32 uc_bin; |
| UWORD32 i; |
| |
| i = 0; |
| |
| uc_last_coeff_idx = 63; |
| |
| p_binCtxt_last_org = ps_ctxt_sig_coeff |
| + LAST_COEFF_CTXT_MINUS_SIG_COEFF_CTXT_8X8; |
| |
| p_ctxt_sig_coeff_org = ps_ctxt_sig_coeff; |
| |
| do |
| { |
| /*inilined DecodeDecision_onebin begins*/ |
| { |
| UWORD32 u4_qnt_int_range, u4_int_range_lps; |
| UWORD32 u4_symbol, u1_mps_state; |
| UWORD32 table_lookup; |
| const UWORD32 *pu4_table = |
| (const UWORD32 *)ps_cab_env->cabac_table; |
| UWORD32 u4_clz; |
| |
| u1_mps_state = (ps_ctxt_sig_coeff->u1_mps_state); |
| |
| u4_clz = CLZ(u4_code_int_range); |
| |
| u4_qnt_int_range = u4_code_int_range << u4_clz; |
| u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3; |
| |
| table_lookup = pu4_table[(u1_mps_state << 2) |
| + u4_qnt_int_range]; |
| |
| u4_int_range_lps = table_lookup & 0xff; |
| |
| u4_int_range_lps = u4_int_range_lps << (23 - u4_clz); |
| u4_code_int_range = u4_code_int_range - u4_int_range_lps; |
| u4_symbol = ((u1_mps_state >> 6) & 0x1); |
| u1_mps_state = (table_lookup >> 8) & 0x7F; |
| |
| CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, |
| u4_symbol, u4_int_range_lps, u1_mps_state, |
| table_lookup) |
| |
| if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_14) |
| { |
| UWORD32 read_bits, u4_clz; |
| u4_clz = CLZ(u4_code_int_range); |
| NEXTBITS(read_bits, (u4_offset + 23), pu4_buffer, |
| u4_clz) |
| FLUSHBITS(u4_offset, (u4_clz)) |
| u4_code_int_range = u4_code_int_range << u4_clz; |
| u4_code_int_val_ofst = (u4_code_int_val_ofst << u4_clz) |
| | read_bits; |
| } |
| |
| ps_ctxt_sig_coeff->u1_mps_state = u1_mps_state; |
| uc_bin = u4_symbol; |
| } |
| /*incrementing pointer to point to the context of the next bin*/ |
| ps_ctxt_sig_coeff = p_ctxt_sig_coeff_org |
| + pu1_sigcoeff_context_inc[i + 1]; |
| |
| /*inilined DecodeDecision_onebin ends*/ |
| if(uc_bin) |
| { |
| num_sig_coeffs++; |
| SET_BIT(ps_tu_8x8->au4_sig_coeff_map[i>31], (i > 31 ? i - 32:i)); |
| |
| p_binCtxt_last = p_binCtxt_last_org |
| + pu1_lastcoeff_context_inc[i]; |
| |
| /*inilined DecodeDecision_onebin begins*/ |
| |
| { |
| UWORD32 u4_qnt_int_range, u4_int_range_lps; |
| UWORD32 u4_symbol, u1_mps_state; |
| UWORD32 table_lookup; |
| const UWORD32 *pu4_table = |
| (const UWORD32 *)ps_cab_env->cabac_table; |
| UWORD32 u4_clz; |
| |
| u1_mps_state = (p_binCtxt_last->u1_mps_state); |
| |
| u4_clz = CLZ(u4_code_int_range); |
| u4_qnt_int_range = u4_code_int_range << u4_clz; |
| u4_qnt_int_range = (u4_qnt_int_range >> 29) |
| & 0x3; |
| |
| table_lookup = pu4_table[(u1_mps_state << 2) |
| + u4_qnt_int_range]; |
| u4_int_range_lps = table_lookup & 0xff; |
| |
| u4_int_range_lps = u4_int_range_lps |
| << (23 - u4_clz); |
| |
| u4_code_int_range = u4_code_int_range |
| - u4_int_range_lps; |
| u4_symbol = ((u1_mps_state >> 6) & 0x1); |
| u1_mps_state = (table_lookup >> 8) & 0x7F; |
| |
| CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, |
| u4_symbol, u4_int_range_lps, |
| u1_mps_state, table_lookup) |
| |
| p_binCtxt_last->u1_mps_state = u1_mps_state; |
| uc_bin = u4_symbol; |
| } |
| |
| /*inilined DecodeDecision_onebin ends*/ |
| if(uc_bin == 1) |
| goto label_read_levels; |
| |
| } |
| |
| i = i + 1; |
| |
| } |
| while(i < uc_last_coeff_idx); |
| |
| num_sig_coeffs++; |
| SET_BIT(ps_tu_8x8->au4_sig_coeff_map[i>31], (i > 31 ? i - 32:i)); |
| |
| label_read_levels: ; |
| } |
| |
| /// VALUE of No of Coeff in BLOCK = i + 1 for second case else i; |
| |
| /* Decode coeff_abs_level_minus1 and coeff_sign_flag */ |
| { |
| WORD32 i2_abs_lvl; |
| UWORD32 u1_abs_level_equal1 = 1, u1_abs_level_gt1 = 0; |
| |
| UWORD32 u4_ctx_inc; |
| UWORD32 ui_prefix; |
| bin_ctxt_model_t *p_ctxt_abs_level; |
| |
| p_ctxt_abs_level = |
| ps_dec->p_coeff_abs_level_minus1_t[LUMA_8X8_CTXCAT]; |
| u4_ctx_inc = ((0x51)); |
| |
| /*****************************************************/ |
| /* Main Loop runs for no. of Significant coefficient */ |
| /*****************************************************/ |
| do |
| { |
| { |
| |
| /*****************************************************/ |
| /* inilining a modified ih264d_decode_bins_unary */ |
| /*****************************************************/ |
| |
| { |
| UWORD32 u4_value; |
| UWORD32 u4_symbol; |
| bin_ctxt_model_t *ps_bin_ctxt; |
| UWORD32 u4_ctx_Inc; |
| u4_value = 0; |
| |
| u4_ctx_Inc = u4_ctx_inc & 0xf; |
| ps_bin_ctxt = p_ctxt_abs_level + u4_ctx_Inc; |
| |
| do |
| { |
| { |
| UWORD32 u4_qnt_int_range, |
| u4_int_range_lps; |
| UWORD32 u1_mps_state; |
| UWORD32 table_lookup; |
| const UWORD32 *pu4_table = |
| (const UWORD32 *)ps_cab_env->cabac_table; |
| UWORD32 u4_clz; |
| |
| u1_mps_state = (ps_bin_ctxt->u1_mps_state); |
| u4_clz = CLZ(u4_code_int_range); |
| u4_qnt_int_range = u4_code_int_range |
| << u4_clz; |
| u4_qnt_int_range = (u4_qnt_int_range |
| >> 29) & 0x3; |
| table_lookup = pu4_table[(u1_mps_state << 2) |
| + u4_qnt_int_range]; |
| u4_int_range_lps = table_lookup & 0xff; |
| |
| u4_int_range_lps = u4_int_range_lps |
| << (23 - u4_clz); |
| u4_code_int_range = u4_code_int_range |
| - u4_int_range_lps; |
| u4_symbol = ((u1_mps_state >> 6) & 0x1); |
| u1_mps_state = (table_lookup >> 8) & 0x7F; |
| |
| CHECK_IF_LPS(u4_code_int_range, |
| u4_code_int_val_ofst, u4_symbol, |
| u4_int_range_lps, u1_mps_state, |
| table_lookup) |
| |
| if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9) |
| { |
| |
| RENORM_RANGE_OFFSET(u4_code_int_range, |
| u4_code_int_val_ofst, |
| u4_offset, pu4_buffer) |
| } |
| |
| ps_bin_ctxt->u1_mps_state = u1_mps_state; |
| } |
| |
| u4_value++; |
| ps_bin_ctxt = p_ctxt_abs_level + (u4_ctx_inc >> 4); |
| |
| } |
| while(u4_symbol && (u4_value < UCOFF_LEVEL)); |
| |
| ui_prefix = u4_value - 1 + u4_symbol; |
| } |
| |
| if(ui_prefix == UCOFF_LEVEL) |
| { |
| UWORD32 ui16_sufS = 0; |
| UWORD32 u1_max_bins; |
| UWORD32 u4_value; |
| |
| i2_abs_lvl = UCOFF_LEVEL; |
| /*inlining ih264d_decode_bypass_bins_unary begins*/ |
| |
| { |
| UWORD32 uc_bin; |
| UWORD32 bits_to_flush; |
| UWORD32 max_bits = 32; |
| |
| bits_to_flush = 0; |
| /*renormalize to ensure there 23 bits more in the u4_code_int_val_ofst*/ |
| { |
| UWORD32 u4_clz, read_bits; |
| |
| u4_clz = CLZ(u4_code_int_range); |
| FLUSHBITS(u4_offset, u4_clz) |
| NEXTBITS(read_bits, u4_offset, pu4_buffer, 23) |
| u4_code_int_range = u4_code_int_range << u4_clz; |
| u4_code_int_val_ofst = (u4_code_int_val_ofst |
| << u4_clz) | read_bits; |
| } |
| |
| do |
| { |
| bits_to_flush++; |
| |
| u4_code_int_range = u4_code_int_range >> 1; |
| |
| if(u4_code_int_val_ofst >= u4_code_int_range) |
| { |
| /* S=1 */ |
| uc_bin = 1; |
| u4_code_int_val_ofst -= u4_code_int_range; |
| } |
| else |
| { |
| /* S=0 */ |
| uc_bin = 0; |
| } |
| |
| } |
| while(uc_bin && (bits_to_flush < max_bits)); |
| |
| u4_value = (bits_to_flush - 1); |
| } |
| /*inlining ih264d_decode_bypass_bins_unary ends*/ |
| |
| ui16_sufS = (1 << u4_value); |
| u1_max_bins = u4_value; |
| |
| if(u4_value > 0) |
| { |
| /*inline bypassbins_flc begins*/ |
| |
| if(u4_value > 10) |
| { |
| UWORD32 u4_clz, read_bits; |
| |
| u4_clz = CLZ(u4_code_int_range); |
| FLUSHBITS(u4_offset, u4_clz) |
| NEXTBITS(read_bits, u4_offset, pu4_buffer, 23) |
| u4_code_int_range = u4_code_int_range << u4_clz; |
| u4_code_int_val_ofst = (u4_code_int_val_ofst |
| << u4_clz) | read_bits; |
| } |
| |
| { |
| UWORD32 ui_bins; |
| UWORD32 uc_bin; |
| UWORD32 bits_to_flush; |
| |
| ui_bins = 0; |
| bits_to_flush = 0; |
| |
| do |
| { |
| bits_to_flush++; |
| |
| u4_code_int_range = u4_code_int_range >> 1; |
| |
| if(u4_code_int_val_ofst |
| >= u4_code_int_range) |
| { |
| /* S=1 */ |
| uc_bin = 1; |
| u4_code_int_val_ofst -= |
| u4_code_int_range; |
| } |
| else |
| { |
| /* S=0 */ |
| uc_bin = 0; |
| } |
| |
| ui_bins = ((ui_bins << 1) | uc_bin); |
| |
| } |
| while(bits_to_flush < u1_max_bins); |
| |
| u4_value = ui_bins; |
| } |
| /*inline bypassbins_flc ends*/ |
| } |
| |
| //Value of K |
| ui16_sufS += u4_value; |
| i2_abs_lvl += ui16_sufS; |
| } |
| else |
| { |
| i2_abs_lvl = 1 + ui_prefix; |
| } |
| |
| if(i2_abs_lvl > 1) |
| { |
| u1_abs_level_gt1++; |
| } |
| if(!u1_abs_level_gt1) |
| { |
| u1_abs_level_equal1++; |
| u4_ctx_inc = (5 << 4) + MIN(u1_abs_level_equal1, 4); |
| } |
| else |
| { |
| u4_ctx_inc = (5 + MIN(u1_abs_level_gt1, 4)) << 4; |
| } |
| |
| /*u4_ctx_inc = g_table_temp[u1_abs_level_gt1][u1_abs_level_equal1];*/ |
| |
| /* encode coeff_sign_flag[i] */ |
| |
| { |
| u4_code_int_range = u4_code_int_range >> 1; |
| |
| if(u4_code_int_val_ofst >= (u4_code_int_range)) |
| { |
| /* S=1 */ |
| u4_code_int_val_ofst -= u4_code_int_range; |
| i2_abs_lvl = (-i2_abs_lvl); |
| } |
| } |
| |
| *pi2_coeff_data++ = i2_abs_lvl; |
| num_sig_coeffs--; |
| } |
| } |
| while(num_sig_coeffs > 0); |
| } |
| } |
| |
| { |
| WORD32 offset; |
| offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_8x8; |
| offset = ALIGN4(offset); |
| ps_dec->pv_parse_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_parse_tu_coeff_data + offset); |
| } |
| |
| /*updating structures*/ |
| ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst; |
| ps_cab_env->u4_code_int_range = u4_code_int_range; |
| ps_bitstrm->u4_ofst = u4_offset; |
| } |
| |
| /*****************************************************************************/ |
| /* */ |
| /* Function Name : ih264d_cabac_parse_8x8block */ |
| /* */ |
| /* Description : This function does the residual parsing of 4 subblocks */ |
| /* in a 8x8 block. */ |
| /* */ |
| /* Inputs : pi2_coeff_block : pointer to residual block where */ |
| /* decoded and inverse scan coefficients are updated */ |
| /* */ |
| /* u4_sub_block_strd : indicates the number of sublocks */ |
| /* in a row. It is 4 for luma and 2 for chroma. */ |
| /* */ |
| /* u4_ctx_cat : inidicates context category for residual */ |
| /* decoding. */ |
| /* */ |
| /* ps_dec : pointer to Decstruct (decoder context) */ |
| /* */ |
| /* pu1_top_nnz : top nnz pointer */ |
| /* */ |
| /* pu1_left_nnz : left nnz pointer */ |
| /* */ |
| /* Globals : No */ |
| /* Processing : Parsing for four subblocks in unrolled, top and left nnz */ |
| /* are updated on the fly. csbp is set in accordance to */ |
| /* decoded numcoeff for the subblock index in raster order */ |
| /* */ |
| /* Outputs : The updated residue buffer, nnzs and csbp current block */ |
| /* */ |
| /* Returns : Returns the coded sub block pattern csbp for the block */ |
| /* */ |
| /* Issues : <List any issues or problems with this function> */ |
| /* */ |
| /* Revision History: */ |
| /* */ |
| /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
| /* 09 10 2008 Jay Draft */ |
| /* */ |
| /*****************************************************************************/ |
| UWORD32 ih264d_cabac_parse_8x8block(WORD16 *pi2_coeff_block, |
| UWORD32 u4_sub_block_strd, |
| UWORD32 u4_ctx_cat, |
| dec_struct_t * ps_dec, |
| UWORD8 *pu1_top_nnz, |
| UWORD8 *pu1_left_nnz) |
| { |
| UWORD32 u4_ctxinc, u4_subblock_coded; |
| UWORD32 u4_top0, u4_top1; |
| UWORD32 u4_csbp = 0; |
| UWORD32 u4_idx = 0; |
| dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; |
| bin_ctxt_model_t * const ps_cbf = ps_dec->p_cbf_t[u4_ctx_cat]; |
| bin_ctxt_model_t *ps_src_bin_ctxt; |
| bin_ctxt_model_t * const ps_sig_coeff_flag = |
| ps_dec->p_significant_coeff_flag_t[u4_ctx_cat]; |
| |
| UWORD8 *pu1_inv_scan = ps_dec->pu1_inv_scan; |
| |
| /*------------------------------------------------------*/ |
| /* Residual 4x4 decoding: SubBlock 0 */ |
| /*------------------------------------------------------*/ |
| u4_ctxinc = ((!!pu1_top_nnz[0]) << 1) + (!!pu1_left_nnz[0]); |
| |
| ps_src_bin_ctxt = ps_cbf + u4_ctxinc; |
| |
| u4_top0 = ih264d_read_coeff4x4_cabac( ps_bitstrm, |
| u4_ctx_cat, ps_sig_coeff_flag, ps_dec, |
| ps_src_bin_ctxt); |
| |
| INSERT_BIT(u4_csbp, u4_idx, u4_top0); |
| |
| /*------------------------------------------------------*/ |
| /* Residual 4x4 decoding: SubBlock 1 */ |
| /*------------------------------------------------------*/ |
| u4_idx++; |
| pi2_coeff_block += NUM_COEFFS_IN_4x4BLK; |
| u4_ctxinc = ((!!pu1_top_nnz[1]) << 1) + u4_top0; |
| |
| ps_src_bin_ctxt = ps_cbf + u4_ctxinc; |
| |
| u4_top1 = ih264d_read_coeff4x4_cabac(ps_bitstrm, |
| u4_ctx_cat, ps_sig_coeff_flag, ps_dec, |
| ps_src_bin_ctxt); |
| |
| INSERT_BIT(u4_csbp, u4_idx, u4_top1); |
| pu1_left_nnz[0] = u4_top1; |
| |
| /*------------------------------------------------------*/ |
| /* Residual 4x4 decoding: SubBlock 2 */ |
| /*------------------------------------------------------*/ |
| u4_idx += (u4_sub_block_strd - 1); |
| pi2_coeff_block += ((u4_sub_block_strd - 1) * NUM_COEFFS_IN_4x4BLK); |
| u4_ctxinc = (u4_top0 << 1) + (!!pu1_left_nnz[1]); |
| |
| ps_src_bin_ctxt = ps_cbf + u4_ctxinc; |
| |
| u4_subblock_coded = ih264d_read_coeff4x4_cabac(ps_bitstrm, u4_ctx_cat, |
| ps_sig_coeff_flag, ps_dec, |
| ps_src_bin_ctxt); |
| |
| INSERT_BIT(u4_csbp, u4_idx, u4_subblock_coded); |
| pu1_top_nnz[0] = u4_subblock_coded; |
| |
| /*------------------------------------------------------*/ |
| /* Residual 4x4 decoding: SubBlock 3 */ |
| /*------------------------------------------------------*/ |
| u4_idx++; |
| pi2_coeff_block += NUM_COEFFS_IN_4x4BLK; |
| u4_ctxinc = (u4_top1 << 1) + u4_subblock_coded; |
| |
| ps_src_bin_ctxt = ps_cbf + u4_ctxinc; |
| |
| u4_subblock_coded = ih264d_read_coeff4x4_cabac(ps_bitstrm, u4_ctx_cat, |
| ps_sig_coeff_flag, ps_dec, |
| ps_src_bin_ctxt); |
| |
| INSERT_BIT(u4_csbp, u4_idx, u4_subblock_coded); |
| pu1_top_nnz[1] = pu1_left_nnz[1] = u4_subblock_coded; |
| |
| return (u4_csbp); |
| } |
| |
| /*! |
| ************************************************************************** |
| * \if Function name : ih264d_parse_residual4x4_cabac \endif |
| * |
| * \brief |
| * This function parses CABAC syntax of a Luma and Chroma AC Residuals. |
| * |
| * \return |
| * 0 on Success and Error code otherwise |
| ************************************************************************** |
| */ |
| |
| WORD32 ih264d_parse_residual4x4_cabac(dec_struct_t * ps_dec, |
| dec_mb_info_t *ps_cur_mb_info, |
| UWORD8 u1_offset) |
| { |
| UWORD8 u1_cbp = ps_cur_mb_info->u1_cbp; |
| UWORD16 ui16_csbp = 0; |
| WORD16 *pi2_residual_buf; |
| UWORD8 uc_ctx_cat; |
| UWORD8 *pu1_top_nnz = ps_cur_mb_info->ps_curmb->pu1_nnz_y; |
| UWORD8 *pu1_left_nnz = ps_dec->pu1_left_nnz_y; |
| UWORD8 *pu1_top_nnz_uv = ps_cur_mb_info->ps_curmb->pu1_nnz_uv; |
| ctxt_inc_mb_info_t *p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info; |
| ctxt_inc_mb_info_t *ps_top_ctxt = ps_dec->p_top_ctxt_mb_info; |
| dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; |
| UWORD32 u4_nbr_avail = ps_dec->u1_mb_ngbr_availablity; |
| WORD16 *pi2_coeff_block = NULL; |
| bin_ctxt_model_t *ps_src_bin_ctxt; |
| |
| UWORD8 u1_top_dc_csbp = (ps_top_ctxt->u1_yuv_dc_csbp) >> 1; |
| UWORD8 u1_left_dc_csbp = (ps_dec->pu1_left_yuv_dc_csbp[0]) >> 1; |
| |
| |
| if(!(u4_nbr_avail & TOP_MB_AVAILABLE_MASK)) |
| { |
| if(p_curr_ctxt->u1_mb_type & CAB_INTRA_MASK) |
| { |
| *(UWORD32 *)pu1_top_nnz = 0; |
| u1_top_dc_csbp = 0; |
| *(UWORD32 *)pu1_top_nnz_uv = 0; |
| } |
| else |
| { |
| *(UWORD32 *)pu1_top_nnz = 0x01010101; |
| u1_top_dc_csbp = 0x3; |
| *(UWORD32 *)pu1_top_nnz_uv = 0x01010101; |
| } |
| } |
| else |
| { |
| UWORD32 *pu4_buf; |
| UWORD8 *pu1_buf; |
| pu1_buf = ps_cur_mb_info->ps_top_mb->pu1_nnz_y; |
| pu4_buf = (UWORD32 *)pu1_buf; |
| *(UWORD32 *)(pu1_top_nnz) = *pu4_buf; |
| |
| pu1_buf = ps_cur_mb_info->ps_top_mb->pu1_nnz_uv; |
| pu4_buf = (UWORD32 *)pu1_buf; |
| *(UWORD32 *)(pu1_top_nnz_uv) = *pu4_buf; |
| |
| } |
| |
| if(!(u4_nbr_avail & LEFT_MB_AVAILABLE_MASK)) |
| { |
| if(p_curr_ctxt->u1_mb_type & CAB_INTRA_MASK) |
| { |
| UWORD32 *pu4_buf; |
| UWORD8 *pu1_buf; |
| *(UWORD32 *)pu1_left_nnz = 0; |
| u1_left_dc_csbp = 0; |
| pu1_buf = ps_dec->pu1_left_nnz_uv; |
| pu4_buf = (UWORD32 *)pu1_buf; |
| *pu4_buf = 0; |
| } |
| else |
| { |
| UWORD32 *pu4_buf; |
| UWORD8 *pu1_buf; |
| *(UWORD32 *)pu1_left_nnz = 0x01010101; |
| u1_left_dc_csbp = 0x3; |
| pu1_buf = ps_dec->pu1_left_nnz_uv; |
| pu4_buf = (UWORD32 *)pu1_buf; |
| *pu4_buf = 0x01010101; |
| } |
| } |
| |
| uc_ctx_cat = u1_offset ? LUMA_AC_CTXCAT : LUMA_4X4_CTXCAT; |
| |
| ps_cur_mb_info->u1_qp_div6 = ps_dec->u1_qp_y_div6; |
| ps_cur_mb_info->u1_qpc_div6 = ps_dec->u1_qp_u_div6; |
| ps_cur_mb_info->u1_qp_rem6 = ps_dec->u1_qp_y_rem6; |
| ps_cur_mb_info->u1_qpc_rem6 = ps_dec->u1_qp_u_rem6; |
| // CHECK_THIS |
| ps_cur_mb_info->u1_qpcr_div6 = ps_dec->u1_qp_v_div6; |
| ps_cur_mb_info->u1_qpcr_rem6 = ps_dec->u1_qp_v_rem6; |
| |
| if(u1_cbp & 0x0f) |
| { |
| if(ps_cur_mb_info->u1_tran_form8x8 == 0) |
| { |
| /*******************************************************************/ |
| /* Block 0 residual decoding, check cbp and proceed (subblock = 0) */ |
| /*******************************************************************/ |
| if(!(u1_cbp & 0x1)) |
| { |
| *(UWORD16 *)(pu1_top_nnz) = 0; |
| *(UWORD16 *)(pu1_left_nnz) = 0; |
| } |
| else |
| { |
| ui16_csbp = ih264d_cabac_parse_8x8block(pi2_coeff_block, 4, |
| uc_ctx_cat, ps_dec, |
| pu1_top_nnz, |
| pu1_left_nnz); |
| } |
| |
| /*******************************************************************/ |
| /* Block 1 residual decoding, check cbp and proceed (subblock = 2) */ |
| /*******************************************************************/ |
| pi2_coeff_block += (2 * NUM_COEFFS_IN_4x4BLK); |
| if(!(u1_cbp & 0x2)) |
| { |
| *(UWORD16 *)(pu1_top_nnz + 2) = 0; |
| *(UWORD16 *)(pu1_left_nnz) = 0; |
| } |
| else |
| { |
| UWORD32 u4_temp = ih264d_cabac_parse_8x8block(pi2_coeff_block, |
| 4, uc_ctx_cat, |
| ps_dec, |
| (pu1_top_nnz + 2), |
| pu1_left_nnz); |
| ui16_csbp |= (u4_temp << 2); |
| } |
| |
| /*******************************************************************/ |
| /* Block 2 residual decoding, check cbp and proceed (subblock = 8) */ |
| /*******************************************************************/ |
| pi2_coeff_block += (6 * NUM_COEFFS_IN_4x4BLK); |
| if(!(u1_cbp & 0x4)) |
| { |
| *(UWORD16 *)(pu1_top_nnz) = 0; |
| *(UWORD16 *)(pu1_left_nnz + 2) = 0; |
| } |
| else |
| { |
| UWORD32 u4_temp = ih264d_cabac_parse_8x8block( |
| pi2_coeff_block, 4, uc_ctx_cat, ps_dec, |
| pu1_top_nnz, (pu1_left_nnz + 2)); |
| ui16_csbp |= (u4_temp << 8); |
| } |
| |
| /*******************************************************************/ |
| /* Block 3 residual decoding, check cbp and proceed (subblock = 10)*/ |
| /*******************************************************************/ |
| pi2_coeff_block += (2 * NUM_COEFFS_IN_4x4BLK); |
| if(!(u1_cbp & 0x8)) |
| { |
| *(UWORD16 *)(pu1_top_nnz + 2) = 0; |
| *(UWORD16 *)(pu1_left_nnz + 2) = 0; |
| } |
| else |
| { |
| UWORD32 u4_temp = ih264d_cabac_parse_8x8block( |
| pi2_coeff_block, 4, uc_ctx_cat, ps_dec, |
| (pu1_top_nnz + 2), (pu1_left_nnz + 2)); |
| ui16_csbp |= (u4_temp << 10); |
| } |
| |
| } |
| else |
| { |
| ui16_csbp = 0; |
| |
| /*******************************************************************/ |
| /* Block 0 residual decoding, check cbp and proceed (subblock = 0) */ |
| /*******************************************************************/ |
| if(!(u1_cbp & 0x1)) |
| { |
| *(UWORD16 *)(pu1_top_nnz) = 0; |
| *(UWORD16 *)(pu1_left_nnz) = 0; |
| } |
| else |
| { |
| |
| dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; |
| |
| ih264d_read_coeff8x8_cabac( ps_bitstrm, |
| ps_dec, ps_cur_mb_info); |
| |
| pu1_left_nnz[0] = 1; |
| pu1_left_nnz[1] = 1; |
| |
| pu1_top_nnz[0] = 1; |
| pu1_top_nnz[1] = 1; |
| |
| /* added to be used by BS computation module */ |
| ui16_csbp |= 0x0033; |
| } |
| |
| /*******************************************************************/ |
| /* Block 1 residual decoding, check cbp and proceed (subblock = 2) */ |
| /*******************************************************************/ |
| pi2_coeff_block += 64; |
| |
| if(!(u1_cbp & 0x2)) |
| { |
| *(UWORD16 *)(pu1_top_nnz + 2) = 0; |
| *(UWORD16 *)(pu1_left_nnz) = 0; |
| } |
| else |
| { |
| |
| |
| dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; |
| |
| ih264d_read_coeff8x8_cabac(ps_bitstrm, |
| ps_dec, ps_cur_mb_info); |
| |
| pu1_left_nnz[0] = 1; |
| pu1_left_nnz[1] = 1; |
| |
| pu1_top_nnz[2] = 1; |
| pu1_top_nnz[3] = 1; |
| |
| /* added to be used by BS computation module */ |
| ui16_csbp |= 0x00CC; |
| |
| } |
| |
| /*******************************************************************/ |
| /* Block 2 residual decoding, check cbp and proceed (subblock = 8) */ |
| /*******************************************************************/ |
| pi2_coeff_block += 64; |
| if(!(u1_cbp & 0x4)) |
| { |
| *(UWORD16 *)(pu1_top_nnz) = 0; |
| *(UWORD16 *)(pu1_left_nnz + 2) = 0; |
| } |
| else |
| { |
| |
| dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; |
| |
| ih264d_read_coeff8x8_cabac(ps_bitstrm, |
| ps_dec, ps_cur_mb_info); |
| |
| pu1_left_nnz[2] = 1; |
| pu1_left_nnz[3] = 1; |
| |
| pu1_top_nnz[0] = 1; |
| pu1_top_nnz[1] = 1; |
| |
| /* added to be used by BS computation module */ |
| ui16_csbp |= 0x3300; |
| } |
| |
| /*******************************************************************/ |
| /* Block 3 residual decoding, check cbp and proceed (subblock = 10)*/ |
| /*******************************************************************/ |
| pi2_coeff_block += 64; |
| |
| if(!(u1_cbp & 0x8)) |
| { |
| *(UWORD16 *)(pu1_top_nnz + 2) = 0; |
| *(UWORD16 *)(pu1_left_nnz + 2) = 0; |
| } |
| else |
| { |
| |
| dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; |
| |
| ih264d_read_coeff8x8_cabac(ps_bitstrm, |
| ps_dec, ps_cur_mb_info); |
| |
| pu1_left_nnz[2] = 1; |
| pu1_left_nnz[3] = 1; |
| |
| pu1_top_nnz[2] = 1; |
| pu1_top_nnz[3] = 1; |
| |
| /* added to be used by BS computation module */ |
| ui16_csbp |= 0xCC00; |
| } |
| } |
| } |
| else |
| { |
| *(UWORD32 *)(pu1_top_nnz) = 0; |
| *(UWORD32 *)(pu1_left_nnz) = 0; |
| } |
| /*--------------------------------------------------------------------*/ |
| /* Store the last row of N values to top row */ |
| /*--------------------------------------------------------------------*/ |
| ps_cur_mb_info->u2_luma_csbp = ui16_csbp; |
| ps_cur_mb_info->ps_curmb->u2_luma_csbp = ui16_csbp; |
| { |
| WORD8 i; |
| UWORD16 u2_chroma_csbp = 0; |
| ps_cur_mb_info->u2_chroma_csbp = 0; |
| |
| u1_cbp >>= 4; |
| pu1_top_nnz = pu1_top_nnz_uv; |
| pu1_left_nnz = ps_dec->pu1_left_nnz_uv; |
| /*--------------------------------------------------------------------*/ |
| /* if Chroma Component not present OR no ac values present */ |
| /* Set the values of N to zero */ |
| /*--------------------------------------------------------------------*/ |
| if(u1_cbp == CBPC_ALLZERO) |
| { |
| ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x1; |
| *(UWORD32 *)(pu1_top_nnz) = 0; |
| *(UWORD32 *)(pu1_left_nnz) = 0; |
| p_curr_ctxt->u1_yuv_dc_csbp &= 0x1; |
| return (0); |
| } |
| |
| /*--------------------------------------------------------------------*/ |
| /* Decode Chroma DC values */ |
| /*--------------------------------------------------------------------*/ |
| for(i = 0; i < 2; i++) |
| { |
| UWORD8 uc_a = 1, uc_b = 1; |
| UWORD32 u4_ctx_inc; |
| UWORD8 uc_codedBlockFlag; |
| UWORD8 pu1_inv_scan[4] = |
| { 0, 1, 2, 3 }; |
| WORD32 u4_scale; |
| WORD32 i4_mb_inter_inc; |
| tu_sblk4x4_coeff_data_t *ps_tu_4x4 = |
| (tu_sblk4x4_coeff_data_t *)ps_dec->pv_parse_tu_coeff_data; |
| WORD16 *pi2_coeff_data = |
| (WORD16 *)ps_dec->pv_parse_tu_coeff_data; |
| WORD16 ai2_dc_coef[4]; |
| |
| INC_SYM_COUNT(&(ps_dec->s_cab_dec_env)); |
| u4_scale = (i) ? |
| (ps_dec->pu2_quant_scale_v[0] |
| << ps_dec->u1_qp_v_div6) : |
| (ps_dec->pu2_quant_scale_u[0] |
| << ps_dec->u1_qp_u_div6); |
| |
| /*--------------------------------------------------------------------*/ |
| /* Decode Bitstream to get the DC coeff */ |
| /*--------------------------------------------------------------------*/ |
| uc_a = (u1_left_dc_csbp >> i) & 0x01; |
| uc_b = (u1_top_dc_csbp >> i) & 0x01; |
| u4_ctx_inc = (uc_a + (uc_b << 1)); |
| |
| ps_src_bin_ctxt = (ps_dec->p_cbf_t[CHROMA_DC_CTXCAT]) + u4_ctx_inc; |
| |
| uc_codedBlockFlag = |
| ih264d_read_coeff4x4_cabac(ps_bitstrm, |
| CHROMA_DC_CTXCAT, |
| ps_dec->p_significant_coeff_flag_t[CHROMA_DC_CTXCAT], |
| ps_dec, ps_src_bin_ctxt); |
| |
| i4_mb_inter_inc = (!((ps_cur_mb_info->ps_curmb->u1_mb_type == I_4x4_MB) |
| || (ps_cur_mb_info->ps_curmb->u1_mb_type == I_16x16_MB))) |
| * 3; |
| |
| if(ps_dec->s_high_profile.u1_scaling_present) |
| { |
| u4_scale *= |
| ps_dec->s_high_profile.i2_scalinglist4x4[i4_mb_inter_inc |
| + 1 + i][0]; |
| |
| } |
| else |
| { |
| u4_scale <<= 4; |
| } |
| |
| if(uc_codedBlockFlag) |
| { |
| WORD32 i_z0, i_z1, i_z2, i_z3; |
| WORD32 *pi4_scale; |
| |
| SET_BIT(u1_top_dc_csbp, i); |
| SET_BIT(u1_left_dc_csbp, i); |
| |
| ai2_dc_coef[0] = 0; |
| ai2_dc_coef[1] = 0; |
| ai2_dc_coef[2] = 0; |
| ai2_dc_coef[3] = 0; |
| |
| ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4, |
| ai2_dc_coef, |
| pu1_inv_scan); |
| i_z0 = (ai2_dc_coef[0] + ai2_dc_coef[2]); |
| i_z1 = (ai2_dc_coef[0] - ai2_dc_coef[2]); |
| i_z2 = (ai2_dc_coef[1] - ai2_dc_coef[3]); |
| i_z3 = (ai2_dc_coef[1] + ai2_dc_coef[3]); |
| |
| /*-----------------------------------------------------------*/ |
| /* Scaling and storing the values back */ |
| /*-----------------------------------------------------------*/ |
| *pi2_coeff_data++ = ((i_z0 + i_z3) * u4_scale) >> 5; |
| *pi2_coeff_data++ = ((i_z0 - i_z3) * u4_scale) >> 5; |
| *pi2_coeff_data++ = ((i_z1 + i_z2) * u4_scale) >> 5; |
| *pi2_coeff_data++ = ((i_z1 - i_z2) * u4_scale) >> 5; |
| |
| ps_dec->pv_parse_tu_coeff_data = (void *)pi2_coeff_data; |
| |
| SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag,(i+1)); |
| } |
| else |
| { |
| CLEARBIT(u1_top_dc_csbp, i); |
| CLEARBIT(u1_left_dc_csbp, i); |
| } |
| } |
| |
| /*********************************************************************/ |
| /* Update the DC csbp */ |
| /*********************************************************************/ |
| ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x1; |
| p_curr_ctxt->u1_yuv_dc_csbp &= 0x1; |
| ps_dec->pu1_left_yuv_dc_csbp[0] |= (u1_left_dc_csbp << 1); |
| p_curr_ctxt->u1_yuv_dc_csbp |= (u1_top_dc_csbp << 1); |
| if(u1_cbp == CBPC_ACZERO) |
| { |
| *(UWORD32 *)(pu1_top_nnz) = 0; |
| *(UWORD32 *)(pu1_left_nnz) = 0; |
| return (0); |
| } |
| /*--------------------------------------------------------------------*/ |
| /* Decode Chroma AC values */ |
| /*--------------------------------------------------------------------*/ |
| { |
| UWORD32 u4_temp; |
| /*****************************************************************/ |
| /* U Block residual decoding, check cbp and proceed (subblock=0)*/ |
| /*****************************************************************/ |
| u2_chroma_csbp = ih264d_cabac_parse_8x8block(pi2_coeff_block, 2, |
| CHROMA_AC_CTXCAT, |
| ps_dec, pu1_top_nnz, |
| pu1_left_nnz); |
| |
| pi2_coeff_block += MB_CHROM_SIZE; |
| /*****************************************************************/ |
| /* V Block residual decoding, check cbp and proceed (subblock=1)*/ |
| /*****************************************************************/ |
| u4_temp = ih264d_cabac_parse_8x8block(pi2_coeff_block, 2, |
| CHROMA_AC_CTXCAT, |
| ps_dec, (pu1_top_nnz + 2), |
| (pu1_left_nnz + 2)); |
| u2_chroma_csbp |= (u4_temp << 4); |
| } |
| /*********************************************************************/ |
| /* Update the AC csbp */ |
| /*********************************************************************/ |
| ps_cur_mb_info->u2_chroma_csbp = u2_chroma_csbp; |
| } |
| |
| return (0); |
| } |
| |