libaom 源码分析: 预测编码过程梳理
AV1 预测编码中核心技术AV1AOMedia Video 1作为一种开源的视频编码格式其预测编码核心技术主要包括以下几个方面分区树分割模块AV1利用多类型分割模式递归地对图像/视频序列进行分区以捕捉更丰富的空间信息从而提升编码效率。这包括新的方向预测分割模式及非参数方向分割线显著增强了分割灵活性并可为整体码率节省带来高达20%的编码增益。动态时空运动矢量参考AV1结合了复杂的运动矢量MV参考选择方案通过搜索空间和时间候选对象来获得给定块的良好MV参考。这个过程包括运动矢量缓冲、运动轨迹创建和运动矢量投影三个阶段以提高运动矢量编码的准确性和效率。重叠块运动补偿OBMCAV1使用OBMC技术通过融合相邻块的运动矢量预测减少方块效应提高预测的准确性。仿射运动补偿AV1支持仿射运动补偿可以处理更复杂的运动模式如旋转和缩放适用于快速移动的对象。楔形预测AV1引入了基于楔形的预测模式通过预定义的二维权重数组来进行预测以适应块内部的运动矢量场。复合预测AV1支持使用两个参考帧进行复合预测其中包括常规复合预测和基于楔形的复合预测模式。变形运动补偿AV1利用变形运动模型允许每个像素根据其在块中的位置有不同的运动补偿权重以适应复杂的运动场景。帧内预测技术AV1在帧内预测方面进行了显著的增强和扩展支持更多细化的角度模式从VP9的10种模式扩展到了56种模式并且还新增了多种非角度模式如Smooth模式、DC模式、Paeth模式、CFL模式、调色板模式以及基于递归滤波的预测模式。libaom 相关源码分析函数关系及相关文件预测编码核心点介绍备注libaom 预测编码过程还是比较复杂算法模块比较多简单备注下过程梳理编码的接口函数是encoder_encode完成从 YUV 到流的整体过程。2pass 编码中第一遍编码在av1_encode函数通过变量控制进入第一遍编码流程核心函数是av1_first_pass/av1_noop_first_pass_frame带有超分编码在encode_frame_to_data_rate函数中通过调用encode_with_and_without_superres函数来进行带有超分类型的编码逻辑。多次编码实现目标码率根据是否需要目标码率控制分别调用encode_with_recode_loop、encode_without_recode函数进行不同类型编码内部核心都是调用av1_encode_frame 函数。线程编码控制根据编码是否开启多线程控制在encode_frame_internal函数中根据线程控制类型分别调用av1_encode_tiles_row_mt、av1_encode_tiles_mt、encode_tiles。是否开启 RD 编码在实际编码一行超块encode_sb_row函数中根据是否开启 RD 功能分别调用encode_nonrd_sb、encode_rd_sb进行不同类型的编码。搜索分区方式控制编码在 encode_rd_sb 函数中根据搜索分区方式 SEARCH_PARTITION、VAR_BASED_PARTITION、FIXED_PARTITION 分别调用av1_rd_use_partition、av1_rd_pick_partition 函数进行分区搜索。分区类型不同编码根据不同分区类型调用不同的实现函数按照分区类型分别调用 none_partition_search、split_partition_search、rectangular_partition_search、ab_partitions_search、rd_pick_4partition 函数来实现不同分区情况下的预测编码。帧内预测编码在每个分区内都会调用pick_sb_modes 函数其中调用 av1_rd_pick_intra_mode_sb函数完整帧内预测编码过程。帧间编码在每个分区内都会调用pick_sb_modes 函数其中调用av1_rd_pick_inter_mode 函数完成帧间预测编码。帧间 skip 模式编码skip_inter_mode 函数完成帧间 skip 模式预测编码过程。帧间非 skip 模式编码handle_inter_mode 函数完成帧间非 skip 模式预测编码过程。运动模式不同编码根据运动模式不同进行不同方式的帧间运动搜索方式运动模式主要有 、SIMPLE_TRANSLATION、OBMC_CAUSAL、WARPED_CAUSAL。像素搜索方式在av1_full_pixel_search函数中完成像素搜索方式其中有不同的搜索模版函数搜索模板有 dia、hex、square 等。部分关键数据体介绍块尺寸分区类型运动模式帧间帧内模式滤波帧内模式亮度预测模式色度预测模式CfL 相关类型控制复合类型分区搜索类型分像素搜索方法