📄 cabac.c
字号:
currMB->cbp_bits |= (1<< bit );
currMB->cbp_bits |= (1<<(bit+4));
}
else
{
currMB->cbp_bits |= (1<<bit);
}
}
if (type!=LUMA_8x8)
{
//--- get bits from neighbouring blocks ---
if (j==0)
{
if (currMB->mb_available[0][1])
{
upper_bit = BIT_SET(currMB->mb_available[0][1]->cbp_bits,bit+ystep_back);
}
}
else
{
upper_bit = BIT_SET(currMB->cbp_bits,bit-ystep);
}
if (i==0)
{
if (currMB->mb_available[1][0])
{
left_bit = BIT_SET(currMB->mb_available[1][0]->cbp_bits,bit+xstep_back);
}
}
else
{
left_bit = BIT_SET(currMB->cbp_bits,bit-1);
}
ctx = 2*upper_bit+left_bit;
//===== encode symbol =====
biari_encode_symbol (eep_dp, (short)cbp_bit, img->currentSlice->tex_ctx->bcbp_contexts[type2ctx_bcbp[type]]+ctx);
}
}
//===== position -> ctx for MAP =====
//--- zig-zag scan ----
static 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
static 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
static const int pos2ctx_map4x4 [] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14}; // 15 CTX
static const int* pos2ctx_map [] = {pos2ctx_map4x4, pos2ctx_map4x4, pos2ctx_map8x8, pos2ctx_map8x4,
pos2ctx_map8x4, pos2ctx_map4x4, pos2ctx_map4x4, pos2ctx_map4x4};
//--- interlace scan ----
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};
//===== position -> ctx for LAST =====
static 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
static 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
static const int pos2ctx_last4x4 [] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; // 15 CTX
static const int* pos2ctx_last [] = {pos2ctx_last4x4, pos2ctx_last4x4, pos2ctx_last8x8, pos2ctx_last8x4,
pos2ctx_last8x4, pos2ctx_last4x4, pos2ctx_last4x4, pos2ctx_last4x4};
/*!
****************************************************************************
* \brief
* Write Significance MAP
****************************************************************************
*/
void write_significance_map (Macroblock* currMB, EncodingEnvironmentPtr eep_dp, int type, int coeff[], int coeff_ctr)
{
short k, sig, last;
int k0 = 0;
int k1 = maxpos[type]-1;
int fld = ( img->field_picture || ( mb_adaptive && img->field_mode ) );
BiContextTypePtr map_ctx = ( fld ? img->currentSlice->tex_ctx-> fld_map_contexts[type2ctx_map [type]]
: img->currentSlice->tex_ctx-> map_contexts[type2ctx_map [type]] );
BiContextTypePtr last_ctx = ( fld ? img->currentSlice->tex_ctx->fld_last_contexts[type2ctx_last[type]]
: img->currentSlice->tex_ctx-> last_contexts[type2ctx_last[type]] );
if (!c1isdc[type])
{
k0++; k1++; coeff--;
}
for (k=k0; k<k1; k++) // if last coeff is reached, it has to be significant
{
sig = (coeff[k]!=0 ? 1 : 0);
if (img->pstruct)
biari_encode_symbol (eep_dp, sig, map_ctx+pos2ctx_map_int [type][k]);
else
biari_encode_symbol (eep_dp, sig, map_ctx+pos2ctx_map [type][k]);
if (sig)
{
last = (--coeff_ctr==0 ? 1 : 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[])
{
int i;
int absLevel;
int ctx;
short sign;
short greater_one;
int c1 = 1;
int c2 = 0;
for (i=maxpos[type]-1; 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 ? 1 : 0);
//--- if coefficient is one ---
ctx = min(c1,4);
biari_encode_symbol (eep_dp, greater_one, img->currentSlice->tex_ctx->one_contexts[type2ctx_one[type]] + ctx);
if (greater_one)
{
ctx = min(c2,4);
unary_exp_golomb_level_encode(eep_dp, absLevel-2, img->currentSlice->tex_ctx->abs_contexts[type2ctx_abs[type]] + ctx);
c1 = 0;
c2++;
}
else if (c1)
{
c1++;
}
biari_encode_symbol_eq_prob (eep_dp, sign);
}
}
}
/*!
****************************************************************************
* \brief
* Write Block-Transform Coefficients
****************************************************************************
*/
void writeRunLevel2Buffer_CABAC (SyntaxElement *se, EncodingEnvironmentPtr eep_dp)
{
static int coeff[64];
static int coeff_ctr = 0;
static int pos = 0;
Macroblock* currMB = &img->mb_data[img->current_mb_nr];
int i;
//--- accumulate run-level information ---
if (se->value1 != 0)
{
for (i=0; i<se->value2; i++) coeff[pos++] = 0; coeff[pos++] = se->value1; coeff_ctr++;
return;
}
else
{
for (; pos<64; pos++) coeff[pos] = 0;
}
//===== encode CBP-BIT =====
write_and_store_CBP_block_bit (currMB, eep_dp, se->context, coeff_ctr>0?1:0);
if (coeff_ctr>0)
{
//===== encode significance map =====
write_significance_map (currMB, eep_dp, se->context, coeff, coeff_ctr);
//===== encode significant coefficients =====
write_significant_coefficients (currMB, eep_dp, se->context, coeff);
}
//--- reset counters ---
pos = coeff_ctr = 0;
}
/*!
************************************************************************
* \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)
{
unsigned int l;
BiContextTypePtr ictx;
if (symbol==0)
{
biari_encode_symbol(eep_dp, 0, ctx );
return;
}
else
{
biari_encode_symbol(eep_dp, 1, ctx );
l=symbol;
ictx=ctx+ctx_offset;
while ((--l)>0)
biari_encode_symbol(eep_dp, 1, ictx);
biari_encode_symbol(eep_dp, 0, ictx);
}
return;
}
/*!
************************************************************************
* \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)
{
unsigned int l;
BiContextTypePtr ictx;
if (symbol==0)
{
biari_encode_symbol(eep_dp, 0, ctx );
return;
}
else
{
biari_encode_symbol(eep_dp, 1, ctx );
l=symbol;
ictx=ctx+ctx_offset;
while ((--l)>0)
biari_encode_symbol(eep_dp, 1, ictx);
if (symbol<max_symbol)
biari_encode_symbol(eep_dp, 0, ictx);
}
return;
}
/*!
************************************************************************
* \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, (unsigned char)((symbol>>k)&1));
break;
}
}
return;
}
/*!
************************************************************************
* \brief
* Exp-Golomb for Level Encoding
*
************************************************************************/
void unary_exp_golomb_level_encode( EncodingEnvironmentPtr eep_dp,
unsigned int symbol,
BiContextTypePtr ctx)
{
unsigned int l,k;
unsigned int exp_start = 13; // 15-2 : 0,1 level decision always sent
if (symbol==0)
{
biari_encode_symbol(eep_dp, 0, ctx );
return;
}
else
{
biari_encode_symbol(eep_dp, 1, ctx );
l=symbol;
k=1;
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);
}
return;
}
/*!
************************************************************************
* \brief
* Exp-Golomb for MV Encoding
*
************************************************************************/
void unary_exp_golomb_mv_encode(EncodingEnvironmentPtr eep_dp,
unsigned int symbol,
BiContextTypePtr ctx,
unsigned int max_bin)
{
unsigned int l,k;
unsigned int bin=1;
BiContextTypePtr ictx=ctx;
unsigned int exp_start = 8; // 9-1 : 0 mvd decision always sent
if (symbol==0)
{
biari_encode_symbol(eep_dp, 0, ictx );
return;
}
else
{
biari_encode_symbol(eep_dp, 1, ictx );
l=symbol;
k=1;
ictx++;
while (((--l)>0) && (++k <= exp_start))
{
biari_encode_symbol(eep_dp, 1, ictx );
if ((++bin)==2) ictx++;
if (bin==max_bin) ictx++;
}
if (symbol < exp_start) biari_encode_symbol(eep_dp, 0, ictx);
else exp_golomb_encode_eq_prob(eep_dp,symbol-exp_start,3);
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -