📄 cabac.c
字号:
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_contexts + act_ctx ); } else { biari_encode_symbol(eep_dp, 1, ctx->delta_qp_contexts + act_ctx); act_ctx=2; act_sym--; unary_bin_encode(eep_dp, act_sym,ctx->delta_qp_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 step_h, step_v; 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(backward == 0) { step_h=img->fw_blc_size_h/BLOCK_SIZE; // horizontal stepsize step_v=img->fw_blc_size_v/BLOCK_SIZE; // vertical stepsize } else { step_h=img->bw_blc_size_h/BLOCK_SIZE; // horizontal stepsize step_v=img->bw_blc_size_v/BLOCK_SIZE; // vertical stepsize } 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-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[backward][j][BLOCK_SIZE-1][k]); } else a = absm(currMB->mvd[backward][j][i-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; } 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 forward * or backward bidirectional blocksize (for B frames only) **************************************************************************** */void writeBiDirBlkSize2Buffer_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_dp){ int act_ctx; int act_sym; MotionInfoContexts *ctx = img->currentSlice->mot_ctx; act_sym = se->value1; // maximum is 6 act_ctx=4; // using the context models of mb_type unary_bin_max_encode(eep_dp,(unsigned int) act_sym,ctx->mb_type_contexts[1]+act_ctx,1,6);}/*! **************************************************************************** * \brief * This function is used to arithmetically encode the coded * block pattern of a given MB. **************************************************************************** */void writeCBP2Buffer_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_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 = se->value1; // symbol to encode int mask; int cbp_bit; if ( se->type == SE_CBP_INTRA ) curr_cbp_idx = 0; else curr_cbp_idx = 1; // 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 (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 = cbp & mask; biari_encode_symbol(eep_dp, (unsigned char) cbp_bit, ctx->cbp_contexts[curr_cbp_idx][0] + curr_cbp_ctx ); } } // 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 = (cbp > 15 ) ? 1 : 0; biari_encode_symbol(eep_dp, (unsigned char) cbp_bit, ctx->cbp_contexts[curr_cbp_idx][1] + curr_cbp_ctx ); if (cbp > 15) { 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 = ((cbp>>4) == 2) ? 1 : 0; biari_encode_symbol(eep_dp, (unsigned char) cbp_bit, ctx->cbp_contexts[curr_cbp_idx][2] + curr_cbp_ctx ); }}/*! **************************************************************************** * \brief * This function is used to arithmetically encode level and * run of a given MB. **************************************************************************** */void writeRunLevel2Buffer_CABAC(SyntaxElement *se, EncodingEnvironmentPtr eep_dp){ const int level = se->value1; const int run = se->value2; const int curr_ctx_idx = se->context; int curr_level_ctx; int sign_of_level; int max_run; TextureInfoContexts *ctx = img->currentSlice->tex_ctx; unary_level_encode(eep_dp,(unsigned int) absm(level),ctx->level_context[curr_ctx_idx]); if (level!=0) { sign_of_level = ((level < 0) ? 1 : 0); curr_level_ctx = 3; biari_encode_symbol(eep_dp, (unsigned char) sign_of_level, ctx->level_context[curr_ctx_idx] + curr_level_ctx ); if (curr_ctx_idx != 0 && curr_ctx_idx != 6 && curr_ctx_idx != 5) // not double scan and not DC-chroma unary_bin_encode(eep_dp,(unsigned int) run,ctx->run_context[curr_ctx_idx],1); else { max_run = (curr_ctx_idx == 0) ? 7 : 3; // if double scan max_run = 7; if DC-chroma max_run = 3; unary_bin_max_encode(eep_dp,(unsigned int) run,ctx->run_context[curr_ctx_idx],1,max_run); } }}/*! ************************************************************************ * \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 * Unary binarization and encoding of a symbol by using * three distinct models for the first, the second and all * remaining bins ************************************************************************ */void unary_level_encode(EncodingEnvironmentPtr eep_dp, unsigned int symbol, BiContextTypePtr ctx){ unsigned int l; int bin=1; BiContextTypePtr ictx=ctx; if (symbol==0) { biari_encode_symbol(eep_dp, 0, ictx ); return; } else { biari_encode_symbol(eep_dp, 1, ictx ); l=symbol; ictx++; while ((--l)>0) { biari_encode_symbol(eep_dp, 1, ictx ); if ((++bin)==2) ictx++; } biari_encode_symbol(eep_dp, 0, ictx ); } return;}/*! ************************************************************************ * \brief * Unary binarization and encoding of a symbol by using * four distinct models for the first, the second, intermediate * and all remaining bins ************************************************************************ */void unary_mv_encode(EncodingEnvironmentPtr eep_dp, unsigned int symbol, BiContextTypePtr ctx, unsigned int max_bin){ unsigned int l; unsigned int bin=1; BiContextTypePtr ictx=ctx; if (symbol==0) { biari_encode_symbol(eep_dp, 0, ictx ); return; } else { biari_encode_symbol(eep_dp, 1, ictx ); l=symbol; ictx++; while ((--l)>0) { biari_encode_symbol(eep_dp, 1, ictx ); if ((++bin)==2) ictx++; if (bin==max_bin) ictx++; } biari_encode_symbol(eep_dp, 0, ictx ); } return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -