AV1 Encoder源码剖析(一)

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
av1 interface.png

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源码剖析(二)中介绍。

未经声明,禁止转载,喜欢的给个赞吧!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

相关阅读更多精彩内容

友情链接更多精彩内容