?? cavlc.c
字號:
T264_predict_mv(t, 0, luma_index[4 * i + 3], 1, &vec);
eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i + 3]].x - vec.x);
eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i + 3]].y - vec.y);
break;
}
}
break;
default:
break;
}
}
else
{
switch (t->mb.mb_part)
{
case MB_16x16:
if (t->mb.is_copy != 1)
{
switch (t->mb.mb_part2[0])
{
case B_L0_16x16:
eg_write_ue(t->bs, 1);
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 B_L1_16x16:
eg_write_ue(t->bs, 2);
if (t->ps.num_ref_idx_l1_active_minus1 > 0)
{
eg_write_te(t->bs, t->ps.num_ref_idx_l1_active_minus1, t->mb.vec[1][0].refno);
}
vec = t->mb.vec[1][0];
T264_predict_mv(t, 1, 0, 4, &vec);
eg_write_se(t->bs, t->mb.vec[1][0].x - vec.x);
eg_write_se(t->bs, t->mb.vec[1][0].y - vec.y);
break;
case B_Bi_16x16:
eg_write_ue(t->bs, 3);
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);
}
if (t->ps.num_ref_idx_l1_active_minus1 > 0)
{
eg_write_te(t->bs, t->ps.num_ref_idx_l1_active_minus1, t->mb.vec[1][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);
vec = t->mb.vec[1][0];
T264_predict_mv(t, 1, 0, 4, &vec);
eg_write_se(t->bs, t->mb.vec[1][0].x - vec.x);
eg_write_se(t->bs, t->mb.vec[1][0].y - vec.y);
break;
}
}
else
{
eg_write_ue(t->bs, 0);
}
break;
case MB_16x8:
{
static int8_t mode_16x8[3][3] =
{
B_L0_L0_16x8, B_L0_L1_16x8, B_L0_Bi_16x8,
B_L1_L0_16x8, B_L1_L1_16x8, B_L1_Bi_16x8,
B_Bi_L0_16x8, B_Bi_L1_16x8, B_Bi_Bi_16x8
};
eg_write_ue(t->bs, mode_16x8[t->mb.mb_part2[0] - B_L0_16x8][t->mb.mb_part2[1] - B_L0_16x8]);
if (t->ps.num_ref_idx_l0_active_minus1 > 0)
{
if (t->mb.mb_part2[0] != B_L1_16x8)
eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][0].refno);
if (t->mb.mb_part2[1] != B_L1_16x8)
eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][8].refno);
}
if (t->ps.num_ref_idx_l1_active_minus1 > 0)
{
if (t->mb.mb_part2[0] != B_L0_16x8)
eg_write_te(t->bs, t->ps.num_ref_idx_l1_active_minus1, t->mb.vec[1][0].refno);
if (t->mb.mb_part2[1] != B_L0_16x8)
eg_write_te(t->bs, t->ps.num_ref_idx_l1_active_minus1, t->mb.vec[1][8].refno);
}
// l0
for (i = 0 ; i < 2 ; i ++)
{
switch(t->mb.mb_part2[i])
{
case B_L0_16x8:
vec = t->mb.vec[0][8 * i];
T264_predict_mv(t, 0, luma_index[8 * i], 4, &vec);
eg_write_se(t->bs, t->mb.vec[0][luma_index[8 * i]].x - vec.x);
eg_write_se(t->bs, t->mb.vec[0][luma_index[8 * i]].y - vec.y);
break;
case B_Bi_16x8:
vec = t->mb.vec[0][luma_index[8 * i]];
T264_predict_mv(t, 0, luma_index[8 * i], 4, &vec);
eg_write_se(t->bs, t->mb.vec[0][luma_index[8 * i]].x - vec.x);
eg_write_se(t->bs, t->mb.vec[0][luma_index[8 * i]].y - vec.y);
}
}
for (i = 0 ; i < 2 ; i ++)
{
switch(t->mb.mb_part2[i])
{
case B_L1_16x8:
vec = t->mb.vec[1][luma_index[8 * i]];
T264_predict_mv(t, 1, luma_index[8 * i], 4, &vec);
eg_write_se(t->bs, t->mb.vec[1][luma_index[8 * i]].x - vec.x);
eg_write_se(t->bs, t->mb.vec[1][luma_index[8 * i]].y - vec.y);
break;
case B_Bi_16x8:
vec = t->mb.vec[1][luma_index[8 * i]];
T264_predict_mv(t, 1, luma_index[8 * i], 4, &vec);
eg_write_se(t->bs, t->mb.vec[1][luma_index[8 * i]].x - vec.x);
eg_write_se(t->bs, t->mb.vec[1][luma_index[8 * i]].y - vec.y);
break;
}
}
}
break;
case MB_8x16:
{
static int8_t mode_8x16[3][3] =
{
B_L0_L0_8x16, B_L0_L1_8x16, B_L0_Bi_8x16,
B_L1_L0_8x16, B_L1_L1_8x16, B_L1_Bi_8x16,
B_Bi_L0_8x16, B_Bi_L1_8x16, B_Bi_Bi_8x16
};
eg_write_ue(t->bs, mode_8x16[t->mb.mb_part2[0] - B_L0_8x16][t->mb.mb_part2[1] - B_L0_8x16]);
if (t->ps.num_ref_idx_l0_active_minus1 > 0)
{
if (t->mb.mb_part2[0] != B_L1_8x16)
eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][0].refno);
if (t->mb.mb_part2[1] != B_L1_8x16)
eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][2].refno);
}
if (t->ps.num_ref_idx_l1_active_minus1 > 0)
{
if (t->mb.mb_part2[0] != B_L0_8x16)
eg_write_te(t->bs, t->ps.num_ref_idx_l1_active_minus1, t->mb.vec[1][0].refno);
if (t->mb.mb_part2[1] != B_L0_8x16)
eg_write_te(t->bs, t->ps.num_ref_idx_l1_active_minus1, t->mb.vec[1][2].refno);
}
// l0
for (i = 0 ; i < 2 ; i ++)
{
switch(t->mb.mb_part2[i])
{
case B_L0_8x16:
vec = t->mb.vec[0][2 * i];
T264_predict_mv(t, 0, luma_index[4 * i], 2, &vec);
eg_write_se(t->bs, t->mb.vec[0][2 * i].x - vec.x);
eg_write_se(t->bs, t->mb.vec[0][2 * i].y - vec.y);
break;
case B_Bi_8x16:
vec = t->mb.vec[0][2 * i];
T264_predict_mv(t, 0, luma_index[4 * i], 2, &vec);
eg_write_se(t->bs, t->mb.vec[0][2 * i].x - vec.x);
eg_write_se(t->bs, t->mb.vec[0][2 * i].y - vec.y);
}
}
for (i = 0 ; i < 2 ; i ++)
{
switch(t->mb.mb_part2[i])
{
case B_L1_8x16:
vec = t->mb.vec[1][2 * i];
T264_predict_mv(t, 1, luma_index[4 * i], 2, &vec);
eg_write_se(t->bs, t->mb.vec[1][2 * i].x - vec.x);
eg_write_se(t->bs, t->mb.vec[1][2 * i].y - vec.y);
break;
case B_Bi_8x16:
vec = t->mb.vec[1][2 * i];
T264_predict_mv(t, 1, luma_index[4 * i], 2, &vec);
eg_write_se(t->bs, t->mb.vec[1][2 * i].x - vec.x);
eg_write_se(t->bs, t->mb.vec[1][2 * i].y - vec.y);
break;
}
}
}
break;
case MB_8x8:
{
eg_write_ue(t->bs, 22);
for (i = 0 ; i < 4 ; i ++)
{
if (t->mb.sub_is_copy[i] != 1)
{
switch (t->mb.submb_part[luma_index[4 * i]])
{
case B_L0_8x8:
eg_write_ue(t->bs, 1);
break;
case B_L1_8x8:
eg_write_ue(t->bs, 2);
break;
case B_Bi_8x8:
eg_write_ue(t->bs, 3);
break;
default:
assert(0);
break;
}
}
else
{
eg_write_ue(t->bs, 0);
break;
}
}
if (t->ps.num_ref_idx_l0_active_minus1 > 0)
{
for (i = 0 ; i < 4 ; i ++)
{
if (t->mb.submb_part[luma_index[4 * i]] != 2 && t->mb.submb_part[luma_index[4 * i]] != 0)
eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][4 * i].refno);
}
}
if (t->ps.num_ref_idx_l1_active_minus1 > 0)
{
for (i = 0 ; i < 4 ; i ++)
{
if (t->mb.submb_part[luma_index[4 * i]] != 1 && t->mb.submb_part[luma_index[4 * i]] != 0)
eg_write_te(t->bs, t->ps.num_ref_idx_l1_active_minus1, t->mb.vec[1][4 * i].refno);
}
}
// l0
for (i = 0 ; i < 4 ; i ++)
{
switch(t->mb.submb_part[luma_index[4 * i]])
{
case B_L0_8x8:
case B_Bi_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;
}
}
for (i = 0 ; i < 4 ; i ++)
{
switch(t->mb.submb_part[luma_index[4 * i]])
{
case B_L1_8x8:
case B_Bi_8x8:
vec = t->mb.vec[1][luma_index[4 * i]];
T264_predict_mv(t, 1, luma_index[4 * i], 2, &vec);
eg_write_se(t->bs, t->mb.vec[1][luma_index[4 * i]].x - vec.x);
eg_write_se(t->bs, t->mb.vec[1][luma_index[4 * i]].y - vec.y);
break;
}
}
}
break;
}
}
eg_write_ue(t->bs, inter_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);
}
}
}
}
if (t->mb.cbp_c != 0)
{
block_residual_write_cavlc(t, BLOCK_INDEX_CHROMA_DC, t->mb.dc2x2_z[0], 4);
block_residual_write_cavlc(t, BLOCK_INDEX_CHROMA_DC, t->mb.dc2x2_z[1], 4);
if (t->mb.cbp_c & 0x2)
{
for(i = 0 ; i < 8 ; i ++)
{
block_residual_write_cavlc(t, 16 + i, &(t->mb.dct_uv_z[i / 4][i % 4][1]), 15);
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -