📄 cabac.c
字号:
break;
}
}
else //===== B-FRAME =====
{
if (act_sym==0)
{
biari_encode_symbol (eep_dp, 0, &ctx->b8_type_contexts[1][0]);
return;
}
else
{
biari_encode_symbol (eep_dp, 1, &ctx->b8_type_contexts[1][0]);
act_sym--;
}
if (act_sym<2)
{
biari_encode_symbol (eep_dp, 0, &ctx->b8_type_contexts[1][1]);
if (act_sym==0) biari_encode_symbol (eep_dp, 0, &ctx->b8_type_contexts[1][3]);
else biari_encode_symbol (eep_dp, 1, &ctx->b8_type_contexts[1][3]);
}
else if (act_sym<6)
{
biari_encode_symbol (eep_dp, 1, &ctx->b8_type_contexts[1][1]);
biari_encode_symbol (eep_dp, 0, &ctx->b8_type_contexts[1][2]);
csym=(((act_sym-2)>>1)&0x01);
if (csym) biari_encode_symbol (eep_dp, 1, &ctx->b8_type_contexts[1][3]);
else biari_encode_symbol (eep_dp, 0, &ctx->b8_type_contexts[1][3]);
csym=((act_sym-2)&0x01);
if (csym) biari_encode_symbol (eep_dp, 1, &ctx->b8_type_contexts[1][3]);
else biari_encode_symbol (eep_dp, 0, &ctx->b8_type_contexts[1][3]);
}
else if (act_sym==12)
{
biari_encode_symbol (eep_dp, 1, &ctx->b8_type_contexts[1][1]);
biari_encode_symbol (eep_dp, 1, &ctx->b8_type_contexts[1][2]);
biari_encode_symbol (eep_dp, 1, &ctx->b8_type_contexts[1][3]);
biari_encode_symbol (eep_dp, 1, &ctx->b8_type_contexts[1][3]);
}
else
{
biari_encode_symbol (eep_dp, 1, &ctx->b8_type_contexts[1][1]);
biari_encode_symbol (eep_dp, 1, &ctx->b8_type_contexts[1][2]);
csym=(((act_sym-6)>>2)&0x01);
if (csym) biari_encode_symbol (eep_dp, 1, &ctx->b8_type_contexts[1][3]);
else biari_encode_symbol (eep_dp, 0, &ctx->b8_type_contexts[1][3]);
csym=(((act_sym-6)>>1)&0x01);
if (csym) biari_encode_symbol (eep_dp, 1, &ctx->b8_type_contexts[1][3]);
else biari_encode_symbol (eep_dp, 0, &ctx->b8_type_contexts[1][3]);
csym=((act_sym-6)&0x01);
if (csym) biari_encode_symbol (eep_dp, 1, &ctx->b8_type_contexts[1][3]);
else biari_encode_symbol (eep_dp, 0, &ctx->b8_type_contexts[1][3]);
}
}
}
/*!
****************************************************************************
* \brief
* This function is used to arithmetically encode a pair of
* intra prediction modes of a given MB.
****************************************************************************
*/
void writeIntraPredMode2Buffer_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_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
unary_bin_max_encode(eep_dp,(unsigned int) se->value1,ctx->ipr_contexts[prev_sym],1,8);
#else
unary_bin_max_encode(eep_dp,(unsigned int) se->value1,ctx->ipr_contexts[prev_sym],1,5);
#endif
//--- second symbol ---
prev_sym = se->value1;
#ifndef USE_6_INTRA_MODES
unary_bin_max_encode(eep_dp,(unsigned int) se->value2,ctx->ipr_contexts[prev_sym],1,8);
#else
unary_bin_max_encode(eep_dp,(unsigned int) se->value2,ctx->ipr_contexts[prev_sym],1,5);
#endif
}
/*!
****************************************************************************
* \brief
* This function is used to arithmetically encode the reference
* parameter of a given MB.
****************************************************************************
*/
void writeRefFrame2Buffer_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_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 ? 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 = se->value1;
if (act_sym==0)
{
biari_encode_symbol(eep_dp, 0, ctx->ref_no_contexts[addctx] + act_ctx );
}
else
{
biari_encode_symbol(eep_dp, 1, ctx->ref_no_contexts[addctx] + act_ctx);
act_sym--;
act_ctx=4;
unary_bin_encode(eep_dp, act_sym,ctx->ref_no_contexts[addctx]+act_ctx,1);
}
}
/*!
****************************************************************************
* \brief
* This function is used to arithmetically encode the motion
* vector data of a given MB.
****************************************************************************
*/
void writeMVD2Buffer_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_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][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][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;
}
mv_pred_res = se->value1;
se->context = act_ctx;
act_sym = absm(mv_pred_res);
if (act_sym == 0)
biari_encode_symbol(eep_dp, 0, &ctx->mv_res_contexts[0][act_ctx] );
else
{
biari_encode_symbol(eep_dp, 1, &ctx->mv_res_contexts[0][act_ctx] );
mv_sign = (mv_pred_res<0) ? 1: 0;
act_ctx=5*k+4;
biari_encode_symbol(eep_dp, (unsigned char) mv_sign, &ctx->mv_res_contexts[1][act_ctx] );
act_sym--;
act_ctx=5*k;
unary_mv_encode(eep_dp,act_sym,ctx->mv_res_contexts[1]+act_ctx,3);
}
}
/*!
****************************************************************************
* \brief
* This function is used to arithmetically encode the coded
* block pattern of a given delta quant.
****************************************************************************
*/
void writeDquant_inter_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_dp)
{
MotionInfoContexts *ctx = img->currentSlice->mot_ctx;
Macroblock *currMB = &img->mb_data[img->current_mb_nr];
int act_ctx;
int act_sym;
int dquant = se->value1;
int sign=0;
if (dquant <= 0)
sign = 1;
act_sym = abs(dquant) << 1;
act_sym += sign;
act_sym --;
if (currMB->mb_available[1][0] == NULL)
act_ctx = 0;
else
act_ctx = ( ((currMB->mb_available[1][0])->delta_qp != 0) ? 1 : 0);
if (act_sym==0)
{
biari_encode_symbol(eep_dp, 0, ctx->delta_qp_inter_contexts + act_ctx );
}
else
{
biari_encode_symbol(eep_dp, 1, ctx->delta_qp_inter_contexts + act_ctx);
act_ctx=2;
act_sym--;
unary_bin_encode(eep_dp, act_sym,ctx->delta_qp_inter_contexts+act_ctx,1);
}
}
/*!
****************************************************************************
* \brief
* This function is used to arithmetically encode the coded
* block pattern of a given delta quant.
****************************************************************************
*/
void writeDquant_intra_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_dp)
{
MotionInfoContexts *ctx = img->currentSlice->mot_ctx;
Macroblock *currMB = &img->mb_data[img->current_mb_nr];
int act_ctx;
int act_sym;
int dquant = se->value1;
int sign=0;
if (dquant <= 0)
sign = 1;
act_sym = abs(dquant) << 1;
act_sym += sign;
act_sym --;
if (currMB->mb_available[1][0] == NULL)
act_ctx = 0;
else
act_ctx = ( ((currMB->mb_available[1][0])->delta_qp != 0) ? 1 : 0);
if (act_sym==0)
{
biari_encode_symbol(eep_dp, 0, ctx->delta_qp_intra_contexts + act_ctx );
}
else
{
biari_encode_symbol(eep_dp, 1, ctx->delta_qp_intra_contexts + act_ctx);
act_ctx=2;
act_sym--;
unary_bin_encode(eep_dp, act_sym,ctx->delta_qp_intra_contexts+act_ctx,1);
}
}
/*!
****************************************************************************
* \brief
* This function is used to arithmetically encode the motion
* vector data of a B-frame MB.
****************************************************************************
*/
void writeBiMVD2Buffer_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_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 backward = se->value2 & 0x01;
int k = (se->value2>>1); // 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[backward][BLOCK_SIZE-1][i][k]);
}
else
b = absm(currMB->mvd[backward][j-1][i][k]);
if (i==0)
{
if (currMB->mb_available[1][0] == NULL)
a = 0;
else
a = absm((currMB->mb_available[1][0])->mvd[backward][j][BLOCK_SIZE-1][k]);
}
else
a = absm(currMB->mvd[backward][j][i-1][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;
}
mv_pred_res = se->value1;
se->context = act_ctx;
act_sym = absm(mv_pred_res);
if (act_sym == 0)
biari_encode_symbol(eep_dp, 0, &ctx->mv_res_contexts[0][act_ctx] );
else
{
biari_encode_symbol(eep_dp, 1, &ctx->mv_res_contexts[0][act_ctx] );
mv_sign = (mv_pred_res<0) ? 1: 0;
act_ctx=5*k+4;
biari_encode_symbol(eep_dp, (unsigned char) mv_sign, &ctx->mv_res_contexts[1][act_ctx] );
act_sym--;
act_ctx=5*k;
unary_mv_encode(eep_dp,act_sym,ctx->mv_res_contexts[1]+act_ctx,3);
}
}
/*!
****************************************************************************
* \brief
* This function is used to arithmetically encode the coded
* block pattern of an 8x8 block
****************************************************************************
*/
void writeCBP_BIT_CABAC (int b8, int bit, int cbp, Macroblock* currMB, int inter, EncodingEnvironmentPtr eep_dp)
{
int a, b;
//===== GET CONTEXT FOR CBP-BIT =====
if (b8/2 == 0) // upper block is in upper macroblock
{
if (currMB->mb_available[0][1] == NULL)
b = 0;
else
b = ((currMB->mb_available[0][1]->cbp & (1<<(b8+2))) == 0 ? 1 : 0);
}
else
b = ((cbp & (1<<(b8-2))) == 0 ? 1: 0);
if (b8%2 == 0) // left block is in left macroblock
{
if (currMB->mb_available[1][0] == NULL)
a = 0;
else
a = ((currMB->mb_available[1][0]->cbp & (1<<(b8+1))) == 0 ? 1 : 0);
}
else
a = ((cbp & (1<<(b8-1))) == 0 ? 1: 0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -