AV1 Encoder源码分析(一)

120 阅读2分钟

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的编码主要结构体的创建和参数赋值。

av1 init.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算法部分的重要的私有参数数据。
  • AV1EncoderConfig 编码器核心配置,细分了很多不同配置,码控、量化、关键帧,Tile,参考帧、运动模式多次pass编码、profile,质量/RealTime等。
  • 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函数开始作为编码上下文主要参数

3. AV1编码流程

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

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