Cabac optimizations
Optimized cabac functions for writing bypass bins. Removed unused return from cabac flush function. Removed the macro REV_NBITS. Bug: 22860270 Change-Id: Iece82797f2f45a35281817a2b77a7c7fe4e02bd1
This commit is contained in:
parent
eddf6a33fe
commit
0574be65f4
3 changed files with 29 additions and 72 deletions
|
|
@ -111,30 +111,29 @@
|
|||
*
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
UWORD32 ih264e_cabac_UEGk0_binarization(WORD16 i2_sufs, WORD8 *pi1_bins_len)
|
||||
{
|
||||
UWORD32 u4_bins;
|
||||
WORD32 i4_len;
|
||||
WORD16 x, y;
|
||||
WORD32 unary_length;
|
||||
UWORD32 u4_sufs_shiftk_plus1, u4_egk, u4_unary_bins;
|
||||
|
||||
x = i2_sufs + 1;
|
||||
i4_len = CLZ(x);
|
||||
i4_len = 31 - i4_len;
|
||||
y = 1 << i4_len;
|
||||
y = y - 1;
|
||||
i2_sufs = i2_sufs - y;
|
||||
u4_bins = y << 1;
|
||||
u4_bins = u4_bins << i4_len;
|
||||
u4_bins = u4_bins + i2_sufs;
|
||||
u4_sufs_shiftk_plus1 = i2_sufs + 1;
|
||||
|
||||
REV(u4_bins, u4_bins);
|
||||
u4_bins = u4_bins >> (31 - 2 * i4_len);
|
||||
(*pi1_bins_len) = 2 * i4_len + 1;
|
||||
unary_length = (32 - CLZ(u4_sufs_shiftk_plus1) + (0 == u4_sufs_shiftk_plus1));
|
||||
|
||||
return (u4_bins);
|
||||
/* unary code with (unary_length-1) '1's and terminating '0' bin */
|
||||
u4_unary_bins = (1 << unary_length) - 2;
|
||||
|
||||
/* insert the symbol prefix of (unary length - 1) bins */
|
||||
u4_egk = (u4_unary_bins << (unary_length - 1))
|
||||
| (u4_sufs_shiftk_plus1 & ((1 << (unary_length - 1)) - 1));
|
||||
|
||||
/* length of the code = 2 *(unary_length - 1) + 1 + k */
|
||||
*pi1_bins_len = (2 * unary_length) - 1;
|
||||
|
||||
return (u4_egk);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*******************************************************************************
|
||||
*
|
||||
|
|
@ -236,14 +235,14 @@ void ih264e_get_cabac_context(entropy_ctxt_t *ps_ent_ctxt, WORD32 u4_mb_type)
|
|||
* @param[in] ps_cabac_ctxt
|
||||
* pointer to cabac context (handle)
|
||||
*
|
||||
* @returns success or failure error code
|
||||
* @returns none
|
||||
*
|
||||
* @remarks
|
||||
* None
|
||||
*
|
||||
*******************************************************************************
|
||||
*/
|
||||
WORD32 ih264e_cabac_flush(cabac_ctxt_t *ps_cabac_ctxt)
|
||||
void ih264e_cabac_flush(cabac_ctxt_t *ps_cabac_ctxt)
|
||||
{
|
||||
|
||||
/* bit stream ptr */
|
||||
|
|
@ -267,17 +266,6 @@ WORD32 ih264e_cabac_flush(cabac_ctxt_t *ps_cabac_ctxt)
|
|||
WORD32 bits_left;
|
||||
WORD32 rem_bits;
|
||||
|
||||
/*********************************************************************/
|
||||
/* Bitstream overflow check */
|
||||
/* NOTE: corner case of epb bytes (max 2 for 32bit word) not handled */
|
||||
/*********************************************************************/
|
||||
if ((u4_strm_buf_offset + u4_out_standing_bytes + 1)
|
||||
>= ps_stream->u4_max_strm_size)
|
||||
{
|
||||
/* return without corrupting the buffer beyond its size */
|
||||
return (IH264E_BITSTREAM_BUFFER_OVERFLOW);
|
||||
}
|
||||
|
||||
if (carry)
|
||||
{
|
||||
/* CORNER CASE: if the previous data is 0x000003, then EPB will be inserted
|
||||
|
|
@ -336,7 +324,6 @@ WORD32 ih264e_cabac_flush(cabac_ctxt_t *ps_cabac_ctxt)
|
|||
ps_stream->u4_cur_word = 0;
|
||||
ps_stream->i4_bits_left_in_cw = WORD_SIZE;
|
||||
|
||||
return (IH264E_SUCCESS);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -763,7 +750,6 @@ void ih264e_cabac_encode_bypass_bins(cabac_ctxt_t *ps_cabac, UWORD32 u4_bins,
|
|||
|
||||
UWORD32 u4_range = ps_cab_enc_env->u4_code_int_range;
|
||||
WORD32 next_byte;
|
||||
UWORD32 rev_next_byte;
|
||||
|
||||
/* Sanity checks */
|
||||
ASSERT((num_bins < 33) && (num_bins > 0));
|
||||
|
|
@ -777,14 +763,11 @@ void ih264e_cabac_encode_bypass_bins(cabac_ctxt_t *ps_cabac, UWORD32 u4_bins,
|
|||
{
|
||||
num_bins -= 8;
|
||||
|
||||
/* extract the leading 8 bins */
|
||||
next_byte = (u4_bins) & 0xff;
|
||||
u4_bins >>= 8;
|
||||
REV_NBITS(next_byte, 8, rev_next_byte);
|
||||
next_byte = (u4_bins >> (num_bins)) & 0xff;
|
||||
|
||||
/* L = (L << 8) + (R * next_byte) */
|
||||
ps_cab_enc_env->u4_code_int_low <<= 8;
|
||||
ps_cab_enc_env->u4_code_int_low += (rev_next_byte * u4_range);
|
||||
ps_cab_enc_env->u4_code_int_low += (next_byte * u4_range);
|
||||
ps_cab_enc_env->u4_bits_gen += 8;
|
||||
|
||||
if (ps_cab_enc_env->u4_bits_gen > CABAC_BITS)
|
||||
|
|
@ -797,10 +780,8 @@ void ih264e_cabac_encode_bypass_bins(cabac_ctxt_t *ps_cabac, UWORD32 u4_bins,
|
|||
/* Update low with remaining bins and return */
|
||||
next_byte = (u4_bins & ((1 << num_bins) - 1));
|
||||
|
||||
REV_NBITS(next_byte, num_bins, rev_next_byte);
|
||||
|
||||
ps_cab_enc_env->u4_code_int_low <<= num_bins;
|
||||
ps_cab_enc_env->u4_code_int_low += (rev_next_byte * u4_range);
|
||||
ps_cab_enc_env->u4_code_int_low += (next_byte * u4_range);
|
||||
ps_cab_enc_env->u4_bits_gen += num_bins;
|
||||
|
||||
if (ps_cab_enc_env->u4_bits_gen > CABAC_BITS)
|
||||
|
|
@ -810,10 +791,3 @@ void ih264e_cabac_encode_bypass_bins(cabac_ctxt_t *ps_cabac, UWORD32 u4_bins,
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -47,24 +47,6 @@
|
|||
#define CABAC_BITS 9
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @macro Count number of bits set
|
||||
******************************************************************************
|
||||
*/
|
||||
#define REV_NBITS(word, size, rev_word) \
|
||||
{ \
|
||||
WORD32 i; \
|
||||
rev_word = 0; \
|
||||
for (i = 0; i < (size); i++) \
|
||||
{ \
|
||||
UWORD32 bit = ((word) >> i) & 1; \
|
||||
rev_word += (1 << ((size) - i - 1)) * bit; \
|
||||
} \
|
||||
} \
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @macro Reverse bits in an unsigned integer
|
||||
|
|
@ -201,14 +183,14 @@ void ih264e_get_cabac_context(entropy_ctxt_t *ps_ent_ctxt, WORD32 u4_mb_type);
|
|||
* @param[in] ps_cabac_ctxt
|
||||
* pointer to cabac context (handle)
|
||||
*
|
||||
* @returns success or failure error code
|
||||
* @returns none
|
||||
*
|
||||
* @remarks
|
||||
* None
|
||||
*
|
||||
*******************************************************************************
|
||||
*/
|
||||
WORD32 ih264e_cabac_flush(cabac_ctxt_t *ps_cabac_ctxt);
|
||||
void ih264e_cabac_flush(cabac_ctxt_t *ps_cabac_ctxt);
|
||||
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -856,7 +856,7 @@ static void ih264e_cabac_write_coeff4x4(WORD16 *pi2_res_block, UWORD8 u1_nnz,
|
|||
}
|
||||
/* encode coeff_sign_flag[i] */
|
||||
u1_sign = ((*pi16_coeffs) < 0) ? 1 : 0;
|
||||
ih264e_cabac_encode_bypass_bins(ps_cabac_ctxt, u1_sign, 1);
|
||||
ih264e_cabac_encode_bypass_bin(ps_cabac_ctxt, u1_sign);
|
||||
i = CLZ(u4_sig_coeff);
|
||||
i = 31 - i;
|
||||
pi16_coeffs--;
|
||||
|
|
@ -1375,7 +1375,7 @@ static void ih264e_cabac_enc_ctx_mvd(WORD16 u1_mvd, UWORD32 u4_ctx_idx_offset,
|
|||
{
|
||||
if (i2_sufs >= (1 << k))
|
||||
{
|
||||
u4_bins = (u4_bins | (1 << i1_bins_len));
|
||||
u4_bins = (u4_bins | (1 << (31 - i1_bins_len)));
|
||||
i1_bins_len++;
|
||||
i2_sufs = i2_sufs - (1 << k);
|
||||
k++;
|
||||
|
|
@ -1386,12 +1386,13 @@ static void ih264e_cabac_enc_ctx_mvd(WORD16 u1_mvd, UWORD32 u4_ctx_idx_offset,
|
|||
while (k--)
|
||||
{
|
||||
u1_bin = ((i2_sufs >> k) & 0x01);
|
||||
u4_bins = (u4_bins | (u1_bin << i1_bins_len));
|
||||
u4_bins = (u4_bins | (u1_bin << (31 - i1_bins_len)));
|
||||
i1_bins_len++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
u4_bins >>= (32 - i1_bins_len);
|
||||
ih264e_cabac_encode_bypass_bins(ps_cabac_ctxt, u4_bins,
|
||||
i1_bins_len);
|
||||
}
|
||||
|
|
@ -1428,9 +1429,9 @@ static void ih264e_cabac_enc_ctx_mvd(WORD16 u1_mvd, UWORD32 u4_ctx_idx_offset,
|
|||
}
|
||||
/* sign bit, uses EncodeBypass */
|
||||
if (u1_mvd > 0)
|
||||
ih264e_cabac_encode_bypass_bins(ps_cabac_ctxt, 0, 1);
|
||||
ih264e_cabac_encode_bypass_bin(ps_cabac_ctxt, 0);
|
||||
else
|
||||
ih264e_cabac_encode_bypass_bins(ps_cabac_ctxt, 1, 1);
|
||||
ih264e_cabac_encode_bypass_bin(ps_cabac_ctxt, 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue