接口作用libaom 源码的接口按照结构体指针函数的形式进行了抽象和封装使得编码和解码过程应用更加简单很方便。// This data structure and function are exported in aom/aomcx.h#ifndefVERSION_STRING#defineVERSION_STRING#endifaom_codec_iface_taom_codec_av1_cx_algo{AOMedia Project AV1 EncoderVERSION_STRING,AOM_CODEC_INTERNAL_ABI_VERSION,(CONFIG_AV1_HIGHBITDEPTH?AOM_CODEC_CAP_HIGHBITDEPTH:0)|AOM_CODEC_CAP_ENCODER|AOM_CODEC_CAP_PSNR,// aom_codec_caps_tencoder_init,// aom_codec_init_fn_tencoder_destroy,// aom_codec_destroy_fn_tencoder_ctrl_maps,// aom_codec_ctrl_fn_map_t{// NOLINTNULL,// aom_codec_peek_si_fn_tNULL,// aom_codec_get_si_fn_tNULL,// aom_codec_decode_fn_tNULL,// aom_codec_get_frame_fn_tNULL// aom_codec_set_fb_fn_t},{// NOLINTNELEMENTS(encoder_usage_cfg),// cfg_countencoder_usage_cfg,// aom_codec_enc_cfg_tencoder_encode,// aom_codec_encode_fn_tencoder_get_cxdata,// aom_codec_get_cx_data_fn_tencoder_set_config,// aom_codec_enc_config_set_fn_tencoder_get_global_headers,// aom_codec_get_global_headers_fn_tencoder_get_preview// aom_codec_get_preview_frame_fn_t},encoder_set_option// aom_codec_set_option_fn_t};aom_codec_iface_t*aom_codec_av1_cx(void){returnaom_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释放编码器上下文。
libaom 源码分析:编码过程核心函数概述
接口作用libaom 源码的接口按照结构体指针函数的形式进行了抽象和封装使得编码和解码过程应用更加简单很方便。// This data structure and function are exported in aom/aomcx.h#ifndefVERSION_STRING#defineVERSION_STRING#endifaom_codec_iface_taom_codec_av1_cx_algo{AOMedia Project AV1 EncoderVERSION_STRING,AOM_CODEC_INTERNAL_ABI_VERSION,(CONFIG_AV1_HIGHBITDEPTH?AOM_CODEC_CAP_HIGHBITDEPTH:0)|AOM_CODEC_CAP_ENCODER|AOM_CODEC_CAP_PSNR,// aom_codec_caps_tencoder_init,// aom_codec_init_fn_tencoder_destroy,// aom_codec_destroy_fn_tencoder_ctrl_maps,// aom_codec_ctrl_fn_map_t{// NOLINTNULL,// aom_codec_peek_si_fn_tNULL,// aom_codec_get_si_fn_tNULL,// aom_codec_decode_fn_tNULL,// aom_codec_get_frame_fn_tNULL// aom_codec_set_fb_fn_t},{// NOLINTNELEMENTS(encoder_usage_cfg),// cfg_countencoder_usage_cfg,// aom_codec_enc_cfg_tencoder_encode,// aom_codec_encode_fn_tencoder_get_cxdata,// aom_codec_get_cx_data_fn_tencoder_set_config,// aom_codec_enc_config_set_fn_tencoder_get_global_headers,// aom_codec_get_global_headers_fn_tencoder_get_preview// aom_codec_get_preview_frame_fn_t},encoder_set_option// aom_codec_set_option_fn_t};aom_codec_iface_t*aom_codec_av1_cx(void){returnaom_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释放编码器上下文。