📄 cabac.c
字号:
}
se->value1 = curr_mb_type;
// if (curr_mb_type >= 23) printf(" stopx");
#if TRACE
fprintf(p_trace, "@%d %s\t\t\t%d\n",symbolCount++, se->tracestring, se->value1);
fflush(p_trace);
#endif
}
/*!
************************************************************************
* \brief
* This function is used to arithmetically decode a pair of
* intra prediction modes of a given MB.
************************************************************************
*/
void readIntraPredMode_CABAC( SyntaxElement *se,
struct inp_par *inp,
struct img_par *img,
DecodingEnvironmentPtr dep_dp)
{
TextureInfoContexts *ctx = img->currentSlice->tex_ctx;
int act_sym;
// use_most_probable_mode
act_sym = biari_decode_symbol(dep_dp, ctx->ipr_contexts);
// remaining_mode_selector
if (act_sym == 1)
se->value1 = -1;
else
{
se->value1 = 0;
se->value1 |= (biari_decode_symbol(dep_dp, ctx->ipr_contexts+1) );
se->value1 |= (biari_decode_symbol(dep_dp, ctx->ipr_contexts+1) << 1);
se->value1 |= (biari_decode_symbol(dep_dp, ctx->ipr_contexts+1) << 2);
}
#if TRACE
fprintf(p_trace, "@%d %s\t\t\t%d\n",symbolCount++, se->tracestring, se->value1);
fflush(p_trace);
#endif
}
/*!
************************************************************************
* \brief
* This function is used to arithmetically decode the reference
* parameter of a given MB.
************************************************************************
*/
void readRefFrame_CABAC( SyntaxElement *se,
struct inp_par *inp,
struct img_par *img,
DecodingEnvironmentPtr dep_dp)
{
MotionInfoContexts *ctx = img->currentSlice->mot_ctx;
Macroblock *currMB = &img->mb_data[img->current_mb_nr];
int addctx = 0;
int a, b;
int act_ctx;
int act_sym;
char** refframe_array = dec_picture->ref_idx[se->value2];
int b8a, b8b;
PixelPos block_a, block_b;
getLuma4x4Neighbour(img->current_mb_nr, img->subblock_x, img->subblock_y, -1, 0, &block_a);
getLuma4x4Neighbour(img->current_mb_nr, img->subblock_x, img->subblock_y, 0, -1, &block_b);
b8a=((block_a.x/2)%2)+2*((block_a.y/2)%2);
b8b=((block_b.x/2)%2)+2*((block_b.y/2)%2);
if (!block_b.available)
b=0;
else if ( (img->mb_data[block_b.mb_addr].mb_type==IPCM) || IS_DIRECT(&img->mb_data[block_b.mb_addr]) || (img->mb_data[block_b.mb_addr].b8mode[b8b]==0 && img->mb_data[block_b.mb_addr].b8pdir[b8b]==2))
b=0;
else
{
if (img->MbaffFrameFlag && (currMB->mb_field == 0) && (img->mb_data[block_b.mb_addr].mb_field == 1))
b = (refframe_array[block_b.pos_y][block_b.pos_x] > 1 ? 1 : 0);
else
b = (refframe_array[block_b.pos_y][block_b.pos_x] > 0 ? 1 : 0);
}
if (!block_a.available)
a=0;
else if ((img->mb_data[block_a.mb_addr].mb_type==IPCM) || IS_DIRECT(&img->mb_data[block_a.mb_addr]) || (img->mb_data[block_a.mb_addr].b8mode[b8a]==0 && img->mb_data[block_a.mb_addr].b8pdir[b8a]==2))
a=0;
else
{
if (img->MbaffFrameFlag && (currMB->mb_field == 0) && (img->mb_data[block_a.mb_addr].mb_field == 1))
a = (refframe_array[block_a.pos_y][block_a.pos_x] > 1 ? 1 : 0);
else
a = (refframe_array[block_a.pos_y][block_a.pos_x] > 0 ? 1 : 0);
}
act_ctx = a + 2*b;
se->context = act_ctx; // store context
act_sym = biari_decode_symbol(dep_dp,ctx->ref_no_contexts[addctx] + act_ctx );
if (act_sym != 0)
{
act_ctx = 4;
act_sym = unary_bin_decode(dep_dp,ctx->ref_no_contexts[addctx]+act_ctx,1);
act_sym++;
}
se->value1 = act_sym;
#if TRACE
fprintf(p_trace, "@%d %s\t\t\t%d \n",symbolCount++, se->tracestring, se->value1);
// fprintf(p_trace," c: %d :%d \n",ctx->ref_no_contexts[addctx][act_ctx].cum_freq[0],ctx->ref_no_contexts[addctx][act_ctx].cum_freq[1]);
fflush(p_trace);
#endif
}
/*!
************************************************************************
* \brief
* This function is used to arithmetically decode the delta qp
* of a given MB.
************************************************************************
*/
void readDquant_CABAC( SyntaxElement *se,
struct inp_par *inp,
struct img_par *img,
DecodingEnvironmentPtr dep_dp)
{
MotionInfoContexts *ctx = img->currentSlice->mot_ctx;
int act_ctx;
int act_sym;
int dquant;
act_ctx = ( (last_dquant != 0) ? 1 : 0);
act_sym = biari_decode_symbol(dep_dp,ctx->delta_qp_contexts + act_ctx );
if (act_sym != 0)
{
act_ctx = 2;
act_sym = unary_bin_decode(dep_dp,ctx->delta_qp_contexts+act_ctx,1);
act_sym++;
}
dquant = (act_sym+1)/2;
if((act_sym & 0x01)==0) // lsb is signed bit
dquant = -dquant;
se->value1 = dquant;
last_dquant = dquant;
#if TRACE
fprintf(p_trace, "@%d %s\t\t\t%d\n",symbolCount++, se->tracestring, se->value1);
fflush(p_trace);
#endif
}
/*!
************************************************************************
* \brief
* This function is used to arithmetically decode the coded
* block pattern of a given MB.
************************************************************************
*/
void readCBP_CABAC(SyntaxElement *se,
struct inp_par *inp,
struct img_par *img,
DecodingEnvironmentPtr dep_dp)
{
TextureInfoContexts *ctx = img->currentSlice->tex_ctx;
Macroblock *currMB = &img->mb_data[img->current_mb_nr];
int mb_x, mb_y;
int a, b;
int curr_cbp_ctx, curr_cbp_idx;
int cbp = 0;
int cbp_bit;
int mask;
PixelPos block_a;
// coding of luma part (bit by bit)
for (mb_y=0; mb_y < 4; mb_y += 2)
{
for (mb_x=0; mb_x < 4; mb_x += 2)
{
if (currMB->b8mode[mb_y+(mb_x/2)]==IBLOCK)
curr_cbp_idx = 0;
else
curr_cbp_idx = 1;
if (mb_y == 0)
{
if (currMB->mb_available_up == NULL)
b = 0;
else
{
if((currMB->mb_available_up)->mb_type==IPCM)
b=0;
else
b = (( ((currMB->mb_available_up)->cbp & (1<<(2+mb_x/2))) == 0) ? 1 : 0);
}
}
else
b = ( ((cbp & (1<<(mb_x/2))) == 0) ? 1: 0);
if (mb_x == 0)
{
getLuma4x4Neighbour(img->current_mb_nr, mb_x, mb_y, -1, 0, &block_a);
if (block_a.available)
{
{
if(img->mb_data[block_a.mb_addr].mb_type==IPCM)
a=0;
else
a = (( (img->mb_data[block_a.mb_addr].cbp & (1<<(2*(block_a.y/2)+1))) == 0) ? 1 : 0);
}
}
else
a=0;
}
else
a = ( ((cbp & (1<<mb_y)) == 0) ? 1: 0);
curr_cbp_ctx = a+2*b;
mask = (1<<(mb_y+mb_x/2));
cbp_bit = biari_decode_symbol(dep_dp, ctx->cbp_contexts[0] + curr_cbp_ctx );
if (cbp_bit) cbp += mask;
}
}
if (dec_picture->chroma_format_idc != YUV400)
{
// coding of chroma part
// CABAC decoding for BinIdx 0
b = 0;
if (currMB->mb_available_up != NULL)
{
if((currMB->mb_available_up)->mb_type==IPCM)
b=1;
else
b = ((currMB->mb_available_up)->cbp > 15) ? 1 : 0;
}
a = 0;
if (currMB->mb_available_left != NULL)
{
if((currMB->mb_available_left)->mb_type==IPCM)
a=1;
else
a = ((currMB->mb_available_left)->cbp > 15) ? 1 : 0;
}
curr_cbp_ctx = a+2*b;
cbp_bit = biari_decode_symbol(dep_dp, ctx->cbp_contexts[1] + curr_cbp_ctx );
// CABAC decoding for BinIdx 1
if (cbp_bit) // set the chroma bits
{
b = 0;
if (currMB->mb_available_up != NULL)
{
if((currMB->mb_available_up)->mb_type==IPCM)
b=1;
else
if ((currMB->mb_available_up)->cbp > 15)
b = (( ((currMB->mb_available_up)->cbp >> 4) == 2) ? 1 : 0);
}
a = 0;
if (currMB->mb_available_left != NULL)
{
if((currMB->mb_available_left)->mb_type==IPCM)
a=1;
else
if ((currMB->mb_available_left)->cbp > 15)
a = (( ((currMB->mb_available_left)->cbp >> 4) == 2) ? 1 : 0);
}
curr_cbp_ctx = a+2*b;
cbp_bit = biari_decode_symbol(dep_dp, ctx->cbp_contexts[2] + curr_cbp_ctx );
cbp += (cbp_bit == 1) ? 32 : 16;
}
}
se->value1 = cbp;
if (!cbp)
{
last_dquant=0;
}
#if TRACE
fprintf(p_trace, "@%d %s\t\t\t%d\n",symbolCount++, se->tracestring, se->value1);
fflush(p_trace);
#endif
}
/*!
************************************************************************
* \brief
* This function is used to arithmetically decode the chroma
* intra prediction mode of a given MB.
************************************************************************
*/ //GB
void readCIPredMode_CABAC(SyntaxElement *se,
struct inp_par *inp,
struct img_par *img,
DecodingEnvironmentPtr dep_dp)
{
TextureInfoContexts *ctx = img->currentSlice->tex_ctx;
Macroblock *currMB = &img->mb_data[img->current_mb_nr];
int act_ctx,a,b;
int act_sym = se->value1;
if (currMB->mb_available_up == NULL) b = 0;
else
{
if( (currMB->mb_available_up)->mb_type==IPCM)
b=0;
else
b = ( ((currMB->mb_available_up)->c_ipred_mode != 0) ? 1 : 0);
}
if (currMB->mb_available_left == NULL) a = 0;
else
{
if( (currMB->mb_available_left)->mb_type==IPCM)
a=0;
else
a = ( ((currMB->mb_available_left)->c_ipred_mode != 0) ? 1 : 0);
}
act_ctx = a+b;
act_sym = biari_decode_symbol(dep_dp, ctx->cipr_contexts + act_ctx );
if (act_sym!=0)
act_sym = unary_bin_max_decode(dep_dp,ctx->cipr_contexts+3,0,2)+1;
se->value1 = act_sym;
#if TRACE
fprintf(p_trace, "@%d %s\t\t\t%d\n",symbolCount++, se->tracestring, se->value1);
fflush(p_trace);
#endif
}
#ifdef USE_INTRA_MDDT
static const int maxpos [] = {16, 15, 64, 32, 32, 16, 4, 15, 8, 16, 256};
static const int c1isdc [] = { 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1};
#else
static const int maxpos [] = {16, 15, 64, 32, 32, 16, 4, 15, 8, 16};
static const int c1isdc [] = { 1, 0, 1, 1, 1, 1, 1, 0, 1, 1};
#endif
static const int type2ctx_bcbp[] = { 0, 1, 2, 2, 3, 4, 5, 6, 5, 5}; // 7
#ifndef USE_INTRA_MDDT
static const int type2ctx_map [] = { 0, 1, 2, 3, 4, 5, 6, 7, 6, 6}; // 8
static const int type2ctx_last[] = { 0, 1, 2, 3, 4, 5, 6, 7, 6, 6}; // 8
static const int type2ctx_one [] = { 0, 1, 2, 3, 3, 4, 5, 6, 5, 5}; // 7
static const int type2ctx_abs [] = { 0, 1, 2, 3, 3, 4, 5, 6, 5, 5}; // 7
static const int max_c2 [] = { 4, 4, 4, 4, 4, 4, 3, 4, 3, 3}; // 9
#else
static const int type2ctx_map [] = { 0, 1, 2, 3, 4, 5, 6, 7, 6, 6, 8}; // 9
static const int type2ctx_last[] = { 0, 1, 2, 3, 4, 5, 6, 7, 6, 6, 8}; // 9
static const int type2ctx_one [] = { 0, 1, 2, 3, 3, 4, 5, 6, 5, 5, 7}; // 8
static const int type2ctx_abs [] = { 0, 1, 2, 3, 3, 4, 5, 6, 5, 5, 7}; // 8
static const int max_c2 [] = { 4, 4, 4, 4, 4, 4, 3, 4, 3, 3, 4}; // 9
/*!
*************************************************************************************
* \brief
* Set coded-block-pattern bits for INTRA16x16 MB
*
* \para set_CBP_block_bit_16x16()
* <paragraph>
*
* \author
* - Yan Ye <yye@qualcomm.com>
*************************************************************************************
*/
int set_CBP_block_bit_16x16 (Macroblock *currMB)
{
int bit = 1;
//--- set bits for current block ---
for(bit = 1; bit < 17; bit++)
{
currMB->cbp_bits |= ((int64)1<< bit );
}
return 1;
}
#endif
/*!
************************************************************************
* \brief
* Read CBP4-BIT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -