void x264_BIT_DEPTH_predict_8x8c_h_c( pixel *src ) //
{
for( int i = 0; i < 8; i++ )//for循环8行
{
pixel4 v = ((src[-1])*0x01010101U); //4个像素都是 1个字节的,拼接到一起
(((x264_union32_t*)(src+0))->i) = v; //横向赋值给一行的前4字节
(((x264_union32_t*)(src+4))->i) = v; //横向赋值给一行的后4字节
src += 32; //换到下一行
}
}
void x264_BIT_DEPTH_predict_8x8c_v_c( pixel *src )
{
pixel4 v0 = (((x264_union32_t*)(src+0-32))->i); //-32是颜色像素数据的偏移,一行的前4字节
pixel4 v1 = (((x264_union32_t*)(src+4-32))->i); //-32是颜色像素数据的偏移,一行后 4字
for( int i = 0; i < 8; i++ ) //8行数据,垂直赋值下来
{
(((x264_union32_t*)(src+0))->i) = v0; //垂直一行的前4字节
(((x264_union32_t*)(src+4))->i) = v1; //垂直一行的后4字节
src += 32;
}
}
void x264_BIT_DEPTH_predict_8x8c_dc_c( pixel *src )
{
int s0 = 0, s1 = 0, s2 = 0, s3 = 0;
for( int i = 0; i < 4; i++ )
{ //stride size = 32
s0 += src[i - 32]; //上一行的前4字节
s1 += src[i + 4 - 32]; //上一行的后4字节
s2 += src[-1 + i * 32]; //这一行的最前面一个像素
s3 += src[-1 + (i+4)*32]; //跳过了4行
}
pixel4 dc0 = ((( s0 + s2 + 4 ) >> 3)*0x01010101U); //构造4个横向字节 前
pixel4 dc1 = ((( s1 + 2 ) >> 2)*0x01010101U); //构造右边横向4字节 后
pixel4 dc2 = ((( s3 + 2 ) >> 2)*0x01010101U); //构造第4行前4个字节
pixel4 dc3 = ((( s1 + s3 + 4 ) >> 3)*0x01010101U); //构造第4行 后4个字节
for( int y = 0; y < 4; y++ ) //按照上面的结果进行赋值
{
(((x264_union32_t*)(src+0))->i) = dc0; //前面四行,都是dc0和dc1 拼成一行
(((x264_union32_t*)(src+4))->i) = dc1;
src += 32;
}
for( int y = 0; y < 4; y++ ) //后4行的像素,通过dc2和dc3 像素赋值
{
(((x264_union32_t*)(src+0))->i) = dc2; //后面四行,都是dc2和dc3 拼成一行
(((x264_union32_t*)(src+4))->i) = dc3;
src += 32;
}
}