📄 cabac.c
字号:
act_sym += mode_sym*2;
mode_sym = biari_decode_symbol(dep_dp, ctx->mb_type_contexts[1] + act_ctx );
act_sym += mode_sym;
curr_mb_type = act_sym;
}
}
se->value1 = curr_mb_type;
#if TRACE
fprintf(p_trace, "@%d%s\t\t\t%d",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 readIntraPredModeFromBuffer_CABAC( SyntaxElement *se,
struct inp_par *inp,
struct img_par *img,
DecodingEnvironmentPtr dep_dp)
{
static const int right[8] = {0, 0, 1, 1, 0, 0, 1, 1};
Macroblock *currMB = &(img->mb_data[img->current_mb_nr]);
TextureInfoContexts *ctx = img->currentSlice->tex_ctx;
int prev_sym;
//--- first symbol ---
if (right[se->context/2]) prev_sym = currMB->intra_pred_modes[se->context-3];
else if (currMB->mb_available[1][0]) prev_sym = currMB->mb_available[1][0]->intra_pred_modes[se->context+5];
else prev_sym = 0;
#ifndef USE_6_INTRA_MODES
se->value1 = unary_bin_max_decode(dep_dp,ctx->ipr_contexts[prev_sym],1,8);
#else
se->value1 = unary_bin_max_decode(dep_dp,ctx->ipr_contexts[prev_sym],1,5);
#endif
//--- second symbol ---
prev_sym = se->value1;
#ifndef USE_6_INTRA_MODES
se->value2 = unary_bin_max_decode(dep_dp,ctx->ipr_contexts[prev_sym],1,8);
#else
se->value2 = unary_bin_max_decode(dep_dp,ctx->ipr_contexts[prev_sym],1,5);
#endif
#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 readRefFrameFromBuffer_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 = se->context;
int a, b;
int act_ctx;
int act_sym;
int** refframe_array = ((img->type==B_IMG_1 || img->type==B_IMG_MULT) ? img->fw_refFrArr : refFrArr);
if (currMB->mb_available[0][1] == NULL)
b = 0;
else
b = (refframe_array[img->block_y+img->subblock_y-1][img->block_x+img->subblock_x] > 0 ? 1 : 0);
if (currMB->mb_available[1][0] == NULL)
a = 0;
else
a = (refframe_array[img->block_y+img->subblock_y][img->block_x+img->subblock_x-1] > 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",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 motion
* vector data of a given MB.
************************************************************************
*/
void readMVDFromBuffer_CABAC(SyntaxElement *se,
struct inp_par *inp,
struct img_par *img,
DecodingEnvironmentPtr dep_dp)
{
int i = img->subblock_x;
int j = img->subblock_y;
int a, b;
int act_ctx;
int act_sym;
int mv_pred_res;
int mv_local_err;
int mv_sign;
int k = se->value2; // MVD component
MotionInfoContexts *ctx = img->currentSlice->mot_ctx;
Macroblock *currMB = &img->mb_data[img->current_mb_nr];
if (j==0)
{
if (currMB->mb_available[0][1] == NULL)
b = 0;
else
b = absm((currMB->mb_available[0][1])->mvd[0][BLOCK_SIZE-1][i][k]);
}
else
b = absm(currMB->mvd[0][j-1/*step_v*/][i][k]);
if (i==0)
{
if (currMB->mb_available[1][0] == NULL)
a = 0;
else
a = absm((currMB->mb_available[1][0])->mvd[0][j][BLOCK_SIZE-1][k]);
}
else
a = absm(currMB->mvd[0][j][i-1/*step_h*/][k]);
if ((mv_local_err=a+b)<3)
act_ctx = 5*k;
else
{
if (mv_local_err>32)
act_ctx=5*k+3;
else
act_ctx=5*k+2;
}
se->context = act_ctx;
act_sym = biari_decode_symbol(dep_dp, &ctx->mv_res_contexts[0][act_ctx] );
if (act_sym == 0)
{
mv_pred_res = 0;
}
else
{
act_ctx=5*k+4;
mv_sign = biari_decode_symbol(dep_dp,&ctx->mv_res_contexts[1][act_ctx] );
act_ctx=5*k;
act_sym = unary_mv_decode(dep_dp,ctx->mv_res_contexts[1]+act_ctx,3);
act_sym++;
mv_pred_res = ((mv_sign != 0) ? (-act_sym) : act_sym);
}
se->value1 = mv_pred_res;
#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 delta qp
* of a given MB.
************************************************************************
*/
void readDquant_inter_FromBuffer_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 act_ctx;
int act_sym;
int dquant;
if (currMB->mb_available[1][0] == NULL)
act_ctx = 0;
else
act_ctx = ( ((currMB->mb_available[1][0])->delta_quant != 0) ? 1 : 0);
act_sym = biari_decode_symbol(dep_dp,ctx->delta_qp_inter_contexts + act_ctx );
if (act_sym != 0)
{
act_ctx = 2;
act_sym = unary_bin_decode(dep_dp,ctx->delta_qp_inter_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;
#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 delta qp
* of a given MB.
************************************************************************
*/
void readDquant_intra_FromBuffer_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 act_ctx;
int act_sym;
int dquant;
if (currMB->mb_available[1][0] == NULL)
act_ctx = 0;
else
act_ctx = ( ((currMB->mb_available[1][0])->delta_quant != 0) ? 1 : 0);
act_sym = biari_decode_symbol(dep_dp,ctx->delta_qp_intra_contexts + act_ctx );
if (act_sym != 0)
{
act_ctx = 2;
act_sym = unary_bin_decode(dep_dp,ctx->delta_qp_intra_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;
#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 readCBPFromBuffer_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;
// 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[0][1] == NULL)
b = 0;
else
b = (( ((currMB->mb_available[0][1])->cbp & (1<<(2+mb_x/2))) == 0) ? 1 : 0);
}
else
b = ( ((cbp & (1<<(mb_x/2))) == 0) ? 1: 0);
if (mb_x == 0)
{
if (currMB->mb_available[1][0] == NULL)
a = 0;
else
a = (( ((currMB->mb_available[1][0])->cbp & (1<<(mb_y+1))) == 0) ? 1 : 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[curr_cbp_idx][0] + curr_cbp_ctx );
if (cbp_bit) cbp += mask;
}
}
if ( se->type == SE_CBP_INTRA )
curr_cbp_idx = 0;
else
curr_cbp_idx = 1;
// coding of chroma part
b = 0;
if (currMB->mb_available[0][1] != NULL)
b = ((currMB->mb_available[0][1])->cbp > 15) ? 1 : 0;
a = 0;
if (currMB->mb_available[1][0] != NULL)
a = ((currMB->mb_available[1][0])->cbp > 15) ? 1 : 0;
curr_cbp_ctx = a+2*b;
cbp_bit = biari_decode_symbol(dep_dp, ctx->cbp_contexts[curr_cbp_idx][1] + curr_cbp_ctx );
if (cbp_bit) // set the chroma bits
{
b = 0;
if (currMB->mb_available[0][1] != NULL)
if ((currMB->mb_available[0][1])->cbp > 15)
b = (( ((currMB->mb_available[0][1])->cbp >> 4) == 2) ? 1 : 0);
a = 0;
if (currMB->mb_available[1][0] != NULL)
if ((currMB->mb_available[1][0])->cbp > 15)
a = (( ((currMB->mb_available[1][0])->cbp >> 4) == 2) ? 1 : 0);
curr_cbp_ctx = a+2*b;
cbp_bit = biari_decode_symbol(dep_dp, ctx->cbp_contexts[curr_cbp_idx][2] + curr_cbp_ctx );
cbp += (cbp_bit == 1) ? 32 : 16;
}
se->value1 = cbp;
#if TRACE
fprintf(p_trace, "@%d %s\t\t\t%d",symbolCount++, se->tracestring, se->value1);
fflush(p_trace);
#endif
}
/*!
************************************************************************
* \brief
* This function is used to arithmetically decode coeff_count,level and
* run of a given MB.
************************************************************************
*/
void readRunLevelFromBuffer_CABAC (SyntaxElement *se,
struct inp_par *inp,
struct img_par *img,
DecodingEnvironmentPtr dep_dp)
{
int level;
int run=0;
const int curr_ctx_idx = se->context;
int curr_level_ctx, curr_run_ctx;
int sign_of_level;
static int max_run;
static int coeff_count=0;
int act_ctx=0;
int i,j, a,b;
static int send_eob = 0;
static int coeff_count_all = 0;
int max_coeff[9] = {8,16,16,16,15,4,4,15,15};
static int prev_sym[3] = {0,0,0};
static int count[3] = {0,0,0};
static int prevLevel = 0;
int changed_ctx_idx;
TextureInfoContexts *ctx = img->currentSlice->tex_ctx;
Macroblock *currMB = &img->mb_data[img->current_mb_nr];
if ((coeff_count == 0) && !send_eob)// get number of coeff.
{
switch(curr_ctx_idx)
{
case 0://max 8 coeffs, double_scan
{
//context determination
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -