当我们要进行亮度帧内编码时,我们要知道象素A-M的亮度值,如下所示。
M A B C D E F G H
I a b c d
J e f g h
K i j k l
L m n o p
Figure 1 Labelling of prediction samples (4x4)
那当我们进行第一个图片的第一个宏块的第一个4x4的块进行帧内编码,也就是之前还没有已编码的宏块可用,我们是如何得到A-M的值的?
答案:
///
// make DC prediction
///
s0 = 0;
if (block_available_up && block_available_left)
{
// no edge
s0 = (P_A + P_B + P_C + P_D + P_I + P_J + P_K + P_L + 4)/(2*BLOCK_SIZE);
}
else if (!block_available_up && block_available_left)
{
// upper edge
s0 = (P_I + P_J + P_K + P_L + 2)/BLOCK_SIZE;
}
else if (block_available_up && !block_available_left)
{
// left edge
s0 = (P_A + P_B + P_C + P_D + 2)/BLOCK_SIZE;
}
else //if (!block_available_up && !block_available_left)
{
// top left corner, nothing to predict from
s0 = 128;
//搂主问的情况属于这一种,就是没有可用的参考象素时,只能采用这一种方法,将4×4块中的所有象素定为128(代码来源:JM86/lencod/src/block.c(234))
}
for (j=0; j < BLOCK_SIZE; j++)
{
for (i=0; i < BLOCK_SIZE; i++)
{
// store DC prediction
img->mprr[DC_PRED][i][j] = s0;
}
}