2021-4-12
关于typedef定义的函数指针类型
//DJ: 函数指针的定义,相当于是 void (*x264_predict_t)( uint8_t *src, int i_stride )
//DJ: 但是用typedef和直接这样定义是有很大区别的,区别在于
//DJ: typedef是定义了一个指向该函数的指针的类型
//DJ: 而前者是直接定义了一个指针
//DJ: 注意:一个是类型,一个是指针。定义了类型之后可以用来声明更多的指针变量。
typedef void (*x264_predict_t)( uint8_t *src, int i_stride );
//Dj: 因为定义的是类型,所以可以在之后方便的定义许多相同返回值和形参的函数指针
x264_predict_t predict_16x16[4+3];
//保存七种16x16帧内预测模式对应的函数
x264_predict_t predict_8x8c[4+3];
x264_predict8x8_t predict_8x8[9+3];
x264_predict_t predict_4x4[9+3];
关于帧内预测
// 16x16 prediction for intra block DC, H, V, P
//DJ: HEVC的帧内亮度16x16预测共有四种模式:H(Horizontal)、V(Vertical)、DC(Direct-Current)、P(Plane)
static void predict_16x16_dc( uint8_t *src, int i_stride )
static void predict_16x16_dc_left( uint8_t *src, int i_stride )
static void predict_16x16_dc_top( uint8_t *src, int i_stride )
static void predict_16x16_dc_128( uint8_t *src, int i_stride )
static void predict_16x16_h( uint8_t *src, int i_stride )
static void predict_16x16_v( uint8_t *src, int i_stride )
static void predict_16x16_p( uint8_t *src, int i_stride )
相对于教材上写的,DC模式多了三种。
其中dc_left只取左边一列的平均值,dc_top只计算上面一行的平均值,dc_128直接赋值为128
只解释其中一个:
static void predict_16x16_dc( uint8_t *src, int i_stride )
{
int dc = 0;
int i, j;
/* calculate DC value */
//DJ: 计算过程:16x16像素块的上方一行像素值和左方一列像素值的平均值
for( i = 0; i < 16; i++ )
{
dc += src[-1 + i * i_stride]; //DJ: 左方一列像素值之和
dc += src[i - i_stride]; //DJ: 上方一行像素值之和
}
dc = ( dc + 16 ) >>