📄 cabac.c
字号:
//===== encode symbol =====
biari_encode_symbol (eep_dp, (short)cbp_bit, tex_ctx->bcbp_contexts[type2ctx_bcbp[type]]+ctx);
}
}
//===== position -> ctx for MAP =====
//--- zig-zag scan ----
const int pos2ctx_map8x8 [] = { 0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5,
4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9, 10, 9, 8, 7,
7, 6, 11, 12, 13, 11, 6, 7, 8, 9, 14, 10, 9, 8, 6, 11,
12, 13, 11, 6, 9, 14, 10, 9, 11, 12, 13, 11 ,14, 10, 12, 14}; // 15 CTX
const int pos2ctx_map8x4 [] = { 0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 9, 8, 6, 7, 8,
9, 10, 11, 9, 8, 6, 12, 8, 9, 10, 11, 9, 13, 13, 14, 14}; // 15 CTX
const int pos2ctx_map4x4 [] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14}; // 15 CTX
const int pos2ctx_map2x4c[] = { 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}; // 15 CTX
const int pos2ctx_map4x4c[] = { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2}; // 15 CTX
const int* pos2ctx_map [] = {pos2ctx_map4x4, pos2ctx_map4x4, pos2ctx_map8x8, pos2ctx_map8x4,
pos2ctx_map8x4, pos2ctx_map4x4, pos2ctx_map4x4, pos2ctx_map4x4,
pos2ctx_map2x4c, pos2ctx_map4x4c,
pos2ctx_map4x4, pos2ctx_map4x4, pos2ctx_map8x8,pos2ctx_map8x4,
pos2ctx_map8x4, pos2ctx_map4x4, //Cb component
pos2ctx_map4x4, pos2ctx_map4x4, pos2ctx_map8x8,pos2ctx_map8x4,
pos2ctx_map8x4,pos2ctx_map4x4}; //Cr component
//--- interlace scan ----
//Taken from ABT
static const int pos2ctx_map8x8i[] = { 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 4, 5,
6, 9, 10, 10, 8, 11, 12, 11, 9, 9, 10, 10, 8, 11, 12, 11,
9, 9, 10, 10, 8, 11, 12, 11, 9, 9, 10, 10, 8, 13, 13, 9,
9, 10, 10, 8, 13, 13, 9, 9, 10, 10, 14, 14, 14, 14, 14, 14}; // 15 CTX
static const int pos2ctx_map8x4i[] = { 0, 1, 2, 3, 4, 5, 6, 3, 4, 5, 6, 3, 4, 7, 6, 8,
9, 7, 6, 8, 9, 10, 11, 12, 12, 10, 11, 13, 13, 14, 14, 14}; // 15 CTX
static const int pos2ctx_map4x8i[] = { 0, 1, 1, 1, 2, 3, 3, 4, 4, 4, 5, 6, 2, 7, 7, 8,
8, 8, 5, 6, 9, 10, 10, 11, 11, 11, 12, 13, 13, 14, 14, 14}; // 15 CTX
static const int* pos2ctx_map_int[] = {pos2ctx_map4x4, pos2ctx_map4x4, pos2ctx_map8x8i,pos2ctx_map8x4i,
pos2ctx_map4x8i,pos2ctx_map4x4, pos2ctx_map4x4, pos2ctx_map4x4,
pos2ctx_map2x4c, pos2ctx_map4x4c,
//444_TEMP_NOTE: the followings are addded for the 4:4:4 common mode};
pos2ctx_map4x4, pos2ctx_map4x4, pos2ctx_map8x8i,pos2ctx_map8x4i,
pos2ctx_map8x4i,pos2ctx_map4x4, //Cb component
pos2ctx_map4x4, pos2ctx_map4x4, pos2ctx_map8x8i,pos2ctx_map8x4i,
pos2ctx_map8x4i,pos2ctx_map4x4}; //Cr component}
//===== position -> ctx for LAST =====
const int pos2ctx_last8x8 [] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8}; // 9 CTX
const int pos2ctx_last8x4 [] = { 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8}; // 9 CTX
const int pos2ctx_last4x4 [] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; // 15 CTX
const int pos2ctx_last2x4c[] = { 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}; // 15 CTX
const int pos2ctx_last4x4c[] = { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2}; // 15 CTX
const int* pos2ctx_last [] = {pos2ctx_last4x4, pos2ctx_last4x4, pos2ctx_last8x8, pos2ctx_last8x4,
pos2ctx_last8x4, pos2ctx_last4x4, pos2ctx_last4x4, pos2ctx_last4x4,
pos2ctx_last2x4c, pos2ctx_last4x4c,
pos2ctx_last4x4, pos2ctx_last4x4, pos2ctx_last8x8,pos2ctx_last8x4,
pos2ctx_last8x4, pos2ctx_last4x4, //Cb component
pos2ctx_last4x4, pos2ctx_last4x4, pos2ctx_last8x8,pos2ctx_last8x4,
pos2ctx_last8x4, pos2ctx_last4x4}; //Cr component
/*!
****************************************************************************
* \brief
* Write Significance MAP
****************************************************************************
*/
void write_significance_map (Macroblock* currMB, EncodingEnvironmentPtr eep_dp, int type, int coeff[], int coeff_ctr, TextureInfoContexts* tex_ctx)
{
int k;
unsigned short sig, last;
int k0 = 0;
int k1 = maxpos[type];
#if ENABLE_FIELD_CTX
int fld = ( img->structure!=FRAME || currMB->mb_field );
#else
int fld = 0;
#endif
BiContextTypePtr map_ctx = tex_ctx->map_contexts [fld][type2ctx_map [type]];
BiContextTypePtr last_ctx = tex_ctx->last_contexts[fld][type2ctx_last[type]];
if (!c1isdc[type])
{
k0++; k1++; coeff--;
}
if (!fld)
{
for (k=k0; k<k1; k++) // if last coeff is reached, it has to be significant
{
sig = (coeff[k] != 0);
biari_encode_symbol (eep_dp, sig, map_ctx + pos2ctx_map [type][k]);
if (sig)
{
last = (--coeff_ctr == 0);
biari_encode_symbol(eep_dp, last, last_ctx + pos2ctx_last[type][k]);
if (last)
return;
}
}
return;
}
else
{
for (k=k0; k<k1; k++) // if last coeff is reached, it has to be significant
{
sig = (coeff[k] != 0);
biari_encode_symbol (eep_dp, sig, map_ctx + pos2ctx_map_int [type][k]);
if (sig)
{
last = (--coeff_ctr == 0);
biari_encode_symbol(eep_dp, last, last_ctx + pos2ctx_last[type][k]);
if (last)
return;
}
}
}
}
/*!
****************************************************************************
* \brief
* Write Levels
****************************************************************************
*/
void write_significant_coefficients (Macroblock* currMB, EncodingEnvironmentPtr eep_dp, int type, int coeff[], TextureInfoContexts* tex_ctx)
{
int i;
int absLevel;
int ctx;
short sign;
short greater_one;
int c1 = 1;
int c2 = 0;
BiContextType *one_contexts = tex_ctx->one_contexts[type2ctx_one[type]];
BiContextType *abs_contexts = tex_ctx->abs_contexts[type2ctx_abs[type]];
for (i=maxpos[type]; i>=0; i--)
{
if (coeff[i]!=0)
{
if (coeff[i] > 0)
{
absLevel = coeff[i];
sign = 0;
}
else
{
absLevel = -coeff[i];
sign = 1;
}
greater_one = (absLevel > 1);
//--- if coefficient is one ---
ctx = imin(c1, 4);
biari_encode_symbol (eep_dp, greater_one, one_contexts + ctx);
if (greater_one)
{
ctx = imin(c2++, max_c2[type]);
unary_exp_golomb_level_encode(eep_dp, absLevel - 2, abs_contexts + ctx);
c1 = 0;
}
else if (c1)
{
c1++;
}
biari_encode_symbol_eq_prob (eep_dp, sign);
}
}
}
/*!
****************************************************************************
* \brief
* Write Block-Transform Coefficients
****************************************************************************
*/
void writeRunLevel_CABAC (Macroblock* currMB, SyntaxElement *se, DataPartition *dp)
{
EncodingEnvironmentPtr eep_dp = &(dp->ee_cabac);
int curr_len = arienco_bits_written(eep_dp);
static int coeff[64];
static int coeff_ctr = 0;
static int pos = 0;
//--- accumulate run-level information ---
if (se->value1 != 0)
{
pos += se->value2;
coeff[pos++] = se->value1;
coeff_ctr++;
}
else
{
TextureInfoContexts *tex_ctx = img->currentSlice->tex_ctx;
//===== encode CBP-BIT =====
if (coeff_ctr > 0)
{
write_and_store_CBP_block_bit (currMB, eep_dp, se->context, 1, tex_ctx);
//===== encode significance map =====
write_significance_map (currMB, eep_dp, se->context, coeff, coeff_ctr, tex_ctx);
//===== encode significant coefficients =====
write_significant_coefficients (currMB, eep_dp, se->context, coeff, tex_ctx);
}
else
write_and_store_CBP_block_bit (currMB, eep_dp, se->context, 0, tex_ctx);
//--- reset counters ---
pos = coeff_ctr = 0;
memset(coeff, 0 , 64 * sizeof(int));
}
dp->bitstream->write_flag = 1;
se->len = (arienco_bits_written(eep_dp) - curr_len);
CABAC_TRACE;
}
/*!
************************************************************************
* \brief
* Unary binarization and encoding of a symbol by using
* one or two distinct models for the first two and all
* remaining bins
*
************************************************************************/
void unary_bin_encode(EncodingEnvironmentPtr eep_dp,
unsigned int symbol,
BiContextTypePtr ctx,
int ctx_offset)
{
if (symbol==0)
{
biari_encode_symbol(eep_dp, 0, ctx );
return;
}
else
{
biari_encode_symbol(eep_dp, 1, ctx );
ctx += ctx_offset;
while ((--symbol) > 0)
biari_encode_symbol(eep_dp, 1, ctx);
biari_encode_symbol(eep_dp, 0, ctx);
}
}
/*!
************************************************************************
* \brief
* Unary binarization and encoding of a symbol by using
* one or two distinct models for the first two and all
* remaining bins; no terminating "0" for max_symbol
* (finite symbol alphabet)
************************************************************************
*/
void unary_bin_max_encode(EncodingEnvironmentPtr eep_dp,
unsigned int symbol,
BiContextTypePtr ctx,
int ctx_offset,
unsigned int max_symbol)
{
if (symbol==0)
{
biari_encode_symbol(eep_dp, 0, ctx );
return;
}
else
{
unsigned int l = symbol;
biari_encode_symbol(eep_dp, 1, ctx );
ctx += ctx_offset;
while ((--l)>0)
biari_encode_symbol(eep_dp, 1, ctx);
if (symbol < max_symbol)
biari_encode_symbol(eep_dp, 0, ctx);
}
}
/*!
************************************************************************
* \brief
* Exp Golomb binarization and encoding
************************************************************************
*/
void exp_golomb_encode_eq_prob( EncodingEnvironmentPtr eep_dp,
unsigned int symbol,
int k)
{
while(1)
{
if (symbol >= (unsigned int)(1<<k))
{
biari_encode_symbol_eq_prob(eep_dp, 1); //first unary part
symbol = symbol - (1<<k);
k++;
}
else
{
biari_encode_symbol_eq_prob(eep_dp, 0); //now terminated zero of unary part
while (k--) //next binary part
biari_encode_symbol_eq_prob(eep_dp, (signed short)((symbol>>k)&1));
break;
}
}
}
/*!
************************************************************************
* \brief
* Exp-Golomb for Level Encoding
*
************************************************************************/
void unary_exp_golomb_level_encode( EncodingEnvironmentPtr eep_dp,
unsigned int symbol,
BiContextTypePtr ctx)
{
if (symbol==0)
{
biari_encode_symbol(eep_dp, 0, ctx );
return;
}
else
{
unsigned int exp_start = 13; // 15-2 : 0,1 level decision always sent
unsigned int l=symbol;
unsigned int k = 1;
biari_encode_symbol(eep_dp, 1, ctx );
while (((--l)>0) && (++k <= exp_start))
biari_encode_symbol(eep_dp, 1, ctx);
if (symbol < exp_start)
biari_encode_symbol(eep_dp, 0, ctx);
else
exp_golomb_encode_eq_prob(eep_dp,symbol - exp_start, 0);
}
}
/*!
************************************************************************
* \brief
* Exp-Golomb for MV Encoding
*
************************************************************************/
void unary_exp_golomb_mv_encode(EncodingEnvironmentPtr eep_dp,
unsigned int symbol,
BiContextTypePtr ctx,
unsigned int max_bin)
{
if (symbol==0)
{
biari_encode_symbol(eep_dp, 0, ctx );
return;
}
else
{
unsigned int bin=1;
unsigned int exp_start = 8; // 9-1 : 0 mvd decision always sent
unsigned int l = symbol, k = 1;
biari_encode_symbol(eep_dp, 1, ctx++ );
while (((--l)>0) && (++k <= exp_start))
{
biari_encode_symbol(eep_dp, 1, ctx );
if ((++bin) == 2)
ctx++;
if (bin == max_bin)
ctx++;
}
if (symbol < exp_start)
biari_encode_symbol(eep_dp, 0, ctx);
else
exp_golomb_encode_eq_prob(eep_dp, symbol - exp_start, 3);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -