📄 cavlc.c
字号:
}
if( ABS( level[i] ) > ( 3 << ( i_suffix_length - 1 ) ) && i_suffix_length < 6 )
{
i_suffix_length++;
}
}
//encode total zeros [i_total-1][i_total_zero]
if( i_total < i_count )
{
if( i_idx == BLOCK_INDEX_CHROMA_DC )
{
eg_write_vlc(h->bs, x264_total_zeros_dc[i_total-1][i_total_zero]);
}
else
{
eg_write_vlc(h->bs, x264_total_zeros[i_total-1][i_total_zero]);
}
}
//encode each run of zeros
for( i = 0, i_zero_left = i_total_zero; i < i_total - 1; i++ )
{
int i_zl;
if( i_zero_left <= 0 )
{
break;
}
i_zl = T264_MIN( i_zero_left - 1, 6 );
eg_write_vlc(h->bs, x264_run_before[i_zl][run[i]]);
i_zero_left -= run[i];
}
}
void
T264_macroblock_write_cavlc(T264_t *t)
{
int32_t mb_mode = t->mb.mb_mode;
int32_t i;
int32_t offset;
if (t->slice_type == SLICE_I)
{
offset = 0;
}
else if (t->slice_type == SLICE_P)
{
offset = 5;
}
else if (t->slice_type == SLICE_B)
{
offset = 23;
}
if(t->slice_type != SLICE_I)
{
eg_write_ue(t->bs, t->skip); /* skip run */
t->skip = 0;
}
if (mb_mode == I_4x4)
{
// mb_type
eg_write_ue(t->bs, offset + 0);
/* Prediction: Luma */
for (i = 0 ; i < 16; i ++) /* i : Inverse raster scan */
{
int8_t pred = T264_mb_predict_intra4x4_mode(t, i);
int8_t mode = t->mb.mode_i4x4[i];
if( pred == mode)
{
eg_write_direct1(t->bs, 1); /* b_prev_intra4x4_pred_mode */
}
else
{
eg_write_direct1(t->bs, 0); /* b_prev_intra4x4_pred_mode */
if( mode < pred )
{
eg_write_direct(t->bs, mode, 3); /* rem_intra4x4_pred_mode */
}
else
{
eg_write_direct(t->bs, mode - 1, 3); /* rem_intra4x4_pred_mode */
}
}
}
//intra_chroma_pred_mode
eg_write_ue(t->bs, t->mb.mb_mode_uv);
// coded_block_pattern
eg_write_ue(t->bs, intra4x4_cbp_to_golomb[( t->mb.cbp_c << 4 ) | t->mb.cbp_y]);
//delta_qp
if (t->mb.cbp_y > 0 || t->mb.cbp_c > 0)
{
eg_write_se(t->bs, t->mb.mb_qp_delta); /* 0 = no change on qp */
for (i = 0; i < 16 ; i ++)
{
if(t->mb.cbp_y & (1 << ( i / 4 )))
{
block_residual_write_cavlc(t, i, t->mb.dct_y_z[i], 16);
}
}
}
}
else if (mb_mode == I_16x16)
{
// mb_type
eg_write_ue(t->bs, offset + 1 + t->mb.mode_i16x16 +
t->mb.cbp_c * 4 + (t->mb.cbp_y == 0 ? 0 : 12));
// intra chroma pred mode
eg_write_ue(t->bs, t->mb.mb_mode_uv);
// delta qp
eg_write_se(t->bs, t->mb.mb_qp_delta);
// dc luma
block_residual_write_cavlc(t, BLOCK_INDEX_LUMA_DC, t->mb.dc4x4_z, 16);
if (t->mb.cbp_y != 0)
{
for(i = 0 ; i < 16 ; i ++)
{
if (t->mb.cbp_y & (1 << (i / 4)))
{
block_residual_write_cavlc(t, i, &(t->mb.dct_y_z[i][1]), 15);
}
}
}
}
else
{
T264_vector_t vec;
if (t->slice_type == SLICE_P)
{
switch (t->mb.mb_part)
{
case MB_16x16:
eg_write_ue(t->bs, MB_16x16);
if (t->ps.num_ref_idx_l0_active_minus1 > 0)
{
eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][0].refno);
}
vec = t->mb.vec[0][0];
T264_predict_mv(t, 0, 0, 4, &vec);
eg_write_se(t->bs, t->mb.vec[0][0].x - vec.x);
eg_write_se(t->bs, t->mb.vec[0][0].y - vec.y);
break;
case MB_16x8:
eg_write_ue(t->bs, MB_16x8);
if (t->ps.num_ref_idx_l0_active_minus1 > 0)
{
eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][0].refno);
eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][8].refno);
}
vec = t->mb.vec[0][0];
T264_predict_mv(t, 0, 0, 4, &vec);
eg_write_se(t->bs, t->mb.vec[0][0].x - vec.x);
eg_write_se(t->bs, t->mb.vec[0][0].y - vec.y);
vec = t->mb.vec[0][8];
T264_predict_mv(t, 0, 8, 4, &vec);
eg_write_se(t->bs, t->mb.vec[0][8].x - vec.x);
eg_write_se(t->bs, t->mb.vec[0][8].y - vec.y);
break;
case MB_8x16:
eg_write_ue(t->bs, MB_8x16);
if (t->ps.num_ref_idx_l0_active_minus1 > 0)
{
eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][0].refno);
eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][luma_index[4]].refno);
}
vec = t->mb.vec[0][0];
T264_predict_mv(t, 0, 0, 2, &vec);
eg_write_se(t->bs, t->mb.vec[0][0].x - vec.x);
eg_write_se(t->bs, t->mb.vec[0][0].y - vec.y);
vec = t->mb.vec[0][luma_index[4]];
T264_predict_mv(t, 0, luma_index[4], 2, &vec);
eg_write_se(t->bs, t->mb.vec[0][luma_index[4]].x - vec.x);
eg_write_se(t->bs, t->mb.vec[0][luma_index[4]].y - vec.y);
break;
case MB_8x8:
case MB_8x8ref0:
if (t->mb.vec[0][luma_index[0]].refno == 0 &&
t->mb.vec[0][luma_index[4]].refno == 0 &&
t->mb.vec[0][luma_index[8]].refno == 0 &&
t->mb.vec[0][luma_index[12]].refno == 0)
{
eg_write_ue(t->bs, MB_8x8ref0);
for (i = 0 ; i < 4 ; i ++)
{
switch (t->mb.submb_part[luma_index[4 * i]])
{
case MB_8x8:
eg_write_ue(t->bs, 0);
break;
case MB_8x4:
eg_write_ue(t->bs, 1);
break;
case MB_4x8:
eg_write_ue(t->bs, 2);
break;
case MB_4x4:
eg_write_ue(t->bs, 3);
break;
default:
break;
}
}
}
else
{
eg_write_ue(t->bs, MB_8x8);
for (i = 0 ; i < 4 ; i ++)
{
switch (t->mb.submb_part[luma_index[4 * i]])
{
case MB_8x8:
eg_write_ue(t->bs, 0);
break;
case MB_8x4:
eg_write_ue(t->bs, 1);
break;
case MB_4x8:
eg_write_ue(t->bs, 2);
break;
case MB_4x4:
eg_write_ue(t->bs, 3);
break;
default:
break;
}
}
if (t->ps.num_ref_idx_l0_active_minus1 > 0)
{
eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][0].refno);
eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][luma_index[4]].refno);
eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][luma_index[8]].refno);
eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][luma_index[12]].refno);
}
}
for(i = 0 ; i < 4 ; i ++)
{
switch(t->mb.submb_part[luma_index[4 * i]])
{
case MB_8x8:
vec = t->mb.vec[0][luma_index[4 * i]];
T264_predict_mv(t, 0, luma_index[4 * i], 2, &vec);
eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i]].x - vec.x);
eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i]].y - vec.y);
break;
case MB_8x4:
vec = t->mb.vec[0][luma_index[4 * i]];
T264_predict_mv(t, 0, luma_index[4 * i], 2, &vec);
eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i]].x - vec.x);
eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i]].y - vec.y);
vec = t->mb.vec[0][luma_index[4 * i + 2]];
T264_predict_mv(t, 0, luma_index[4 * i + 2], 2, &vec);
eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i + 2]].x - vec.x);
eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i + 2]].y - vec.y);
break;
case MB_4x8:
vec = t->mb.vec[0][luma_index[4 * i]];
T264_predict_mv(t, 0, luma_index[4 * i], 1, &vec);
eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i]].x - vec.x);
eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i]].y - vec.y);
vec = t->mb.vec[0][luma_index[4 * i + 1]];
T264_predict_mv(t, 0, luma_index[4 * i + 1], 1, &vec);
eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i + 1]].x - vec.x);
eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i + 1]].y - vec.y);
break;
case MB_4x4:
vec = t->mb.vec[0][luma_index[4 * i]];
T264_predict_mv(t, 0, luma_index[4 * i], 1, &vec);
eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i]].x - vec.x);
eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i]].y - vec.y);
vec = t->mb.vec[0][luma_index[4 * i + 1]];
T264_predict_mv(t, 0, luma_index[4 * i + 1], 1, &vec);
eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i + 1]].x - vec.x);
eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i + 1]].y - vec.y);
vec = t->mb.vec[0][luma_index[4 * i + 2]];
T264_predict_mv(t, 0, luma_index[4 * i + 2], 1, &vec);
eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i + 2]].x - vec.x);
eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i + 2]].y - vec.y);
vec = t->mb.vec[0][luma_index[4 * i + 3]];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -