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.
1356 lines
45 KiB
1356 lines
45 KiB
/****************************************************************************** |
|
* |
|
* 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_mb_header.c |
|
* |
|
* \brief |
|
* This file contains context identifier encoding routines. |
|
* |
|
* \date |
|
* 04/02/2003 |
|
* |
|
* \author NS |
|
*************************************************************************** |
|
*/ |
|
#include <string.h> |
|
#include "ih264d_structs.h" |
|
#include "ih264d_bitstrm.h" |
|
#include "ih264d_cabac.h" |
|
#include "ih264_typedefs.h" |
|
#include "ih264_macros.h" |
|
#include "ih264_platform_macros.h" |
|
#include "ih264d_defs.h" |
|
#include "ih264d_error_handler.h" |
|
#include "ih264d_tables.h" |
|
#include "ih264d_debug.h" |
|
#include "ih264d_defs.h" |
|
#include "ih264d_defs.h" |
|
#include "ih264d_mb_utils.h" |
|
#include "ih264d_parse_mb_header.h" |
|
#include "ih264d_defs.h" |
|
|
|
/*! < CtxtInc index 0 - CtxMbTypeI, CtxMbTypeSISuffix |
|
index 1 - CtxMbTypePSuffix, CtxMbTypeBSuffix |
|
*/ |
|
|
|
|
|
|
|
/*! |
|
************************************************************************** |
|
* \if Function name : ih264d_parse_mb_type_intra_cabac \endif |
|
* |
|
* \brief |
|
* This function decodes MB type using CABAC entropy coding mode. |
|
* |
|
* \return |
|
* MBType. |
|
* |
|
************************************************************************** |
|
*/ |
|
UWORD8 ih264d_parse_mb_type_intra_cabac(UWORD8 u1_inter, |
|
struct _DecStruct * ps_dec) |
|
{ |
|
decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env; |
|
dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm; |
|
ctxt_inc_mb_info_t * ps_left_ctxt = ps_dec->p_left_ctxt_mb_info; |
|
ctxt_inc_mb_info_t * ps_top_ctxt = ps_dec->p_top_ctxt_mb_info; |
|
bin_ctxt_model_t *ps_mb_bin_ctxt = ps_dec->p_mb_type_t; |
|
WORD8 u1_mb_type, u1_bin; |
|
UWORD32 u4_cxt_inc; |
|
|
|
u4_cxt_inc = 0; |
|
if(!u1_inter) |
|
{ |
|
if(ps_left_ctxt != ps_dec->ps_def_ctxt_mb_info) |
|
u4_cxt_inc += ((ps_left_ctxt->u1_mb_type != CAB_I4x4) ? 1 : 0); |
|
if(ps_top_ctxt != ps_dec->ps_def_ctxt_mb_info) |
|
u4_cxt_inc += ((ps_top_ctxt->u1_mb_type != CAB_I4x4) ? 1 : 0); |
|
} |
|
else |
|
{ |
|
ps_mb_bin_ctxt = ps_mb_bin_ctxt + 3 + (ps_dec->u1_B << 1); |
|
} |
|
|
|
/* b0 */ |
|
u1_mb_type = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, ps_bitstrm, |
|
ps_cab_env); |
|
if(u1_mb_type) |
|
{ |
|
/* I16x16 or I_PCM mode */ |
|
/* b1 */ |
|
u1_bin = ih264d_decode_terminate(ps_cab_env, ps_bitstrm); |
|
if(u1_bin == 0) |
|
{ |
|
/* I16x16 mode */ |
|
/* Read b2 and b3 */ |
|
u4_cxt_inc = (u1_inter) ? 0x021 : 0x043; |
|
|
|
u1_bin = ih264d_decode_bins(2, u4_cxt_inc, ps_mb_bin_ctxt, ps_bitstrm, |
|
ps_cab_env); |
|
|
|
if(u1_bin & 0x01) |
|
u1_mb_type += 4; |
|
|
|
if(u1_bin & 0x02) |
|
u1_mb_type += 12; |
|
|
|
if(u1_bin & 0x01) |
|
{ |
|
/* since b3=1, Read three bins */ |
|
u4_cxt_inc = (u1_inter) ? 0x0332 : 0x0765; |
|
u1_bin = (UWORD8)ih264d_decode_bins(3, u4_cxt_inc, ps_mb_bin_ctxt, |
|
ps_bitstrm, ps_cab_env); |
|
|
|
} |
|
else |
|
{ |
|
/* Read two bins */ |
|
u4_cxt_inc = (u1_inter) ? 0x033 : 0x076; |
|
u1_bin = (UWORD8)ih264d_decode_bins(2, u4_cxt_inc, ps_mb_bin_ctxt, |
|
ps_bitstrm, ps_cab_env); |
|
} |
|
u1_mb_type += u1_bin; |
|
} |
|
else |
|
{ |
|
/* I_PCM mode */ |
|
/* b1=1 */ |
|
u1_mb_type = 25; |
|
} |
|
} |
|
return (u1_mb_type); |
|
} |
|
|
|
/*! |
|
************************************************************************** |
|
* \if Function name : ih264d_parse_mb_type_cabac \endif |
|
* |
|
* \brief |
|
* This function decodes MB type using CABAC entropy coding mode. |
|
* |
|
* \return |
|
* MBType. |
|
* |
|
************************************************************************** |
|
*/ |
|
UWORD32 ih264d_parse_mb_type_cabac(struct _DecStruct * ps_dec) |
|
{ |
|
const UWORD8 uc_slice_type = ps_dec->ps_cur_slice->u1_slice_type; |
|
decoding_envirnoment_t *ps_cab_env = &ps_dec->s_cab_dec_env; |
|
dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm; |
|
ctxt_inc_mb_info_t *ps_left_ctxt = ps_dec->p_left_ctxt_mb_info; |
|
ctxt_inc_mb_info_t *ps_top_ctxt = ps_dec->p_top_ctxt_mb_info; |
|
WORD8 c_ctxt_inc; |
|
bin_ctxt_model_t *ps_mb_bin_ctxt = ps_dec->p_mb_type_t; |
|
WORD8 u1_mb_type = 0, u1_bin; |
|
UWORD32 u4_cxt_inc; |
|
|
|
INC_SYM_COUNT(ps_cab_env); |
|
|
|
c_ctxt_inc = 0; |
|
|
|
if(uc_slice_type == SI_SLICE) |
|
{ |
|
/* b0 */ |
|
if(ps_left_ctxt != ps_dec->ps_def_ctxt_mb_info) |
|
c_ctxt_inc += ((ps_left_ctxt->u1_mb_type != CAB_SI4x4) ? 1 : 0); |
|
if(ps_top_ctxt != ps_dec->ps_def_ctxt_mb_info) |
|
c_ctxt_inc += ((ps_top_ctxt->u1_mb_type != CAB_SI4x4) ? 1 : 0); |
|
|
|
u4_cxt_inc = c_ctxt_inc; |
|
u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, ps_bitstrm, |
|
ps_cab_env); |
|
if(u1_bin == 0) |
|
{ |
|
/* SI MB */ |
|
u1_mb_type = 0; |
|
} |
|
else |
|
{ |
|
u1_mb_type = 1 + ih264d_parse_mb_type_intra_cabac(0, ps_dec); |
|
} |
|
} |
|
else if(uc_slice_type == P_SLICE) |
|
{ |
|
/* P Slice */ |
|
/* b0 */ |
|
u4_cxt_inc = 0; |
|
u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, ps_bitstrm, |
|
ps_cab_env); |
|
if(!u1_bin) |
|
{ |
|
/* Inter MB types */ |
|
/* b1 */ |
|
u4_cxt_inc = 0x01; |
|
u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, |
|
ps_bitstrm, ps_cab_env); |
|
/* b2 */ |
|
u4_cxt_inc = u1_bin + 2; |
|
u1_mb_type = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, |
|
ps_bitstrm, ps_cab_env); |
|
u1_mb_type = (u1_bin << 1) + u1_mb_type; |
|
if(u1_mb_type) |
|
u1_mb_type = 4 - u1_mb_type; |
|
} |
|
else |
|
{ |
|
/* Intra Prefix 1 found */ |
|
/* Intra MB type */ |
|
u1_mb_type = 5 + ih264d_parse_mb_type_intra_cabac(1, ps_dec); |
|
} |
|
} |
|
else if(uc_slice_type == B_SLICE) |
|
{ |
|
WORD8 a, b; |
|
/* B Slice */ |
|
/* b0 */ |
|
/* a = b = 0, if B slice and MB is a SKIP or B_DIRECT16x16 */ |
|
a = 0; |
|
b = 0; |
|
u1_mb_type = 0; |
|
if(ps_left_ctxt != ps_dec->ps_def_ctxt_mb_info) |
|
a = ((ps_left_ctxt->u1_mb_type & CAB_BD16x16_MASK) != CAB_BD16x16); |
|
if(ps_top_ctxt != ps_dec->ps_def_ctxt_mb_info) |
|
b = ((ps_top_ctxt->u1_mb_type & CAB_BD16x16_MASK) != CAB_BD16x16); |
|
|
|
u4_cxt_inc = a + b; |
|
|
|
u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, ps_bitstrm, |
|
ps_cab_env); |
|
|
|
if(u1_bin) |
|
{ |
|
|
|
/* b1 */ |
|
u4_cxt_inc = 0x03; |
|
u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, |
|
ps_bitstrm, ps_cab_env); |
|
|
|
if(!u1_bin) |
|
{ |
|
/* b2 */ |
|
u4_cxt_inc = 0x05; |
|
u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, |
|
ps_bitstrm, ps_cab_env); |
|
|
|
u1_mb_type = u1_bin + 1; |
|
} |
|
else |
|
{ |
|
u1_mb_type = 3; |
|
/* b2 */ |
|
u4_cxt_inc = 0x04; |
|
u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, |
|
ps_bitstrm, ps_cab_env); |
|
|
|
if(u1_bin) |
|
{ |
|
u1_mb_type += 8; |
|
/* b3 */ |
|
u4_cxt_inc = 0x05; |
|
u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, |
|
ps_bitstrm, ps_cab_env); |
|
|
|
if(!u1_bin) |
|
{ |
|
u1_mb_type++; |
|
/* b4, b5, b6 */ |
|
u4_cxt_inc = 0x0555; |
|
u1_bin = (UWORD8)ih264d_decode_bins(3, u4_cxt_inc, |
|
ps_mb_bin_ctxt, |
|
ps_bitstrm, |
|
ps_cab_env); |
|
|
|
|
|
|
|
u1_mb_type += u1_bin; |
|
} |
|
else |
|
{ |
|
/* b4 */ |
|
u4_cxt_inc = 0x05; |
|
u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, |
|
ps_mb_bin_ctxt, |
|
ps_bitstrm, |
|
ps_cab_env); |
|
|
|
if(u1_bin) |
|
{ |
|
/* b5 */ |
|
u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, |
|
ps_mb_bin_ctxt, |
|
ps_bitstrm, |
|
ps_cab_env); |
|
|
|
u1_mb_type += (u1_bin ? 11 : 0); |
|
} |
|
else |
|
{ |
|
u1_mb_type = 20; |
|
/* b5 */ |
|
u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, |
|
ps_mb_bin_ctxt, |
|
ps_bitstrm, |
|
ps_cab_env); |
|
|
|
if(!u1_bin) |
|
{ |
|
/* b6 */ |
|
u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, |
|
ps_mb_bin_ctxt, |
|
ps_bitstrm, |
|
ps_cab_env); |
|
|
|
u1_mb_type += u1_bin; |
|
} |
|
else |
|
{ |
|
/* Intra Prefix 111101 found */ |
|
/* Intra MB type */ |
|
u1_mb_type = |
|
23 |
|
+ ih264d_parse_mb_type_intra_cabac( |
|
1, |
|
ps_dec); |
|
} |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
/* b3, b4, b5 */ |
|
u4_cxt_inc = 0x0555; |
|
u1_bin = (UWORD8)ih264d_decode_bins(3, u4_cxt_inc, |
|
ps_mb_bin_ctxt, ps_bitstrm, |
|
ps_cab_env); |
|
|
|
|
|
|
|
|
|
u1_mb_type += u1_bin; |
|
} |
|
} |
|
} |
|
} |
|
return ((UWORD32)u1_mb_type); |
|
} |
|
|
|
/*! |
|
************************************************************************** |
|
* \if Function name : DecSubMBType \endif |
|
* |
|
* \brief |
|
* This function decodes MB type using CABAC entropy coding mode. |
|
* |
|
* \return |
|
* MBType. |
|
* |
|
************************************************************************** |
|
*/ |
|
UWORD32 ih264d_parse_submb_type_cabac(const UWORD8 u1_slc_type_b, |
|
decoding_envirnoment_t * ps_cab_env, |
|
dec_bit_stream_t * ps_bitstrm, |
|
bin_ctxt_model_t * ps_sub_mb_cxt) |
|
{ |
|
WORD8 u1_sub_mb_type, u1_bin; |
|
|
|
INC_SYM_COUNT(ps_cab_env); |
|
|
|
u1_sub_mb_type = 0; |
|
u1_bin = (UWORD8)ih264d_decode_bin(0, ps_sub_mb_cxt, ps_bitstrm, |
|
ps_cab_env); |
|
|
|
if(u1_slc_type_b ^ u1_bin) |
|
return 0; |
|
|
|
if(!u1_slc_type_b) |
|
{ |
|
/* P Slice */ |
|
u1_sub_mb_type = 1; |
|
u1_bin = (UWORD8)ih264d_decode_bin(1, ps_sub_mb_cxt, ps_bitstrm, |
|
ps_cab_env); |
|
if(u1_bin == 1) |
|
{ |
|
u1_bin = (UWORD8)ih264d_decode_bin(2, ps_sub_mb_cxt, ps_bitstrm, |
|
ps_cab_env); |
|
u1_sub_mb_type = (2 + (!u1_bin)); |
|
} |
|
|
|
return u1_sub_mb_type; |
|
} |
|
else |
|
{ |
|
/* B Slice */ |
|
|
|
/* b1 */ |
|
u1_bin = (UWORD8)ih264d_decode_bin(1, ps_sub_mb_cxt, ps_bitstrm, |
|
ps_cab_env); |
|
if(u1_bin) |
|
{ |
|
/* b2 */ |
|
u1_bin = (UWORD8)ih264d_decode_bin(2, ps_sub_mb_cxt, ps_bitstrm, |
|
ps_cab_env); |
|
if(u1_bin) |
|
{ |
|
/* b3 */ |
|
u1_sub_mb_type = 7; |
|
u1_bin = (UWORD8)ih264d_decode_bin(3, ps_sub_mb_cxt, ps_bitstrm, |
|
ps_cab_env); |
|
u1_sub_mb_type += u1_bin << 2; |
|
u1_bin = !u1_bin; |
|
/* b4 */ |
|
if(u1_bin == 0) |
|
{ |
|
u1_bin = ih264d_decode_bin(3, ps_sub_mb_cxt, ps_bitstrm, |
|
ps_cab_env); |
|
} |
|
else |
|
{ |
|
u1_bin = (UWORD8)ih264d_decode_bins(2, 0x33, ps_sub_mb_cxt, |
|
ps_bitstrm, ps_cab_env); |
|
} |
|
|
|
return (u1_sub_mb_type + u1_bin); |
|
} |
|
else |
|
{ |
|
/* b3 */ |
|
u1_bin = (UWORD8)ih264d_decode_bins(2, 0x33, ps_sub_mb_cxt, |
|
ps_bitstrm, ps_cab_env); |
|
return (3 + u1_bin); |
|
} |
|
} |
|
else |
|
{ |
|
/* b2 */ |
|
u1_bin = (UWORD8)ih264d_decode_bin(3, ps_sub_mb_cxt, ps_bitstrm, |
|
ps_cab_env); |
|
return (1 + u1_bin); |
|
} |
|
} |
|
} |
|
|
|
/*! |
|
************************************************************************** |
|
* \if Function name : ih264d_parse_ref_idx_cabac \endif |
|
* |
|
* \brief |
|
* This function decodes Reference Index using CABAC entropy coding mode. |
|
* |
|
* \return |
|
* None |
|
* |
|
************************************************************************** |
|
*/ |
|
WORD32 ih264d_parse_ref_idx_cabac(const UWORD8 u1_num_part, |
|
const UWORD8 u1_b2, |
|
const UWORD8 u1_max_ref_minus1, |
|
const UWORD8 u1_mb_mode, |
|
WORD8 * pi1_ref_idx, |
|
WORD8 * const pi1_lft_cxt, |
|
WORD8 * const pi1_top_cxt, |
|
decoding_envirnoment_t * const ps_cab_env, |
|
dec_bit_stream_t * const ps_bitstrm, |
|
bin_ctxt_model_t * const ps_ref_cxt) |
|
{ |
|
UWORD8 u1_a, u1_b; |
|
UWORD32 u4_cxt_inc; |
|
UWORD8 u1_blk_no, u1_i, u1_idx_lft, u1_idx_top; |
|
WORD8 i1_ref_idx; |
|
|
|
for(u1_blk_no = 0, u1_i = 0; u1_i < u1_num_part; u1_i++, pi1_ref_idx++) |
|
{ |
|
u1_idx_lft = ((u1_blk_no & 0x02) >> 1) + u1_b2; |
|
u1_idx_top = (u1_blk_no & 0x01) + u1_b2; |
|
i1_ref_idx = *pi1_ref_idx; |
|
|
|
if(i1_ref_idx > 0) |
|
{ |
|
u1_a = pi1_lft_cxt[u1_idx_lft] > 0; |
|
u1_b = pi1_top_cxt[u1_idx_top] > 0; |
|
|
|
u4_cxt_inc = u1_a + (u1_b << 1); |
|
u4_cxt_inc = (u4_cxt_inc | 0x55540); |
|
|
|
i1_ref_idx = (WORD8)ih264d_decode_bins_unary(32, u4_cxt_inc, |
|
ps_ref_cxt, ps_bitstrm, |
|
ps_cab_env); |
|
|
|
if((i1_ref_idx > u1_max_ref_minus1) || (i1_ref_idx < 0)) |
|
{ |
|
return ERROR_REF_IDX; |
|
} |
|
|
|
*pi1_ref_idx = i1_ref_idx; |
|
|
|
INC_SYM_COUNT(ps_cab_env); |
|
|
|
} |
|
|
|
/* Storing Reference Idx Information */ |
|
pi1_lft_cxt[u1_idx_lft] = i1_ref_idx; |
|
pi1_top_cxt[u1_idx_top] = i1_ref_idx; |
|
u1_blk_no = u1_blk_no + 1 + (u1_mb_mode & 0x01); |
|
} |
|
/* if(!u1_sub_mb) */ |
|
if(u1_num_part != 4) |
|
{ |
|
pi1_lft_cxt[(!(u1_mb_mode & 0x1)) + u1_b2] = pi1_lft_cxt[u1_b2]; |
|
pi1_top_cxt[(!(u1_mb_mode & 0x2)) + u1_b2] = pi1_top_cxt[u1_b2]; |
|
} |
|
return OK; |
|
} |
|
|
|
/*! |
|
************************************************************************** |
|
* \if Function name : ih264d_parse_mb_qp_delta_cabac \endif |
|
* |
|
* \brief |
|
* This function decodes MB Qp delta using CABAC entropy coding mode. |
|
* |
|
* \return |
|
* None |
|
* |
|
************************************************************************** |
|
*/ |
|
WORD32 ih264d_parse_mb_qp_delta_cabac(struct _DecStruct * ps_dec, |
|
WORD8 *pi1_mb_qp_delta) |
|
{ |
|
decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env; |
|
dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm; |
|
|
|
UWORD8 u1_code_num; |
|
bin_ctxt_model_t *ps_mb_qp_delta_ctxt = ps_dec->p_mb_qp_delta_t; |
|
UWORD32 u4_cxt_inc; |
|
|
|
INC_SYM_COUNT(ps_cab_env); |
|
|
|
u4_cxt_inc = (!(!(ps_dec->i1_prev_mb_qp_delta))); |
|
|
|
u1_code_num = 0; |
|
u4_cxt_inc = (u4_cxt_inc | 0x33320); |
|
/* max number of bins = 53, |
|
since Range for MbQpDelta= -26 to +25 inclusive, UNARY code */ |
|
u1_code_num = ih264d_decode_bins_unary(32, u4_cxt_inc, ps_mb_qp_delta_ctxt, |
|
ps_bitstrm, ps_cab_env); |
|
if(u1_code_num == 32) |
|
{ |
|
/* Read remaining 21 bins */ |
|
UWORD8 uc_codeNumX; |
|
u4_cxt_inc = 0x33333; |
|
uc_codeNumX = ih264d_decode_bins_unary(21, u4_cxt_inc, ps_mb_qp_delta_ctxt, |
|
ps_bitstrm, ps_cab_env); |
|
u1_code_num = u1_code_num + uc_codeNumX; |
|
} |
|
|
|
*pi1_mb_qp_delta = (u1_code_num + 1) >> 1; |
|
/* Table 9.3: If code_num is even Syntax Element has -ve value */ |
|
if(!(u1_code_num & 0x01)) |
|
*pi1_mb_qp_delta = -(*pi1_mb_qp_delta); |
|
|
|
/* Range of MbQpDelta= -26 to +25 inclusive */ |
|
if((*pi1_mb_qp_delta < -26) || (*pi1_mb_qp_delta > 25)) |
|
return ERROR_INV_RANGE_QP_T; |
|
ps_dec->i1_prev_mb_qp_delta = *pi1_mb_qp_delta; |
|
return OK; |
|
} |
|
/*! |
|
************************************************************************** |
|
* \if Function name : ih264d_parse_chroma_pred_mode_cabac \endif |
|
* |
|
* \brief |
|
* This function decodes Chroma Pred mode using CABAC entropy coding mode. |
|
* |
|
* \return |
|
* None |
|
* |
|
************************************************************************** |
|
*/ |
|
WORD8 ih264d_parse_chroma_pred_mode_cabac(struct _DecStruct * ps_dec) |
|
{ |
|
decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env; |
|
dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm; |
|
ctxt_inc_mb_info_t * ps_left_ctxt = ps_dec->p_left_ctxt_mb_info; |
|
ctxt_inc_mb_info_t * ps_top_ctxt = ps_dec->p_top_ctxt_mb_info; |
|
WORD8 i1_chroma_pred_mode, a, b; |
|
UWORD32 u4_cxt_inc; |
|
|
|
INC_SYM_COUNT(ps_cab_env); |
|
|
|
/* Binarization is TU and Cmax=3 */ |
|
i1_chroma_pred_mode = 0; |
|
a = 0; |
|
b = 0; |
|
|
|
a = ((ps_left_ctxt->u1_intra_chroma_pred_mode != 0) ? 1 : 0); |
|
|
|
b = ((ps_top_ctxt->u1_intra_chroma_pred_mode != 0) ? 1 : 0); |
|
u4_cxt_inc = a + b; |
|
|
|
u4_cxt_inc = (u4_cxt_inc | 0x330); |
|
|
|
i1_chroma_pred_mode = ih264d_decode_bins_tunary( |
|
3, u4_cxt_inc, ps_dec->p_intra_chroma_pred_mode_t, |
|
ps_bitstrm, ps_cab_env); |
|
|
|
return (i1_chroma_pred_mode); |
|
} |
|
|
|
/*****************************************************************************/ |
|
/* */ |
|
/* Function Name : ih264d_parse_transform8x8flag_cabac */ |
|
/* */ |
|
/* Description : */ |
|
/* Inputs : */ |
|
/* */ |
|
/* */ |
|
/* Returns : */ |
|
/* */ |
|
/* Revision History: */ |
|
/* */ |
|
/* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
|
/* Rajasekhar Creation */ |
|
/* */ |
|
/*****************************************************************************/ |
|
UWORD8 ih264d_parse_transform8x8flag_cabac(struct _DecStruct * ps_dec, |
|
dec_mb_info_t * ps_cur_mb_info) |
|
{ |
|
decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env; |
|
dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm; |
|
ctxt_inc_mb_info_t * ps_left_ctxt = ps_dec->p_left_ctxt_mb_info; |
|
ctxt_inc_mb_info_t * ps_top_ctxt = ps_dec->p_top_ctxt_mb_info; |
|
UWORD8 u1_transform_8x8flag; |
|
UWORD8 u1_mb_ngbr_avail = ps_cur_mb_info->u1_mb_ngbr_availablity; |
|
|
|
WORD8 a, b; |
|
UWORD32 u4_cxt_inc; |
|
|
|
/* for calculating the context increment for transform8x8 u4_flag */ |
|
/* it reads transform8x8 u4_flag of the neighbors through */ |
|
|
|
/* Binarization is FLC */ |
|
a = 0; |
|
b = 0; |
|
|
|
if(u1_mb_ngbr_avail & LEFT_MB_AVAILABLE_MASK) |
|
{ |
|
a = ps_left_ctxt->u1_transform8x8_ctxt; |
|
} |
|
if(u1_mb_ngbr_avail & TOP_MB_AVAILABLE_MASK) |
|
{ |
|
b = ps_top_ctxt->u1_transform8x8_ctxt; |
|
|
|
} |
|
|
|
u4_cxt_inc = a + b; |
|
|
|
u1_transform_8x8flag = ih264d_decode_bin( |
|
u4_cxt_inc, ps_dec->s_high_profile.ps_transform8x8_flag, |
|
ps_bitstrm, ps_cab_env); |
|
|
|
return (u1_transform_8x8flag); |
|
} |
|
|
|
/*! |
|
************************************************************************** |
|
* \if Function name : ih264d_read_intra_pred_modes_cabac \endif |
|
* |
|
* \brief |
|
* Reads the intra pred mode related values of I4x4 MB from bitstream. |
|
* |
|
* This function will read the prev intra pred mode flags and |
|
* stores it in pu1_prev_intra4x4_pred_mode_flag. If the u4_flag |
|
* indicates that most probable mode is not intra pred mode, then |
|
* the rem_intra4x4_pred_mode is read and stored in |
|
* pu1_rem_intra4x4_pred_mode array. |
|
* |
|
* |
|
* \return |
|
* 0 on success and Error code otherwise |
|
* |
|
************************************************************************** |
|
*/ |
|
WORD32 ih264d_read_intra_pred_modes_cabac(dec_struct_t * ps_dec, |
|
UWORD8 * pu1_prev_intra4x4_pred_mode_flag, |
|
UWORD8 * pu1_rem_intra4x4_pred_mode, |
|
UWORD8 u1_tran_form8x8) |
|
{ |
|
WORD32 i4x4_luma_blk_idx = 0; |
|
dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm; |
|
decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env; |
|
bin_ctxt_model_t *ps_ctxt_ipred_luma_mpm, *ps_ctx_ipred_luma_rm; |
|
WORD32 i4_rem_intra4x4_pred_mode; |
|
UWORD32 u4_prev_intra4x4_pred_mode_flag; |
|
UWORD32 u4_code_int_range, u4_code_int_val_ofst; |
|
const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table; |
|
|
|
ps_ctxt_ipred_luma_mpm = ps_dec->p_prev_intra4x4_pred_mode_flag_t; |
|
ps_ctx_ipred_luma_rm = ps_dec->p_rem_intra4x4_pred_mode_t; |
|
SWITCHOFFTRACE; |
|
|
|
i4x4_luma_blk_idx = (0 == u1_tran_form8x8) ? 16 : 4; |
|
|
|
u4_code_int_range = ps_cab_env->u4_code_int_range; |
|
u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst; |
|
|
|
do |
|
{ |
|
|
|
DECODE_ONE_BIN_MACRO(ps_ctxt_ipred_luma_mpm, u4_code_int_range, |
|
u4_code_int_val_ofst, pu4_table, ps_bitstrm, |
|
u4_prev_intra4x4_pred_mode_flag) |
|
*pu1_prev_intra4x4_pred_mode_flag = u4_prev_intra4x4_pred_mode_flag; |
|
|
|
i4_rem_intra4x4_pred_mode = -1; |
|
if(!u4_prev_intra4x4_pred_mode_flag) |
|
{ |
|
|
|
/*inlining DecodeDecisionBins_FLC*/ |
|
|
|
{ |
|
|
|
UWORD8 u1_max_bins = 3; |
|
UWORD32 u4_value; |
|
UWORD32 u4_symbol, i; |
|
|
|
i = 0; |
|
u4_value = 0; |
|
|
|
do |
|
{ |
|
|
|
DECODE_ONE_BIN_MACRO(ps_ctx_ipred_luma_rm, u4_code_int_range, |
|
u4_code_int_val_ofst, pu4_table, |
|
ps_bitstrm, u4_symbol) |
|
|
|
INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env); |
|
|
|
u4_value = u4_value | (u4_symbol << i); |
|
|
|
i++; |
|
} |
|
while(i < u1_max_bins); |
|
|
|
i4_rem_intra4x4_pred_mode = (u4_value); |
|
|
|
} |
|
|
|
} |
|
|
|
(*pu1_rem_intra4x4_pred_mode) = i4_rem_intra4x4_pred_mode; |
|
|
|
COPYTHECONTEXT("intra4x4_pred_mode", i4_rem_intra4x4_pred_mode); |
|
|
|
pu1_prev_intra4x4_pred_mode_flag++; |
|
pu1_rem_intra4x4_pred_mode++; |
|
|
|
i4x4_luma_blk_idx--; |
|
} |
|
while(i4x4_luma_blk_idx); |
|
|
|
ps_cab_env->u4_code_int_range = u4_code_int_range; |
|
ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst; |
|
|
|
return (0); |
|
|
|
} |
|
|
|
/*! |
|
************************************************************************** |
|
* \if Function name : ih264d_parse_ctx_cbp_cabac \endif |
|
* |
|
* \brief |
|
* This function decodes CtxCbpLuma and CtxCbpChroma (CBP of a Macroblock). |
|
* using CABAC entropy coding mode. |
|
* |
|
* \return |
|
* CBP of a MB. |
|
* |
|
************************************************************************** |
|
*/ |
|
UWORD32 ih264d_parse_ctx_cbp_cabac(struct _DecStruct * ps_dec) |
|
{ |
|
|
|
UWORD32 u4_cxt_inc; |
|
decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env; |
|
dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm; |
|
ctxt_inc_mb_info_t * ps_left_ctxt = ps_dec->p_left_ctxt_mb_info; |
|
ctxt_inc_mb_info_t * ps_top_ctxt = ps_dec->p_top_ctxt_mb_info; |
|
bin_ctxt_model_t *ps_ctxt_cbp_luma = ps_dec->p_cbp_luma_t, *ps_bin_ctxt; |
|
WORD8 c_Cbp; //,i,j; |
|
UWORD32 u4_code_int_range, u4_code_int_val_ofst; |
|
UWORD32 u4_offset, *pu4_buffer; |
|
const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table; |
|
|
|
INC_SYM_COUNT(ps_cab_env); |
|
|
|
|
|
|
|
/* CBP Luma, FL, Cmax = 15, L = 4 */ |
|
u4_cxt_inc = (!((ps_top_ctxt->u1_cbp >> 2) & 0x01)) << 1; |
|
u4_cxt_inc += !((ps_left_ctxt->u1_cbp >> 1) & 0x01); |
|
|
|
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; |
|
/*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; |
|
} |
|
|
|
ps_bin_ctxt = ps_ctxt_cbp_luma + u4_cxt_inc; |
|
|
|
/*inlining DecodeDecision_onebin without renorm*/ |
|
{ |
|
|
|
UWORD32 u4_qnt_int_range, u4_int_range_lps; |
|
UWORD32 u4_symbol, u1_mps_state; |
|
UWORD32 table_lookup; |
|
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); |
|
|
|
/*if mps*/ |
|
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); |
|
|
|
ps_bin_ctxt->u1_mps_state = u1_mps_state; |
|
|
|
c_Cbp = u4_symbol; |
|
|
|
} |
|
|
|
u4_cxt_inc = (!((ps_top_ctxt->u1_cbp >> 3) & 0x01)) << 1; |
|
u4_cxt_inc += !(c_Cbp & 0x01); |
|
ps_bin_ctxt = ps_ctxt_cbp_luma + u4_cxt_inc; |
|
/*inlining DecodeDecision_onebin without renorm*/ |
|
|
|
{ |
|
|
|
UWORD32 u4_qnt_int_range, u4_int_range_lps; |
|
UWORD32 u4_symbol, u1_mps_state; |
|
UWORD32 table_lookup; |
|
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); |
|
|
|
/*if mps*/ |
|
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); |
|
|
|
ps_bin_ctxt->u1_mps_state = u1_mps_state; |
|
|
|
c_Cbp |= u4_symbol << 1; |
|
|
|
} |
|
|
|
u4_cxt_inc = (!(c_Cbp & 0x01)) << 1; |
|
u4_cxt_inc += !((ps_left_ctxt->u1_cbp >> 3) & 0x01); |
|
ps_bin_ctxt = ps_ctxt_cbp_luma + u4_cxt_inc; |
|
/*inlining DecodeDecision_onebin without renorm*/ |
|
|
|
{ |
|
|
|
UWORD32 u4_qnt_int_range, u4_int_range_lps; |
|
UWORD32 u4_symbol, u1_mps_state; |
|
UWORD32 table_lookup; |
|
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); |
|
|
|
/*if mps*/ |
|
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); |
|
|
|
ps_bin_ctxt->u1_mps_state = u1_mps_state; |
|
|
|
c_Cbp |= u4_symbol << 2; |
|
|
|
} |
|
|
|
u4_cxt_inc = (!((c_Cbp >> 1) & 0x01)) << 1; |
|
u4_cxt_inc += !((c_Cbp >> 2) & 0x01); |
|
ps_bin_ctxt = ps_ctxt_cbp_luma + u4_cxt_inc; |
|
/*inlining DecodeDecision_onebin without renorm*/ |
|
|
|
{ |
|
|
|
UWORD32 u4_qnt_int_range, u4_int_range_lps; |
|
UWORD32 u4_symbol, u1_mps_state; |
|
UWORD32 table_lookup; |
|
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); |
|
|
|
/*if mps*/ |
|
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); |
|
|
|
ps_bin_ctxt->u1_mps_state = u1_mps_state; |
|
|
|
c_Cbp |= u4_symbol << 3; |
|
|
|
} |
|
|
|
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) |
|
|
|
} |
|
|
|
{ |
|
UWORD32 u4_cxt_inc; |
|
WORD8 a, b, c, d; |
|
bin_ctxt_model_t *p_CtxtCbpChroma = ps_dec->p_cbp_chroma_t; |
|
|
|
/* CBP Chroma, TU, Cmax = 2 */ |
|
a = 0; |
|
b = 0; |
|
c = 0; |
|
d = 0; |
|
|
|
{ |
|
a = (ps_top_ctxt->u1_cbp > 15) ? 2 : 0; |
|
c = (ps_top_ctxt->u1_cbp > 31) ? 2 : 0; |
|
} |
|
|
|
{ |
|
b = (ps_left_ctxt->u1_cbp > 15) ? 1 : 0; |
|
d = (ps_left_ctxt->u1_cbp > 31) ? 1 : 0; |
|
} |
|
u4_cxt_inc = a + b; |
|
u4_cxt_inc = (u4_cxt_inc | ((4 + c + d) << 4)); |
|
|
|
/*inlining ih264d_decode_bins_tunary */ |
|
|
|
{ |
|
|
|
UWORD8 u1_max_bins = 2; |
|
UWORD32 u4_ctx_inc = u4_cxt_inc; |
|
|
|
UWORD32 u4_value; |
|
UWORD32 u4_symbol; |
|
UWORD8 u4_ctx_Inc; |
|
bin_ctxt_model_t *ps_bin_ctxt; |
|
u4_value = 0; |
|
|
|
do |
|
{ |
|
u4_ctx_Inc = u4_ctx_inc & 0xF; |
|
u4_ctx_inc = u4_ctx_inc >> 4; |
|
|
|
ps_bin_ctxt = p_CtxtCbpChroma + u4_ctx_Inc; |
|
/*inlining DecodeDecision_onebin*/ |
|
{ |
|
|
|
UWORD32 u4_qnt_int_range, u4_int_range_lps; |
|
|
|
UWORD32 u1_mps_state; |
|
UWORD32 table_lookup; |
|
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); |
|
|
|
/*if mps*/ |
|
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_bin_ctxt->u1_mps_state = u1_mps_state; |
|
} |
|
|
|
INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS( |
|
ps_cab_env); |
|
|
|
u4_value++; |
|
} |
|
while((u4_value < u1_max_bins) & (u4_symbol)); |
|
|
|
u4_value = u4_value - 1 + u4_symbol; |
|
|
|
a = (u4_value); |
|
|
|
} |
|
|
|
c_Cbp = (c_Cbp | (a << 4)); |
|
} |
|
|
|
ps_bitstrm->u4_ofst = u4_offset; |
|
|
|
ps_cab_env->u4_code_int_range = u4_code_int_range; |
|
ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst; |
|
|
|
return (c_Cbp); |
|
} |
|
|
|
/*! |
|
************************************************************************** |
|
* \if Function name : ih264d_get_mvd_cabac \endif |
|
* |
|
* \brief |
|
* This function decodes Horz and Vert mvd_l0 and mvd_l1 using CABAC entropy |
|
* coding mode as defined in 9.3.2.3. |
|
* |
|
* \return |
|
* None |
|
* |
|
************************************************************************** |
|
*/ |
|
void ih264d_get_mvd_cabac(UWORD8 u1_sub_mb, |
|
UWORD8 u1_b2, |
|
UWORD8 u1_part_wd, |
|
UWORD8 u1_part_ht, |
|
UWORD8 u1_dec_mvd, |
|
dec_struct_t *ps_dec, |
|
mv_pred_t *ps_mv) |
|
{ |
|
UWORD8 u1_abs_mvd_x = 0, u1_abs_mvd_y = 0; |
|
UWORD8 u1_sub_mb_x, u1_sub_mb_y; |
|
UWORD8 *pu1_top_mv_ctxt, *pu1_lft_mv_ctxt; |
|
WORD16 *pi2_mv; |
|
|
|
u1_sub_mb_x = (UWORD8)(u1_sub_mb & 0x03); |
|
u1_sub_mb_y = (UWORD8)(u1_sub_mb >> 2); |
|
pu1_top_mv_ctxt = &ps_dec->ps_curr_ctxt_mb_info->u1_mv[u1_sub_mb_x][u1_b2]; |
|
pu1_lft_mv_ctxt = &ps_dec->pu1_left_mv_ctxt_inc[u1_sub_mb_y][u1_b2]; |
|
pi2_mv = &ps_mv->i2_mv[u1_b2]; |
|
|
|
if(u1_dec_mvd) |
|
{ |
|
WORD16 i2_mv_x, i2_mv_y; |
|
WORD32 i2_temp; |
|
{ |
|
decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env; |
|
dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm; |
|
UWORD16 u2_abs_mvd_x_a, u2_abs_mvd_x_b, u2_abs_mvd_y_a, |
|
u2_abs_mvd_y_b; |
|
|
|
u2_abs_mvd_x_b = (UWORD16)pu1_top_mv_ctxt[0]; |
|
u2_abs_mvd_y_b = (UWORD16)pu1_top_mv_ctxt[1]; |
|
u2_abs_mvd_x_a = (UWORD16)pu1_lft_mv_ctxt[0]; |
|
u2_abs_mvd_y_a = (UWORD16)pu1_lft_mv_ctxt[1]; |
|
|
|
i2_temp = u2_abs_mvd_x_a + u2_abs_mvd_x_b; |
|
|
|
i2_mv_x = ih264d_parse_mvd_cabac(ps_bitstrm, ps_cab_env, |
|
ps_dec->p_mvd_x_t, i2_temp); |
|
|
|
i2_temp = u2_abs_mvd_y_a + u2_abs_mvd_y_b; |
|
|
|
i2_mv_y = ih264d_parse_mvd_cabac(ps_bitstrm, ps_cab_env, |
|
ps_dec->p_mvd_y_t, i2_temp); |
|
} |
|
|
|
/***********************************************************************/ |
|
/* Store the abs_mvd_values in cabac contexts */ |
|
/* The follownig code can be easily optimzed if mvX, mvY clip values */ |
|
/* are packed in 16 bits follwed by memcpy */ |
|
/***********************************************************************/ |
|
u1_abs_mvd_x = CLIP3(0, 127, ABS(i2_mv_x)); |
|
u1_abs_mvd_y = CLIP3(0, 127, ABS(i2_mv_y)); |
|
|
|
COPYTHECONTEXT("MVD", i2_mv_x);COPYTHECONTEXT("MVD", i2_mv_y); |
|
|
|
/* Storing Mv residuals */ |
|
pi2_mv[0] = i2_mv_x; |
|
pi2_mv[1] = i2_mv_y; |
|
} |
|
|
|
/***************************************************************/ |
|
/* Store abs_mvd_values cabac contexts */ |
|
/***************************************************************/ |
|
{ |
|
UWORD8 u1_i; |
|
for(u1_i = 0; u1_i < u1_part_wd; u1_i++, pu1_top_mv_ctxt += 4) |
|
{ |
|
pu1_top_mv_ctxt[0] = u1_abs_mvd_x; |
|
pu1_top_mv_ctxt[1] = u1_abs_mvd_y; |
|
} |
|
|
|
for(u1_i = 0; u1_i < u1_part_ht; u1_i++, pu1_lft_mv_ctxt += 4) |
|
{ |
|
pu1_lft_mv_ctxt[0] = u1_abs_mvd_x; |
|
pu1_lft_mv_ctxt[1] = u1_abs_mvd_y; |
|
} |
|
} |
|
} |
|
|
|
/*****************************************************************************/ |
|
/* */ |
|
/* Function Name : ih264d_parse_mvd_cabac */ |
|
/* */ |
|
/* Description : This cabac function decodes the mvd in a given direction */ |
|
/* direction ( x or y ) as defined in 9.3.2.3. */ |
|
/* */ |
|
/* Inputs : 1. pointer to Bitstream */ |
|
/* 2. pointer to cabac decoding environmnet */ |
|
/* 3. pointer to Mvd context */ |
|
/* 4. abs(Top mvd) = u2_abs_mvd_b */ |
|
/* 5. abs(left mvd)= u2_abs_mvd_a */ |
|
/* */ |
|
/* Processing : see section 9.3.2.3 of the standard */ |
|
/* */ |
|
/* Outputs : i2_mvd */ |
|
/* Returns : i2_mvd */ |
|
/* */ |
|
/* Issues : none */ |
|
/* */ |
|
/* Revision History: */ |
|
/* */ |
|
/* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
|
/* 16 06 2005 Jay Draft */ |
|
/* */ |
|
/*****************************************************************************/ |
|
WORD16 ih264d_parse_mvd_cabac(dec_bit_stream_t * ps_bitstrm, |
|
decoding_envirnoment_t * ps_cab_env, |
|
bin_ctxt_model_t * p_ctxt_mvd, |
|
UWORD32 i4_temp) |
|
|
|
{ |
|
WORD8 k; |
|
WORD16 i2_suf; |
|
WORD16 i2_mvd; |
|
UWORD16 u2_abs_mvd; |
|
UWORD32 u4_ctx_inc; |
|
UWORD32 u4_prefix; |
|
const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table; |
|
UWORD32 u4_code_int_range, u4_code_int_val_ofst; |
|
|
|
/* if mvd < 9 */ |
|
/* mvd = Prefix */ |
|
/* else */ |
|
/* mvd = Prefix + Suffix */ |
|
/* decode sign bit */ |
|
/* Prefix TU decoding Cmax =Ucoff and Suffix 3rd order Exp-Golomb */ |
|
|
|
u2_abs_mvd = (UWORD16)i4_temp; |
|
u4_ctx_inc = 1; |
|
|
|
if(u2_abs_mvd < 3) |
|
u4_ctx_inc = 0; |
|
else if(u2_abs_mvd > 32) |
|
u4_ctx_inc = 2; |
|
|
|
u4_ctx_inc = (u4_ctx_inc | 0x65430); |
|
|
|
/*inlining modified version of ih264d_decode_bins_unary*/ |
|
|
|
{ |
|
UWORD8 u1_max_bins = 9; |
|
UWORD32 u4_value; |
|
UWORD32 u4_symbol; |
|
bin_ctxt_model_t *ps_bin_ctxt; |
|
UWORD32 u4_ctx_Inc; |
|
|
|
u4_value = 0; |
|
u4_code_int_range = ps_cab_env->u4_code_int_range; |
|
u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst; |
|
|
|
do |
|
{ |
|
u4_ctx_Inc = u4_ctx_inc & 0xf; |
|
u4_ctx_inc = u4_ctx_inc >> 4; |
|
|
|
ps_bin_ctxt = p_ctxt_mvd + u4_ctx_Inc; |
|
|
|
DECODE_ONE_BIN_MACRO(ps_bin_ctxt, u4_code_int_range, |
|
u4_code_int_val_ofst, pu4_table, ps_bitstrm, |
|
u4_symbol) |
|
|
|
INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env); |
|
|
|
u4_value++; |
|
|
|
} |
|
while(u4_symbol && u4_value < 5); |
|
|
|
ps_bin_ctxt = p_ctxt_mvd + 6; |
|
|
|
if(u4_symbol && (u4_value < u1_max_bins)) |
|
{ |
|
|
|
do |
|
{ |
|
|
|
DECODE_ONE_BIN_MACRO(ps_bin_ctxt, u4_code_int_range, |
|
u4_code_int_val_ofst, pu4_table, |
|
ps_bitstrm, u4_symbol) |
|
|
|
INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env); |
|
u4_value++; |
|
} |
|
while(u4_symbol && (u4_value < u1_max_bins)); |
|
|
|
} |
|
|
|
ps_cab_env->u4_code_int_range = u4_code_int_range; |
|
ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst; |
|
u4_value = u4_value - 1 + u4_symbol; |
|
u4_prefix = (u4_value); |
|
} |
|
|
|
i2_mvd = u4_prefix; |
|
|
|
if(i2_mvd == 9) |
|
{ |
|
/* Read Suffix */ |
|
k = ih264d_decode_bypass_bins_unary(ps_cab_env, ps_bitstrm); |
|
i2_suf = (1 << k) - 1; |
|
k = k + 3; |
|
i2_suf = (i2_suf << 3); |
|
i2_mvd += i2_suf; |
|
i2_suf = ih264d_decode_bypass_bins(ps_cab_env, k, ps_bitstrm); |
|
i2_mvd += i2_suf; |
|
} |
|
/* Read Sign bit */ |
|
if(!i2_mvd) |
|
return (i2_mvd); |
|
|
|
else |
|
{ |
|
UWORD32 u4_code_int_val_ofst, u4_code_int_range; |
|
|
|
u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst; |
|
u4_code_int_range = ps_cab_env->u4_code_int_range; |
|
|
|
if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9) |
|
{ |
|
UWORD32 *pu4_buffer, u4_offset; |
|
|
|
pu4_buffer = ps_bitstrm->pu4_buffer; |
|
u4_offset = ps_bitstrm->u4_ofst; |
|
|
|
RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, |
|
u4_offset, pu4_buffer) |
|
ps_bitstrm->u4_ofst = u4_offset; |
|
} |
|
|
|
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_mvd = (-i2_mvd); |
|
} |
|
|
|
ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst; |
|
ps_cab_env->u4_code_int_range = u4_code_int_range; |
|
|
|
return (i2_mvd); |
|
|
|
} |
|
}
|
|
|