美文网首页@IT·互联网
AV1 Encoder源码剖析(一)

AV1 Encoder源码剖析(一)

作者: yongbaoqiji | 来源:发表于2023-12-17 16:27 被阅读0次

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

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

    相关文章

      网友评论

        本文标题:AV1 Encoder源码剖析(一)

        本文链接:https://www.haomeiwen.com/subject/cnlwgdtx.html