homerHEVC代码阅读(24)——编码器控制函数HOMER_enc_control

这个函数比较长,功能也比较多,下面说一下它的运行流程:
1、获取HEVC的配置对象
2、设置merge模式中的候选数量
3、设置比特流的长度
4、如果编码器正在运行,那么让所有的线程停止运行
5、设置最大的层为1,设置最大的子层为1
6、设置GOP的大小,如果intra_period等于1,那么GOP大小也等于1,否则GOP大小等于intra_period加1
7、设置参考帧的数量
8、设置CTU(编码树单元)的宽和高(亮度和色度分量)
9、设置编码器引擎的数量
10、sao初始化
11、为各个参数集分配比特流
12、设置短期参考图像集的数量,等于GOP的大小加1
13、参考图像列表初始化
14、设置短期参考图像:
    (1)在目前的编码器版本中,只有I帧和P帧,没有B帧,因此帧间预测都是前向预测,即只使用一个参考列表
    (2)设置num_negative_pics等于参考帧的数量(前向预测),并设置参考帧相对于当前的poc
    (3)设置num_positive_pics等于0(后向预测)
15、依次创建每一个编码器引擎:
    (1)分配引擎所需的内存
    (2)设置引擎的索引
    (3)设置帧率
    (4)根据wfpp线程的数量决定子比特流的数量
    (5)销毁各个信号量
    (6)创建信号量
    (7)设置每一帧的CTU(色度和亮度分量)的尺寸
    (8)设置性能模式
    (9)设置率失真模式、比特率模式、比特流的长度
    (10)创建比特流
    (11)设置最大的预测深度
    (12)根据像素模式(整像素、半像素)来设置运动估计的精度
    (13)设置merge模式中mvp的候选数量
    (14)设置变换树的深度
    (15)设置各种常用的表格(table)、设置cu和pu的一些默认信息
    (16)一致性窗口方面的设置(其实就是图像边缘填充,让图像宽和高达到完整的LCU倍数)
    (17)开启一致性模式
    (18)设置经过填充之后的图像宽和高
    (19)如果没有开启wfpp功能,那么子比特流的数量是1;否则等于一帧中CTU的行数
    (20)设置wfpp线程的数量。如果没有开启wfpp功能,那么就只开启一个wfpp线程,此时wfpp就是常规的进行预测变换量化等操作;如果开启了wfpp功能,而且配置中wfpp线程数量小于子比特流的数量,那么wfpp线程的数量就等于配置中的数量,否则等于子比特流的数量。
    (21)如果开启了wfpp功能,那么每一个wfpp线程都有一个算数编码器,否则当前引擎只有一个算数编码器
    (22)初始化熵编码器的上下文、设置熵编码器的函数;初始化比特计数将的上下文、设置比特计数器的函数
    (23)计算一个图像在横向和纵向上有多少个CTU,计算一个图像有多少个CTU
    (24)分配并设置CTU信息。分配并初始化CTU的划分信息列表,每一个CTU最多可以划分成256份,每一份的每一个分量都有一个CBF(编码块标志);设置帧内预测模式的相关信息;设置帧间预测模式的相关信息;分配跳过标志、merge模式、划分类型等变量的内存;分配mv参考的内存,分配mv残差的内存;分配系数窗口。
    (25)创建wfpp线程对象,设置相应的上下文。注意没有真在的创建线程,wfpp线程会在引擎线程函数当中被创建。
16、视频参数集的设置、序列参数集的设置、图像参数集的设置
17、编码器引擎线程的创建

你可能感兴趣的:(h.265,视频编码,HEVC)