3_29

1.main中函数

对于最开始的这个结构体进行系统内默认的设置  在JM中对于这些信息都是通过config文件进行配置,x264对于很多信息进行删减,然后这很大一部分信息其实都直接写入了这个param,但是param也只限于在这里进行读入argv时候的一些初始化赋值,后面有一个x264_t结构体才是真正可以在Encode过程中全局存在的一个结构体,囊括所有的编码过程中国许的信息

x264_param_default(&param); 

对读入的argv进行分析。然后对剩余的一些信息进行赋值 ,对于部分的一些需要存储信息的位置进行内存分配 ,这里设置level x264好像只可以支持 main level

Parse()

Encode()

所有的编码过程都在Encode中进行

作用其实就是对于VCL和NAL数据包的设置

下面是主函数流程图

                       

开始由于文件已经设置和读入一些参数了,文件指针已经设置完成了,在Encode线进行了一些yuv文件分离,和其他一些参数设置后便开始循环的对于每一帧进行编码

Encode_frame()   //对于每一帧进行编码

最底层的两个结构体

typedef struct

{

    /* conduct the analysis using this lamda and QP */

    int i_lambda;              //这个值给了91  应该和图像的尺寸有关系  经过扩张的16的倍数

    int i_lambda2;   //1887436

    int i_qp;           应该是色度值 p20有对于量化值得解释 只是说了用多少位来表示   51

    int16_t *p_cost_mv;

    int i_mbrd;                   1

 

 

    /* I: Intra part */

    /* Take some shortcuts in intra search if intra is deemed unlikely */

    int b_fast_intra;

    int b_try_pskip;

 

    /* Luma part */

    int i_satd_i16x16;

    int i_satd_i16x16_dir[7];

    int i_predict16x16;

 

    int i_satd_i8x8;

    int i_satd_i8x8_dir[12][4];

    int i_predict8x8[4];

 

    int i_satd_i4x4;

    int i_predict4x4[16];

 

    int i_satd_pcm;

 

    /* Chroma part */

    int i_satd_i8x8chroma;

    int i_satd_i8x8chroma_dir[4];

    int i_predict8x8chroma;

 

    /* II: Inter part P/B frame */

    x264_mb_analysis_list_t l0;

    x264_mb_analysis_list_t l1;

 

    int i_cost16x16bi; /* used the same ref and mv as l0 and l1 (at least for now) */

    int i_cost16x16direct;

    int i_cost8x8bi;

    int i_cost8x8direct[4];

    int i_cost16x8bi;

    int i_cost8x16bi;

    int i_rd16x16bi;

    int i_rd16x16direct;

    int i_rd16x8bi;

    int i_rd8x16bi;

    int i_rd8x8bi;

 

    int i_mb_partition16x8[2]; /* mb_partition_e */

    int i_mb_partition8x16[2];

    int i_mb_type16x8; /* mb_class_e */

    int i_mb_type8x16;

 

    int b_direct_available;

 

} x264_mb_analysis_t;

首先进行的是x264_macroblock_analyse()进行帧内预测 和帧间预测 即运动估计,保存运动矢量

然后就是x264_macroblock_encode()函数对于intra模式的宏块计算参差,对inter模式的宏块先进行运动补偿后计算残差,对残差进行参数变换,量化,zig-zag扫描排序后,用4x4子块参数的形式保存在若干个一维数组中(以供熵编码);原量化后的DCT系数矩阵在反量化,IDCT后得到与解码段同步的重建帧f_dec

宏块预测完成后 产生的预测块 然后根据一项误差值(SAE定义了每种预测的预测误差值)来判断使用哪一种预测方式

这个还是帧层进行编码 

首先确定帧的类型

1.帧存储问题  x264_frame_get() 和 x264_frame_copy_picture() 读入一帧新的画面存储在临时指针fenc 指向的存储单元   然后x264_frame_puc() 将fenc加入到临时指针队列 h->frames.next[]中;

因为可能有自适应帧类型,故在调用x264_slicetype_decide() 决定这个h->frames.next[]的类型。

帧间和帧内编码自动判断准则

一般可根据帧间相关性进行判断,相关性大泽采用帧间编码,帧间相关性可用当前帧与过去帧的对应像素差的均方值表示   4.2.2.2。食品信源编码器 小节里面介绍的比较详细

这样可以得到一个var值  通过var值判断 大于64时候采用帧间编码,大于64的时候一般可采用帧内模式。 

图中小于六和大于七部分应该是对应的判断到底使用哪一个

原文地址:https://www.cnblogs.com/hatreds/p/2423770.html