📄 cabac.c
字号:
int type,
int coeff[])
{
int i, sig;
int coeff_ctr = 0;
int i0 = 0;
int i1 = maxpos[type];
int fld = ( img->structure!=FRAME || currMB->mb_field );
const byte **pos2ctx_Map = (fld) ? pos2ctx_map_int : pos2ctx_map;
TextureInfoContexts *tex_ctx = img->currentSlice->tex_ctx;
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])
{
i0++; i1++; coeff--;
}
for (i=i0; i < i1; i++) // if last coeff is reached, it has to be significant
{
//--- read significance symbol ---
sig = biari_decode_symbol (dep_dp, map_ctx + pos2ctx_Map [type][i]);
if (sig)
{
coeff[i] = 1;
coeff_ctr++;
//--- read last coefficient symbol ---
if (biari_decode_symbol (dep_dp, last_ctx + pos2ctx_last[type][i]))
{
memset(&coeff[i + 1], 0, (i1 - i) * sizeof(int));
i = i1;
}
}
else
{
coeff[i] = 0;
}
}
//--- last coefficient must be significant if no last symbol was received ---
if (i < i1 + 1)
{
coeff[i] = 1;
coeff_ctr++;
}
return coeff_ctr;
}
/*!
************************************************************************
* \brief
* Read Levels
************************************************************************
*/
void read_significant_coefficients (DecodingEnvironmentPtr dep_dp,
TextureInfoContexts *tex_ctx,
int type,
int coeff[])
{
int i, ctx;
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)
{
ctx = imin (c1,4);
coeff[i] += biari_decode_symbol (dep_dp, one_contexts + ctx);
if (coeff[i]==2)
{
ctx = imin (c2++, max_c2[type]);
coeff[i] += unary_exp_golomb_level_decode (dep_dp, abs_contexts + ctx);
c1=0;
}
else if (c1)
{
c1++;
}
if (biari_decode_symbol_eq_prob(dep_dp))
{
coeff[i] *= -1;
}
}
}
}
/*!
************************************************************************
* \brief
* Read Block-Transform Coefficients
************************************************************************
*/
void readRunLevel_CABAC (Macroblock *currMB,
SyntaxElement *se,
ImageParameters *img,
DecodingEnvironmentPtr dep_dp)
{
static int coeff[64]; // one more for EOB
static int coeff_ctr = -1;
static int pos = 0;
//--- read coefficients for whole block ---
if (coeff_ctr < 0)
{
//===== decode CBP-BIT =====
if ((coeff_ctr = read_and_store_CBP_block_bit (currMB, dep_dp, img, se->context) )!=0)
{
//===== decode significance map =====
coeff_ctr = read_significance_map (currMB, dep_dp, img, se->context, coeff);
//===== decode significant coefficients =====
read_significant_coefficients (dep_dp, img->currentSlice->tex_ctx, se->context, coeff);
}
}
//--- set run and level ---
if (coeff_ctr)
{
//--- set run and level (coefficient) ---
for (se->value2=0; coeff[pos]==0; pos++, se->value2++);
se->value1=coeff[pos++];
}
else
{
//--- set run and level (EOB) ---
se->value1 = se->value2 = 0;
}
//--- decrement coefficient counter and re-set position ---
if (coeff_ctr-- == 0) pos=0;
#if TRACE
fprintf(p_trace, "@%-6d %-53s %3d %3d\n",symbolCount++, se->tracestring, se->value1,se->value2);
fflush(p_trace);
#endif
}
/*!
************************************************************************
* \brief
* arithmetic decoding
************************************************************************
*/
int readSyntaxElement_CABAC(SyntaxElement *se, ImageParameters *img, DataPartition *this_dataPart)
{
Macroblock *currMB = &img->mb_data[img->current_mb_nr];
DecodingEnvironmentPtr dep_dp = &(this_dataPart->de_cabac);
int curr_len = arideco_bits_read(dep_dp);
// perform the actual decoding by calling the appropriate method
se->reading(currMB, se, img, dep_dp);
//read again and minus curr_len = arideco_bits_read(dep_dp); from above
se->len = (arideco_bits_read(dep_dp) - curr_len);
#if (TRACE==2)
fprintf(p_trace, "curr_len: %d\n",curr_len);
fprintf(p_trace, "se_len: %d\n",se->len);
#endif
return (se->len);
}
/*!
************************************************************************
* \brief
* decoding of unary binarization using one or 2 distinct
* models for the first and all remaining bins; no terminating
* "0" for max_symbol
***********************************************************************
*/
unsigned int unary_bin_max_decode(DecodingEnvironmentPtr dep_dp,
BiContextTypePtr ctx,
int ctx_offset,
unsigned int max_symbol)
{
unsigned int symbol = biari_decode_symbol(dep_dp, ctx );
if (symbol==0 || (max_symbol == 0))
return symbol;
else
{
unsigned int l;
ctx += ctx_offset;
symbol = 0;
do
{
l = biari_decode_symbol(dep_dp, ctx);
symbol++;
}
while( (l != 0) && (symbol < max_symbol) );
if ((l != 0) && (symbol == max_symbol))
symbol++;
return symbol;
}
}
/*!
************************************************************************
* \brief
* decoding of unary binarization using one or 2 distinct
* models for the first and all remaining bins
***********************************************************************
*/
unsigned int unary_bin_decode(DecodingEnvironmentPtr dep_dp,
BiContextTypePtr ctx,
int ctx_offset)
{
unsigned int symbol = biari_decode_symbol(dep_dp, ctx );
if (symbol == 0)
return 0;
else
{
unsigned int l;
ctx += ctx_offset;;
symbol = 0;
do
{
l=biari_decode_symbol(dep_dp, ctx);
symbol++;
}
while( l != 0 );
return symbol;
}
}
/*!
************************************************************************
* \brief
* finding end of a slice in case this is not the end of a frame
*
* Unsure whether the "correction" below actually solves an off-by-one
* problem or whether it introduces one in some cases :-( Anyway,
* with this change the bit stream format works with CABAC again.
* StW, 8.7.02
************************************************************************
*/
int cabac_startcode_follows(Slice *currSlice, int eos_bit)
{
static unsigned int bit;
if( eos_bit )
{
byte *partMap = assignSE2partition[currSlice->dp_mode];
DataPartition *dP = &(currSlice->partArr[partMap[SE_MBTYPE]]);
DecodingEnvironmentPtr dep_dp = &(dP->de_cabac);
bit = biari_decode_final (dep_dp); //GB
#if TRACE
fprintf(p_trace, "@%-6d %-63s (%3d)\n",symbolCount++, "end_of_slice_flag", bit);
fflush(p_trace);
#endif
}
else
{
bit = 0;
}
return (bit == 1 ? 1 : 0);
}
/*!
************************************************************************
* \brief
* Exp Golomb binarization and decoding of a symbol
* with prob. of 0.5
************************************************************************
*/
unsigned int exp_golomb_decode_eq_prob( DecodingEnvironmentPtr dep_dp,
int k)
{
unsigned int l;
int symbol = 0;
int binary_symbol = 0;
do
{
l = biari_decode_symbol_eq_prob(dep_dp);
if (l == 1)
{
symbol += (1<<k);
k++;
}
}
while (l!=0);
while (k--) //next binary part
if (biari_decode_symbol_eq_prob(dep_dp)==1)
binary_symbol |= (1<<k);
return (unsigned int) (symbol + binary_symbol);
}
/*!
************************************************************************
* \brief
* Exp-Golomb decoding for LEVELS
***********************************************************************
*/
unsigned int unary_exp_golomb_level_decode( DecodingEnvironmentPtr dep_dp,
BiContextTypePtr ctx)
{
unsigned int symbol = biari_decode_symbol(dep_dp, ctx );
if (symbol==0)
return 0;
else
{
unsigned int l, k = 1;
unsigned int exp_start = 13;
symbol=0;
do
{
l=biari_decode_symbol(dep_dp, ctx);
symbol++;
k++;
}
while((l != 0) && (k != exp_start));
if (l!=0)
symbol += exp_golomb_decode_eq_prob(dep_dp,0)+1;
return symbol;
}
}
/*!
************************************************************************
* \brief
* Exp-Golomb decoding for Motion Vectors
***********************************************************************
*/
unsigned int unary_exp_golomb_mv_decode(DecodingEnvironmentPtr dep_dp,
BiContextTypePtr ctx,
unsigned int max_bin)
{
unsigned int symbol = biari_decode_symbol(dep_dp, ctx );
if (symbol == 0)
return 0;
else
{
unsigned int exp_start = 8;
unsigned int l,k = 1;
unsigned int bin = 1;
symbol=0;
ctx++;
do
{
l=biari_decode_symbol(dep_dp, ctx);
if ((++bin)==2) ctx++;
if (bin==max_bin) ctx++;
symbol++;
k++;
}
while((l!=0) && (k!=exp_start));
if (l!=0)
symbol += exp_golomb_decode_eq_prob(dep_dp,3) + 1;
return symbol;
}
}
/*!
************************************************************************
* \brief
* Read I_PCM macroblock
************************************************************************
*/
void readIPCM_CABAC(struct datapartition *dP)
{
Bitstream* currStream = dP->bitstream;
DecodingEnvironmentPtr dep = &(dP->de_cabac);
byte *buf = currStream->streamBuffer;
int BitstreamLengthInBits = (dP->bitstream->bitstream_length << 3) + 7;
int val = 0;
int bits_read = 0;
int bitoffset, bitdepth;
int uv, i, j;
while (dep->DbitsLeft >= 8)
{
dep->Dvalue >>= 8;
dep->DbitsLeft -= 8;
(*dep->Dcodestrm_len)--;
}
bitoffset = (*dep->Dcodestrm_len) << 3;
// read luma values
bitdepth = img->bitdepth_luma;
for(i=0;i<MB_BLOCK_SIZE;i++)
{
for(j=0;j<MB_BLOCK_SIZE;j++)
{
bits_read += GetBits(buf, bitoffset, &val, BitstreamLengthInBits, bitdepth);
#if TRACE
tracebits2("pcm_byte luma", bitdepth, val);
#endif
img->cof[0][i][j] = val;
bitoffset += bitdepth;
}
}
// read chroma values
bitdepth = img->bitdepth_chroma;
if ((dec_picture->chroma_format_idc != YUV400) && !IS_INDEPENDENT(img))
{
for (uv=1; uv<3; uv++)
{
for(i=0;i<img->mb_cr_size_y;i++)
{
for(j=0;j<img->mb_cr_size_x;j++)
{
bits_read += GetBits(buf, bitoffset, &val, BitstreamLengthInBits, bitdepth);
#if TRACE
tracebits2("pcm_byte chroma", bitdepth, val);
#endif
img->cof[uv][i][j] = val;
bitoffset += bitdepth;
}
}
}
}
(*dep->Dcodestrm_len) += ( bits_read >> 3);
if (bits_read & 7)
{
(*dep->Dcodestrm_len)++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -