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块的运动矢量选择合适的预测模式,如单向预测,双向预测等,进一步提高编码效率。