cabac.c
来自「JM 11.0 KTA 2.1 Source Code」· C语言 代码 · 共 1,962 行 · 第 1/5 页
C
1,962 行
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 = ((cbp>>4) == 2) ? 1 : 0;
biari_encode_symbol(eep_dp, (signed short) cbp_bit, ctx->cbp_contexts[2] + curr_cbp_ctx );
}
}
}
#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
#ifdef USE_INTRA_MDDT
/*!
*************************************************************************************
* \brief
* Set coded-block-pattern bits for INTRA16x16 MB
*
* \para set_CBP_block_bit_16x16()
* <paragraph>
*
* \author
* - Yan Ye <yye@qualcomm.com>
*************************************************************************************
*/
void set_CBP_block_bit_16x16 (Macroblock* currMB)
{
int bit;
for(bit = 1; bit < 17; bit++)
{
currMB->cbp_bits |= ((int64)1<< bit );
}
}
#endif
/*!
****************************************************************************
* \brief
* Write CBP4-BIT
****************************************************************************
*/
void write_and_store_CBP_block_bit (Macroblock* currMB, EncodingEnvironmentPtr eep_dp, int type, int cbp_bit)
{
int y_ac = (type==LUMA_16AC || type==LUMA_8x8 || type==LUMA_8x4 || type==LUMA_4x8 || type==LUMA_4x4);
int y_dc = (type==LUMA_16DC);
int u_ac = (type==CHROMA_AC && !img->is_v_block);
int v_ac = (type==CHROMA_AC && img->is_v_block);
int chroma_dc = (type==CHROMA_DC || type==CHROMA_DC_2x4 || type==CHROMA_DC_4x4);
int u_dc = (chroma_dc && !img->is_v_block);
int v_dc = (chroma_dc && img->is_v_block);
int j = (y_ac || u_ac || v_ac ? img->subblock_y : 0);
int i = (y_ac || u_ac || v_ac ? img->subblock_x : 0);
int bit = (y_dc ? 0 : y_ac ? 1 : u_dc ? 17 : v_dc ? 18 : u_ac ? 19 : 23);
int default_bit = (img->is_intra_block ? 1 : 0);
int upper_bit = default_bit;
int left_bit = default_bit;
int ctx;
int bit_pos_a = 0;
int bit_pos_b = 0;
PixelPos block_a, block_b;
if (y_ac || y_dc)
{
getLuma4x4Neighbour(img->current_mb_nr, i, j, -1, 0, &block_a);
getLuma4x4Neighbour(img->current_mb_nr, i, j, 0, -1, &block_b);
if (y_ac)
{
if (block_a.available)
bit_pos_a = 4*block_a.y + block_a.x;
if (block_b.available)
bit_pos_b = 4*block_b.y + block_b.x;
}
}
else
{
getChroma4x4Neighbour(img->current_mb_nr, i, j, -1, 0, &block_a);
getChroma4x4Neighbour(img->current_mb_nr, i, j, 0, -1, &block_b);
if (u_ac||v_ac)
{
if (block_a.available)
bit_pos_a = 4*block_a.y + block_a.x;
if (block_b.available)
bit_pos_b = 4*block_b.y + block_b.x;
}
}
bit = (y_dc ? 0 : y_ac ? 1+4*j+i : u_dc ? 17 : v_dc ? 18 : u_ac ? 19+4*j+i : 35+4*j+i);
//--- set bits for current block ---
if (cbp_bit)
{
if (type==LUMA_8x8)
{
currMB->cbp_bits |= ((int64)1<< bit );
currMB->cbp_bits |= ((int64)1<<(bit+1));
currMB->cbp_bits |= ((int64)1<<(bit+4));
currMB->cbp_bits |= ((int64)1<<(bit+5));
}
else if (type==LUMA_8x4)
{
currMB->cbp_bits |= ((int64)1<< bit );
currMB->cbp_bits |= ((int64)1<<(bit+1));
}
else if (type==LUMA_4x8)
{
currMB->cbp_bits |= ((int64)1<< bit );
currMB->cbp_bits |= ((int64)1<<(bit+4));
}
else
{
currMB->cbp_bits |= ((int64)1<<bit);
}
}
bit = (y_dc ? 0 : y_ac ? 1 : u_dc ? 17 : v_dc ? 18 : u_ac ? 19 : 35);
if (type!=LUMA_8x8)
{
if (block_b.available)
{
if(img->mb_data[block_b.mb_addr].mb_type==IPCM)
upper_bit=1;
else
upper_bit = BIT_SET(img->mb_data[block_b.mb_addr].cbp_bits,bit+bit_pos_b);
}
if (block_a.available)
{
if(img->mb_data[block_a.mb_addr].mb_type==IPCM)
left_bit=1;
else
left_bit = BIT_SET(img->mb_data[block_a.mb_addr].cbp_bits,bit+bit_pos_a);
}
ctx = 2*upper_bit+left_bit;
//===== encode symbol =====
biari_encode_symbol (eep_dp, (short)cbp_bit, img->currentSlice->tex_ctx->bcbp_contexts[type2ctx_bcbp[type]]+ctx);
}
}
#ifdef RDO_Q
/*!
****************************************************************************
* \brief
* estimate CABAC CBP bits
****************************************************************************
*/
int est_write_and_store_CBP_block_bit(Macroblock* currMB, int type) // marta - CBP
{
int j = img->subblock_y;
int i = img->subblock_x;
int bit, default_bit = (IS_INTRA(currMB) ? 1 : 0);
int upper_bit = default_bit;
int left_bit = default_bit;
int ctx, estBits;
int bit_pos_a = 0;
int bit_pos_b = 0;
if (type!=LUMA_8x8)
{
PixelPos block_a, block_b;
getLuma4x4Neighbour(img->current_mb_nr, i, j, -1, 0, &block_a);
getLuma4x4Neighbour(img->current_mb_nr, i, j, 0, -1, &block_b);
if (block_a.available)
bit_pos_a = 4*block_a.y + block_a.x;
if (block_b.available)
bit_pos_b = 4*block_b.y + block_b.x;
bit = 1; // 4x4: bit=1
if (block_b.available)
{
if(img->mb_data[block_b.mb_addr].mb_type==IPCM)
upper_bit=1;
else
upper_bit = BIT_SET(img->mb_data[block_b.mb_addr].cbp_bits,bit+bit_pos_b);
}
if (block_a.available)
{
if(img->mb_data[block_a.mb_addr].mb_type==IPCM)
left_bit=1;
else
left_bit = BIT_SET(img->mb_data[block_a.mb_addr].cbp_bits,bit+bit_pos_a);
}
ctx = 2*upper_bit+left_bit;
//===== encode symbol =====
estBits=estBitsCabac[type].blockCbpBits[ctx][0]-estBitsCabac[type].blockCbpBits[ctx][1];
}
else
{
estBits=0;
}
return(estBits);
}
/*!
****************************************************************************
* \brief
* estimate bit cost for each CBP bit
****************************************************************************
*/
void est_CBP_block_bit (Macroblock* currMB, EncodingEnvironmentPtr eep_dp, int type)
{
int ctx;
short cbp_bit;
for (ctx=0; ctx<=3; ctx++)
{
cbp_bit=0;
estBitsCabac[type].blockCbpBits[ctx][cbp_bit]=biari_no_bits(eep_dp, cbp_bit, img->currentSlice->tex_ctx->bcbp_contexts[type2ctx_bcbp[type]]+ctx);
cbp_bit=1;
estBitsCabac[type].blockCbpBits[ctx][cbp_bit]=biari_no_bits(eep_dp, cbp_bit, img->currentSlice->tex_ctx->bcbp_contexts[type2ctx_bcbp[type]]+ctx);
}
}
#endif
//===== position -> ctx for MAP =====
//--- zig-zag scan ----
static const int pos2ctx_map8x8 [] = { 0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5,
4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9, 10, 9, 8, 7,
7, 6, 11, 12, 13, 11, 6, 7, 8, 9, 14, 10, 9, 8, 6, 11,
#ifdef RDO_Q
12, 13, 11, 6, 9, 14, 10, 9, 11, 12, 13, 11 ,14, 10, 12, 15}; // 15 CTX
#else
12, 13, 11, 6, 9, 14, 10, 9, 11, 12, 13, 11 ,14, 10, 12, 14}; // 15 CTX
#endif
static const int pos2ctx_map8x4 [] = { 0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 9, 8, 6, 7, 8,
#ifdef RDO_Q
9, 10, 11, 9, 8, 6, 12, 8, 9, 10, 11, 9, 13, 13, 14, 15}; // 15 CTX
#else
9, 10, 11, 9, 8, 6, 12, 8, 9, 10, 11, 9, 13, 13, 14, 14}; // 15 CTX
#endif
#ifdef RDO_Q
static const int pos2ctx_map4x4 [] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; // 15 CTX
#else
static const int pos2ctx_map4x4 [] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14}; // 15 CTX
#endif
static const int pos2ctx_map2x4c[] = { 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}; // 15 CTX
static const int pos2ctx_map4x4c[] = { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2}; // 15 CTX
#ifndef USE_INTRA_MDDT
static const int* pos2ctx_map [] = {pos2ctx_map4x4, pos2ctx_map4x4, pos2ctx_map8x8, pos2ctx_map8x4,
pos2ctx_map8x4, pos2ctx_map4x4, pos2ctx_map4x4, pos2ctx_map4x4,
pos2ctx_map2x4c, pos2ctx_map4x4c};
#else
static const int pos2ctx_map16x16[]= {
0, 1, 2, 2, 1, 1, 1, 1, 2, 2, 3, 2, 4, 1, 5, 5,
5, 4, 4, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 4, 4,
4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 4,
4, 4, 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4,
5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3,
6, 4, 7, 4, 7, 4, 7, 4, 8, 5, 9, 9, 9, 8, 8, 7,
7, 7, 7, 7, 7, 6, 6, 3, 3, 12, 3, 11, 6, 6, 7, 7,
7, 7, 7, 8, 8, 9, 9, 10, 10, 10, 9, 9, 8, 8, 7, 7,
7, 7, 6, 6, 11, 11, 12, 12, 12, 13, 11, 11, 6, 6, 7, 7,
7, 8, 8, 9, 9, 14, 10, 14, 14, 9, 9, 8, 8, 7, 7, 6,
6, 11, 11, 13, 13, 13, 12, 11, 11, 6, 6, 7, 8, 8, 9, 9,
10, 14, 10, 10, 9, 9, 8, 8, 6, 6, 11, 11, 12, 12, 12, 13,
11, 11, 6, 6, 8, 9, 9, 14, 10, 14, 14, 9, 9, 6, 6, 11,
11, 13, 13, 13, 12, 11, 11, 6, 9, 9, 10, 14, 10, 10, 9, 9,
11, 11, 12, 12, 12, 13, 11, 11, 9, 14, 10, 14, 14, 11, 11, 13,
13, 13, 12, 11, 10, 14, 10, 10, 12, 12, 12, 14, 10, 14, 14, 14,
}; // 15 CTX
static const int* pos2ctx_map [] = {pos2ctx_map4x4, pos2ctx_map4x4, pos2ctx_map8x8, pos2ctx_map8x4,
pos2ctx_map8x4, pos2ctx_map4x4, pos2ctx_map4x4, pos2ctx_map4x4,
pos2ctx_map2x4c, pos2ctx_map4x4c,pos2ctx_map16x16};
#endif
//--- interlace scan ----
//Taken from ABT
static const int pos2ctx_map8x8i[] = { 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 4, 5,
6, 9, 10, 10, 8, 11, 12, 11, 9, 9, 10, 10, 8, 11, 12, 11,
9, 9, 10, 10, 8, 11, 12, 11, 9, 9, 10, 10, 8, 13, 13, 9,
9, 10, 10, 8, 13, 13, 9, 9, 10, 10, 14, 14, 14, 14, 14, 14}; // 15 CTX
static const int pos2ctx_map8x4i[] = { 0, 1, 2, 3, 4, 5, 6, 3, 4, 5, 6, 3, 4, 7, 6, 8,
9, 7, 6, 8, 9, 10, 11, 12, 12, 10, 11, 13, 13, 14, 14, 14}; // 15 CTX
static const int pos2ctx_map4x8i[] = { 0, 1, 1, 1, 2, 3, 3, 4, 4, 4, 5, 6, 2, 7, 7, 8,
8, 8, 5, 6, 9, 10, 10, 11, 11, 11, 12, 13, 13, 14, 14, 14}; // 15 CTX
static const int* pos2ctx_map_int[] = {pos2ctx_map4x4, pos2ctx_map4x4, pos2ctx_map8x8i,pos2ctx_map8x4i,
pos2ctx_map4x8i,pos2ctx_map4x4, pos2ctx_map4x4, pos2ctx_map4x4,
pos2ctx_map2x4c, pos2ctx_map4x4c};
//===== position -> ctx for LAST =====
static const int pos2ctx_last8x8 [] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
#ifdef RDO_Q
5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 15}; // 9 CTX
#else
5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8}; // 9 CTX
#endif
static const int pos2ctx_last8x4 [] = { 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,
#ifdef RDO_Q
3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 15}; // 9 CTX
#else
3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8}; // 9 CTX
#endif
static const int pos2ctx_last4x4 [] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; // 15 CTX
static const int pos2ctx_last2x4c[] = { 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}; // 15 CTX
static const int pos2ctx_last4x4c[] = { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2}; // 15 CTX
#ifndef USE_INTRA_MDDT
static const int* pos2ctx_last [] = {pos2ctx_last4x4, pos2ctx_last4x4, pos2ctx_last8x8, pos2ctx_last8x4,
pos2ctx_last8x4, pos2ctx_last4x4, pos2ctx_last4x4, pos2ctx_last4x4,
pos2ctx_last2x4c, pos2ctx_last4x4c};
#else
static const int pos2ctx_last16x16[]= {
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
2, 4, 2, 4, 2, 4, 2, 4, 4, 4, 4, 4, 4, 3, 3, 3,
3, 3, 3, 3, 3, 3, 5, 3, 4, 3, 4, 3, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5,
4, 5, 4, 5, 4, 6, 4, 6, 4, 6, 6, 6, 6, 5, 5, 5,
5, 5, 5, 5, 7, 5, 7, 5, 6, 6, 6, 6, 6, 6, 6, 6,
7, 7, 7, 7, 7, 7, 7, 7, 6, 8, 6, 8, 8, 7, 7, 7,
7, 7, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
}; // 9 CTX
static const int* pos2ctx_last [] = {pos2ctx_last4x4, pos2ctx_last4x4, pos2ctx_last8x8, pos2ctx_last8x4,
pos2ctx_last8x4, pos2ctx_last4x4, pos2ctx_last4x4, pos2ctx_last4x4,
pos2ctx_last2x4c, pos2ctx_last4x4c, pos2ctx_last16x16};
#endif
/*!
****************************************************************************
* \brief
* Write Significance MAP
****************************************************************************
*/
void write_significance_map (Macroblock* currMB, EncodingEnvironmentPtr eep_dp, int type, int coeff[], int coeff_ctr)
{
int k;
unsigned short sig, last;
int k0 = 0;
int k1 = maxpos[type]-1;
int fld = ( img->structure!=FRAME || currMB->mb_field );
BiContextTypePtr map_ctx = ( fld ? img->currentSlice->tex_ctx->fld_map_contexts[type2ctx_map [type]]
: img->currentSlice->tex_ctx->map_contexts[type2ctx_map [type]] );
BiContextTypePtr last_ctx = ( fld ? img->currentSlice->tex_ctx->fld_last_contexts[type2ctx_last[type]]
: img->currentSlice->tex_ctx->last_contexts[type2ctx_last[type]] );
if (!c1isdc[type])
{
k0++; k1++; coeff--;
}
if (!fld)
{
for (k=k0; k<k1; k++) // if last coeff is reached, it has to be significant
{
sig = (coeff[k] != 0);
biari_encode_symbol (eep_dp, sig, map_ctx+pos2ctx_map [type][k]);
if (sig)
{
last = (--coeff_ctr == 0);
biari_encode_symbol(eep_dp, last, last_ctx+pos2ctx_last[type][k]);
if (last) return;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?