SVTAV1 编码函数 svt_aom_is_pic_skipped

函数 解释

1.1 svt_aom_is_pic_skipped函数的作用是判断当前图片是否可以跳过编码处理。

具体分析如下

函数逻辑

参数说明:函数接收一个指向图片父控制集的指针PictureParentControlSet *pcs, 通过这个指针可以获取与图片相关的各种信息,用于判断是否跳过对当前图片的编码处理。

判断条件:函数内部通过三个条件来决定是否跳过图片编码

!pcs->is_ref 表示当前图片不是参考帧,参考帧通常需要更严格的编码处理,因为它会被后续的其他帧引用进行预测,而非参考帧相对不那么关键,在某些条件下可以考虑跳过以节省编码时间

pcs->scs->rc_stat_gen_pass_mode 表示速率控制统计生成传递模式是否启用,在启用该模式时,编码器可能更注重收集统计信息而不进行完整的编码处理,此时跳过图片编码时合理的。

!pcs->first_frame_in_minigop 表示当前帧不是minigop中的第一帧。minigop是一种编码结构,其第一帧通常需要进行编码处理,而非第一帧在一定条件下可以跳过。

返回值:如果上述三个条件同时满足,则函数返回TRUE,表示可以跳过对当前图片的编码处理,否则返回,FALSE,表示需要对当前图片进行编码处理。

函数意义

提高编码效率:在某些特定的编码模式或场景下,如非参考帧,开启速率控制统计生成传递模式且非minigop第一帧时,跳过对当前图片的编码处理可以减少编码器的计算量,从而提高整体编码效率,节省编码时间。

优化资源分配:通过跳过部分相对不关键的图片编码,编码器可以将更多的计算资源集中在更重要的图片或编码任务上,从而在保证整体编码质量的前提下,实现资源的更优分配,提升编码性能。

1.2 svt_aom_motion_estimation_b64

在AV1编码中,最大编码块Superblock的大小为128x128对于亮度分量,色度分量的最大尺寸为64x64,但svt_aom_motion_estimation_b64 函数用于对64x64块进行运动估计,主要是有以下原因:

64x64块石常见的编码单元:

虽然AV1支持最大128x128的编码块,但在实际编码过程中,64x64块也是一个常用的编码单元,许多编码器在进行运动估计等操作时,会以64x64块为基本单位。这种块大小在编码效率和计算复杂度之间取得了较好的平衡。

符合编码结构层次:

AV1的编码结构时分层的,128x128的编码块可以进一步划分为更小的块,如64x64,32x32等。svt_aom_motion_etimation_b64函数针对64x64块进行运动估计,是整个编码过程的一部分,后续这些64x64块的运动估计结果可以用于更大块的运动估计,或者为更小块的运动估计提供参考和指导。

运动估计的精度和效率考量:

使用64x64块进行运动估计可以在一定程度上平衡运动估计的精度和效率。64x64块相对较小,能够捕捉到更细致的运动信息,有助于提高运动估计的精度,从而提高编码质量。同时,与更小的块(如32x32,16x16等)相比,64x64块的运动估计计算量相对较小,可以在保证一定精度的同时,减少计算复杂度,提高编码效率。

与参考帧数据的匹配:

在运动估计过程中,需要将当前块鱼参考帧中的相应区域进行比较。64x64块的大小与参考帧中存储的数据结构和块大小相匹配,便于进行块匹配操作,提高运动估计的效率和准确性。

支持多种编码模式:

AV1支持多种编码模式和预测策略,64x64块的运动估计结果可以为不同的编码模式提供支持,例如,在帧间预测中,可以根据64x64块的运动矢量选择合适的预测模式,如单向预测,双向预测等,进一步提高编码效率。

相关推荐
秋难降12 分钟前
贪心算法:看似精明的 “短视选手”,用好了也能逆袭!💥
java·算法
没故事的燕同学19 分钟前
C++递推
算法
一只自律的鸡23 分钟前
STL之vector
开发语言·c++·算法
GEEK零零七1 小时前
Leetcode 159. 至多包含两个不同字符的最长子串
算法·leetcode·滑动窗口
MindTechBuilder1 小时前
实时通信的深度技术剖析
算法
似水এ᭄往昔2 小时前
【数据结构】——二叉树--链式结构
数据结构·算法
地平线开发者2 小时前
征程 6X VDSP 调试方法
算法·车载系统·自动驾驶
Ymmmm__2 小时前
leetcode动态规划—买卖股票系列
算法·leetcode·动态规划
极光雨雨2 小时前
【算法】贪心算法
算法·贪心算法
asom222 小时前
LeetCode Hot100(动态规划)
算法·leetcode·动态规划