接口
- 作用:libaom 源码的接口,按照结构体指针函数的形式进行了抽象和封装,使得编码和解码过程应用更加简单很方便。
#ifndef VERSION_STRING
#define VERSION_STRING
#endif
aom_codec_iface_t aom_codec_av1_cx_algo = {
"AOMedia Project AV1 Encoder" VERSION_STRING,
AOM_CODEC_INTERNAL_ABI_VERSION,
(CONFIG_AV1_HIGHBITDEPTH ? AOM_CODEC_CAP_HIGHBITDEPTH : 0) |
AOM_CODEC_CAP_ENCODER | AOM_CODEC_CAP_PSNR,
encoder_init,
encoder_destroy,
encoder_ctrl_maps,
{
NULL,
NULL,
NULL,
NULL,
NULL
},
{
NELEMENTS(encoder_usage_cfg),
encoder_usage_cfg,
encoder_encode,
encoder_get_cxdata,
encoder_set_config,
encoder_get_global_headers,
encoder_get_preview
},
encoder_set_option
};
aom_codec_iface_t *aom_codec_av1_cx(void) {
return &aom_codec_av1_cx_algo; }
- 编码端核心函数指针:aom_codec_init_fn_t、aom_codec_destroy_fn_t、aom_codec_encode_fn_t、aom_codec_get_cx_data_fn_t
- 接口关系:

初始化
- 作用:编码器的初始化工作,对各类数据结构体的初始化。
- 初始化关系图:

- 核心函数概述:
- encoder_init:完成 libaom 编码器的各类初始化工作,内部主要调用 av1_initialize_enc、 validate_config、av1_create_primary_compressor 、create_stats_buffer 、av1_create_context_and_bufferpool 等函数完成各类初始化工作。
编码
- 功能:完成 AV1 编码格式的核心编码过程,包括预测、变换、量化、熵编码等过程。
- 编码流程图:

- 核心函数概述:
- encoder_encode:该函数是实现 AV1 编码的核心部分,av1_receive_raw_frame函数将原始帧送进编码器中,av1_get_compressed_data/av1_compress_parallel_frames(并行时)函数完成核心编码,将原始帧数据编码成流视频;此外还有一些初始化、多线程、参考帧管理、码率控制等工作。
- av1_get_compressed_data :该函数用于执行实际的编码工作并获取压缩后的数据;其中核心是av1_encode_strategy函数,此外还有 SVC 相关设置等。
- av1_encode_strategy:该函数负责根据编码策略处理编码任务,完成编码主任务;内部根据是否是实时编码,调用av1_encode或denoise_and_encode函数;此外还有一些svc、参考帧设置、多 pass 编码、屏幕内容编码设置等设置工作。
- av1_encode:该函数处理从帧设置到编码执行的整个流程,确保了编码过程的正确性和效率;如果是多 pass 编码,第一遍编码需要调用av1_first_pass函数进行统计生成相关,调用encode_frame_to_data_rate函数完成实际编码工作。
- encode_frame_to_data_rate :该函数负责执行最终的编码传递,并将编码后的数据打包成比特流;内部核心是调用encode_with_recode_loop_and_filter函数完成工作,此外还有 svc丢帧处理、超分处理、码控模式处理逻辑等工作。
- encode_with_recode_loop_and_filter:负责执行编码循环、后处理滤波和比特流构建;调用encode_without_recode/encode_with_recode_loop函数完成编码工作,loopfilter_frame函数循环滤波处理,av1_finalize_encoded_frame比特流构建,此外还有帧扩边、计算速率、psnr 等工作。
- encode_without_recode:执行编码工作,内部核心调用av1_encode_frame函数完成实际编码工作;此外还包含了对帧尺寸调整、量化器设置、速度特征设置等多个关键步骤的处理,函数还处理了编码后帧的后处理,包括循环滤波器和噪声估计更新。
- av1_encode_frame :设置参考帧和编码一帧,核心编码工作是调用 encode_frame_internal 函数。
- encode_frame_internal :对当前帧进行编码设置,即编码和重构,核心是调用encode_tiles函数完成。
- encode_tiles:双层 for遍历一帧所有的 Tile 进行编码,将一帧分成所有的 Tile,然后调用av1_encode_tile函数对每个 Tile 进行编码。
- av1_encode_tile:编译一个 Tile,单次 for 循环遍历当前 Tile 中所有超块行,并为每一行调用 av1_encode_sb_row 函数进行编码。
- av1_encode_sb_row:编码一行中超块,核心是调用 encode_sb_row 函数完成。
- encode_sb_row:编码一个超块,内部根据是否启用 RD 模式,分别调用 encode_nonrd_sb 或 encode_rd_sb 函数完成超块的编码。
- encode_nonrd_sb:非 RD 模式下超块的编码,
- av1_nonrd_use_partition:非 rd 模式下一个超块内分区搜索编码,内部根据不同的分区依次调用pick_sb_modes_nonrd预测、encode_b_nonrd编码工作。
- pick_sb_modes_nonrd:帧预测模块函数,包含帧内预测hybrid_intra_mode_search函数和帧间预测av1_nonrd_pick_inter_mode_sb函数。
- encode_b_nonrd:编码预测后的帧,核心是调用encode_superblock函数。
- hybrid_intra_mode_search:帧内预测模块函数。
- av1_nonrd_pick_inter_mode_sb:帧间预测模块函数。
- encode_superblock:预测结束后编码函数。
销毁
- 功能:编码结束,负责销毁编码器上下文的工作。
- 关系图:

- 核心函数概述:
- encoder_destroy:该函数是编码器资源管理的一部分,确保在编码器不再使用时,所有分配的资源都被正确释放,避免内存泄漏。其中 free 释放编码器私有数据,destroy_extra_config销毁额外配置,free 循环释放parallel_frames_data成员数据,av1_destroy_context_and_bufferpool销毁上下文和缓存池,av1_remove_primary_compressor移除主压缩器,destroy_stats_buffer销毁统计缓存,aom_free释放编码器上下文。