AV1 Encoder源码剖析(一)
2023-12-17 本文已影响0人
yongbaoqiji
1. AV1接口
AV1的对外接口,按照结构体函数指针形式进行了抽象和封装。主要包括编解码器上下文初始化,编解码options参数设置,封成map形式的控制接口接口,以及编码、解码主体函数,销毁等。
主要包含:
- aom_codec_init_fn_t
- aom_codec_set_option_fn_t
- aom_codec_destroy_fn_t
- aom_codec_ctrl_fn_map_t
- aom_codec_encode_fn_t
- aom_codec_enc_config_set_fn_t
- aom_codec_decode_fn_t
2. AV1初始化
AV1的编码主要结构体的创建和参数赋值。
image.png如上图,encoder_init主要调用的函数简化示意,完成的主要功能是,上图右侧不同数据结构体的初始化。
主要执行函数:
- set_encoder_config AV1EncoderConfig的初始化。
- av1_create_primary_compressor AV1_PRIMARY、seq_params序列参数,PRIMARY_RATE_CONTROL码控参数、sad系列函数的初始化。
- av1_create_context_and_bufferpoll主要完成AV1_COMP的初始化。
涉及的结构体:
- aom_codec_ctx_t 包含了aom_codec_iface_t,aom_codec_alg_priv_t ,aom_codec_enc_cfg等,是第一节中接口的主要上下文参数。
- aom_codec_enc_cfg 编码器共有的常规编码参数。
- aom_codec_alg_priv_t 包含了aom_codec_enc_cfg_t,AV1EncoderConfig,AV1_PRIMARY,AV1_COMMON等,可认为包含了AV1算法部分的重要的私有参数数据。
- AV1EncoderConfig 编码器核心配置,细分了很多不同配置,码控、量化、关键帧,Tile,参考帧、运动模式、多次pass编码、profile,质量/RealTime等。
- AV1_COMMON 编码帧宽高,pts,CurrentFrame等。
-
AV1_PRIMARY 帧级别编码器层顶层结构(Array of frame level encoder stage top level structures),包含了
多个struct AV1_COMP_DATA帧数据容器(线程并行数)、ThreadData等。 - AV1_COMP 包含在AV1_PRIMARY中,同时引用了AV1_PRIMARY和包含了AV1EncoderConfig实例,在av1_create_compressor完成的初始化。从av1_get_compressed_data函数开始作为编码上下文主要参数。
重要的数据结构简要:
- \ref AV1_PRIMARY
- \ref AV1_PRIMARY.gf_group (\ref GF_GROUP)
- \ref AV1_PRIMARY.lap_enabled
- \ref AV1_PRIMARY.twopass (\ref TWO_PASS)
- \ref AV1_PRIMARY.p_rc (\ref PRIMARY_RATE_CONTROL)
- \ref AV1_PRIMARY.tf_info (\ref TEMPORAL_FILTER_INFO)
- \ref AV1_COMP
- \ref AV1_COMP.oxcf (\ref AV1EncoderConfig)
- \ref AV1_COMP.rc (\ref RATE_CONTROL)
- \ref AV1_COMP.speed
- \ref AV1_COMP.sf (\ref SPEED_FEATURES)
- \ref AV1EncoderConfig (Encoder configuration parameters)
- \ref AV1EncoderConfig.pass
- \ref AV1EncoderConfig.algo_cfg (\ref AlgoCfg)
- \ref AV1EncoderConfig.kf_cfg (\ref KeyFrameCfg)
- \ref AV1EncoderConfig.rc_cfg (\ref RateControlCfg)
- \ref AlgoCfg (Algorithm related configuration parameters)
- \ref AlgoCfg.arnr_max_frames
- \ref AlgoCfg.arnr_strength
- \ref KeyFrameCfg (Keyframe coding configuration parameters)
- \ref KeyFrameCfg.enable_keyframe_filtering
- \ref RateControlCfg (Rate control configuration)
- \ref RateControlCfg.mode
- \ref RateControlCfg.target_bandwidth
- \ref RateControlCfg.best_allowed_q
- \ref RateControlCfg.worst_allowed_q
- \ref RateControlCfg.cq_level
- \ref RateControlCfg.under_shoot_pct
- \ref RateControlCfg.over_shoot_pct
- \ref RateControlCfg.maximum_buffer_size_ms
- \ref RateControlCfg.starting_buffer_level_ms
- \ref RateControlCfg.optimal_buffer_level_ms
- \ref RateControlCfg.vbrbias
- \ref RateControlCfg.vbrmin_section
- \ref RateControlCfg.vbrmax_section
3. AV1编码流程
3.1 encoder_encode
encoder_encode函数是av1编码的核心内容部分。
av1 encode.png主要步骤:
- av1_lookahead_init 包含lookahead ctx, buffer的初始化。
- av1_receive_raw_frame 根据开关判断是否开启降噪(av1_estimate_noise_level、apply_denoise_2d),然后执行av1_lookahead_push放入lookahead缓存(a fixed-size circular buffer)。
- av1_create_workers/av1_init_tile_thread_data 多线程编码相关初始化。
- av1_get_compressed_data/av1_comprese_parallel_data 核心是调用了av1_encode_strategy执行编码主要流程。
- av1_post_encode_update 更新参考帧、码控统计(av1_rc_postencode_update)等。
接下来的编码流程分析将在AV1 Encoder源码剖析(二)中介绍。
未经声明,禁止转载,喜欢的给个赞吧!