X264代码理解记录

本文记录了对X264编码器的理解,涉及typedef定义的函数指针类型在帧内预测中的应用,DC模式的扩展,DCT变换的结构体组织方式,以及16x16、8x8、4x4的DCT变换过程。此外,还探讨了P_Skip宏块的决定条件及其优化效果。
摘要由CSDN通过智能技术生成

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 ) >> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值