当前位置: 首页 > news >正文

SVT-AV1编码器初始化函数

一 函数解释

这个函数SVT-AV1编码器初始化的核心函数,负责配置编码器组件,分配资源并启动编码线程,以下时对每一行的详细解释。

函数签名和参数检查

EB_API EbErrorType svt_av1_enc_init(EbComponentType *svt_enc_component) {

if (svt_enc_component == NULL)

return EB_ErrorBadParameter;

作用,检查输入的编码器组件指针是否为NULL,如果是则返回错误码EB-ErrorBadParameter

关键点 参数有效性检查时初始化前的必要步骤

初始化句柄和变量

EbEncHandle *enc_handle_ptr = (EbEncHandle*)svt_enc_component->p_component_private;

EbErrorType return_error = EB_ErrorNone;

uint32_t instance_index;

uint32_t process_index;

EbColorFormat color_format = enc_handle_ptr->scs_instance_array[0]->scs->static_config.encoder_color_format;

SequenceControlSet* control_set_ptr;

作用:

从组件私有数据中获取编码器句柄enc_handle_ptr

定义错误码,实例/进程索引、颜色格式等变量

color_format 从第一个实例的静态配置中获取编码器颜色格式

control_set_ptr 用于后续线程管理

运行时CPU优化配置

svt_aom_setup_common_rtcd_internal(enc_handle_ptr->scs_instance_array[0]->scs->static_config.use_cpu_flags);

svt_aom_setup_rtcd_internal(enc_handle_ptr->scs_instance_array[0]->scs->static_config.use_cpu_flags);

作用:根据CPU支持的指令集(如SSE,AVX2) 初始化运行时函数分派表(RTCD) ,选择最优的汇编优化函数。

编码器核心模块初始化

svt_aom_asm_set_convolve_asm_table();

svt_aom_init_intra_dc_predictors_c_internal();

svt_aom_asm_set_convolve_hbd_asm_table();

svt_aom_init_intra_predictors_internal();

作用:

初始化卷积运算的汇编函数表(用于运动补偿)

初始化帧内预测的DC预测器

初始化高精度HBD卷积函数表

初始化通用帧内预测器

块几何集合结构内存分配

#ifdef MINIMAL_BUILD

svt_aom_blk_geom_mds = svt_aom_malloc(MAX_NUM_BLOCKS_ALLOC * sizeof(svt_aom_blk_geom_mds[0]));

#endif svt_aom_build_blk_geom(enc_handle_ptr->scs_instance_array[0]->scs->svt_aom_geom_idx);

作用:

在最小化构建(MININAL_BUILD)时分配块几何结构内存

根据几何索引构建块划分结构(ru 64x64,32x32等)

运动估计和编码工具初始化

svt_av1_init_me_luts();

init_fn_ptr();

svt_av1_init_wedge_masks();

作用:

初始化运动估计ME的查找表LUTs

初始化函数指针表 (可能用于动态分配不同编码工具)

初始化楔形掩码 (用于复合预测)

序列控制集(SCS)迟分配

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->scs_pool_ptr_array, enc_handle_ptr->encode_instance_total_count);

for (instance_index = 0; instance_index < enc_handle_ptr->encode_instance_total_count; ++instance_index) {

EB_NEW(enc_handle_ptr->scs_pool_ptr_array[instance_index], svt_system_resource_ctor, ...);

}

作用:每个编码实例分配序列(SCS)池,管理编码过程中全局配置。

图像控制集(PCS)和ME池分配

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->picture_parent_control_set_pool_ptr_array, ...);

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->me_pool_ptr_array, ...);

for (...) {

PictureControlSetInitData input_data = { ... };

EB_NEW(enc_handle_ptr->picture_parent_control_set_pool_ptr_array[instance_index], ...);

EB_NEW(enc_handle_ptr->me_pool_ptr_array[instance_index], ...);

}

作用:

分配父图像控制集(Parent PCS)池,用于管理图像级参数

分配运动估计ME池,存储运动搜索所需数据

填充input_data结构体,包含图像尺寸,填充,位深,编码模式等参数。

编码解码EncDec过程分配资源池,管理重建图像和变换系数

子图像控制集(Child PCS)池分配

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->picture_control_set_pool_ptr_array, ...);

for (...) {

PictureControlSetInitData input_data = { ... };

EB_NEW(enc_handle_ptr->picture_control_set_pool_ptr_array[instance_index], ...);

}

作用:分配子图像控制集池,可能用于分块编码或多线程处理。

参考图像池分配

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->reference_picture_pool_ptr_array, ...);

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->tpl_reference_picture_pool_ptr_array, ...);

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->pa_reference_picture_pool_ptr_array, ...);

作用:

分配参数图像池,存储已编码帧用于后续帧 预测

TPL时域分层 参考池用于时域运动估计

PA 预测分析,参考池用于预测

输入/输出缓冲区资源初始化

EB_NEW(enc_handle_ptr->input_cmd_resource_ptr, ...); // 输入命令资源

EB_NEW(enc_handle_ptr->input_buffer_resource_ptr, ...); // 输入缓冲区(YUV数据)

EB_NEW(enc_handle_ptr->input_y8b_buffer_resource_ptr, ...); // 8-bit Y平面缓冲区

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->output_stream_buffer_resource_ptr_array, ...); // 输出码流缓冲区

if (recon_enabled) {

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->output_recon_buffer_resource_ptr_array, ...); // 重建图像输出

}

作用:管理输入图像的缓冲区(YUV)数据

和输出码流/重建图像的缓冲区

任务和结果资源初始化

// 资源协调、图像分析、运动估计等任务的结果资源

EB_NEW(enc_handle_ptr->resource_coordination_results_resource_ptr, ...);

EB_NEW(enc_handle_ptr->picture_analysis_results_resource_ptr, ...);

EB_NEW(enc_handle_ptr->motion_estimation_results_resource_ptr, ...);

// 其他结果资源:码率控制、EncDec、熵编码等

作用:为各种编码阶段(如资源协调,运动估计,码率控制)分配任务队列和结果缓冲区,用于多线程同步

上下文初始化

// 资源协调上下文

EB_NEW(enc_handle_ptr->resource_coordination_context_ptr, ...);

// 图像分析上下文(多线程)

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->picture_analysis_context_ptr_array, ...);

for (...) {

EB_NEW(enc_handle_ptr->picture_analysis_context_ptr_array[process_index], ...);

}

// 其他上下文:码率控制、运动估计、熵编码等

作用:位每个编码阶段创建上下文对象,管理该阶段的状态和参数

线程创建和启动

// 创建资源协调线程

EB_CREATE_THREAD(enc_handle_ptr->resource_coordination_thread_handle, ...);

// 创建图像分析线程(多线程)

EB_CREATE_THREAD_ARRAY(enc_handle_ptr->picture_analysis_thread_handle_array, ...);

// 其他线程:运动估计、码率控制、Entropy Coding等

作用:为每个阶段编码创建并启动线程,执行对应的内核函数svt_aom_picture_analysis_kernel

内存使用统计和返回

svt_print_memory_usage();

return return_error;

}

作用:打印内存使用情况,返回初始化结果(成功或错误码)

二 代码注释

EB_API EbErrorType svt_av1_enc_init(EbComponentType *svt_enc_component)

{

if(svt_enc_component == NULL) // 检查输入指针是否为空

return EB_ErrorBadParameter; // 返回错误代码:坏参数

EbEncHandle enc_handle_ptr = (EbEncHandle)svt_enc_component->p_component_private; // 获取编码器处理指针

EbErrorType return_error = EB_ErrorNone; // 初始化返回错误为无错误

uint32_t instance_index; // 实例索引变量

uint32_t process_index; // 进程索引变量

EbColorFormat color_format = enc_handle_ptr->scs_instance_array[0]->scs->static_config.encoder_color_format; // 获取编码器颜色格式

SequenceControlSet* control_set_ptr; // 定义序列控制集指针

svt_aom_setup_common_rtcd_internal(enc_handle_ptr->scs_instance_array[0]->scs->static_config.use_cpu_flags); // 设置公共运行时CD内部

svt_aom_setup_rtcd_internal(enc_handle_ptr->scs_instance_array[0]->scs->static_config.use_cpu_flags); // 设置运行时CD内部

svt_aom_asm_set_convolve_asm_table(); // 设置卷积汇编表

svt_aom_init_intra_dc_predictors_c_internal(); // 初始化内部直流预测器C内部

svt_aom_asm_set_convolve_hbd_asm_table(); // 设置高比特深度卷积汇编表

svt_aom_init_intra_predictors_internal(); // 初始化内部预测器内部

ifdef MINIMAL_BUILD

svt_aom_blk_geom_mds = svt_aom_malloc(MAX_NUM_BLOCKS_ALLOC * sizeof(svt_aom_blk_geom_mds[0])); // 分配块几何MDS内存(极简构建)

endif

svt_aom_build_blk_geom(enc_handle_ptr->scs_instance_array[0]->scs->svt_aom_geom_idx); // 构建块几何

svt_av1_init_me_luts(); // 初始化运动估计查找表

init_fn_ptr(); // 初始化函数指针

svt_av1_init_wedge_masks(); // 初始化楔形掩码

/

  • 序列控制集

/

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->scs_pool_ptr_array, enc_handle_ptr->encode_instance_total_count); // 分配SCS池指针数组

for (instance_index = 0; instance_index < enc_handle_ptr->encode_instance_total_count; ++instance_index) { // 遍历编码实例

EB_NEW( // 创建新的SCS池

enc_handle_ptr->scs_pool_ptr_array[instance_index], // SCS池指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_pool_total_count, // SCS池总计数

1, // 未知参数(可能为版本或类型)

0, // 未知参数(可能为标志)

svt_aom_scs_set_creator, // SCS设置创建函数

NULL, // 未知参数(可能为用户数据)

NULL); // 未知参数(可能为销毁函数)

}

/

  • 图片控制集:

//picture control set

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->picture_parent_control_set_pool_ptr_array, enc_handle_ptr->encode_instance_total_count); // 分配父级PCS池指针数组

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->me_pool_ptr_array, enc_handle_ptr->encode_instance_total_count); // 分配运动估计池指针数组

for (instance_index = 0; instance_index < enc_handle_ptr->encode_instance_total_count; ++instance_index) { // 遍历编码实例

PictureControlSetInitData input_data; // 初始化PCS输入数据

input_data.picture_width = enc_handle_ptr->scs_instance_array[instance_index]->scs->max_input_luma_width; // 设置图片宽度

input_data.picture_height = enc_handle_ptr->scs_instance_array[instance_index]->scs->max_input_luma_height; // 设置图片高度

input_data.left_padding = enc_handle_ptr->scs_instance_array[instance_index]->scs->left_padding; // 设置左侧填充

input_data.right_padding = enc_handle_ptr->scs_instance_array[instance_index]->scs->right_padding; // 设置右侧填充

input_data.top_padding = enc_handle_ptr->scs_instance_array[instance_index]->scs->top_padding; // 设置顶部填充

input_data.bot_padding = enc_handle_ptr->scs_instance_array[instance_index]->scs->bot_padding; // 设置底部填充

input_data.color_format = color_format; // 设置颜色格式

input_data.b64_size = enc_handle_ptr->scs_instance_array[instance_index]->scs->b64_size; // 设置64x64块大小

input_data.ten_bit_format = enc_handle_ptr->scs_instance_array[instance_index]->scs->ten_bit_format; // 设置10位格式标志

input_data.enc_mode = enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config.enc_mode; // 设置编码模式

input_data.speed_control = (uint8_t)enc_handle_ptr->scs_instance_array[instance_index]->scs->speed_control_flag; // 设置速度控制标志

input_data.hbd_md = enc_handle_ptr->scs_instance_array[instance_index]->scs->enable_hbd_mode_decision; // 设置高比特深度模式决策标志

input_data.bit_depth = enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config.encoder_bit_depth; // 设置比特深度

input_data.log2_tile_rows = enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config.tile_rows; // 设置瓦片行的log2值

input_data.log2_tile_cols = enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config.tile_columns; // 设置瓦片列的log2值

input_data.log2_sb_size = (enc_handle_ptr->scs_instance_array[instance_index]->scs->super_block_size == 128) ? 5 : 4; // 设置超级块大小的log2值

input_data.is_16bit_pipeline = enc_handle_ptr->scs_instance_array[instance_index]->scs->is_16bit_pipeline; // 设置16位管线标志

input_data.non_m8_pad_w = enc_handle_ptr->scs_instance_array[instance_index]->scs->max_input_pad_right; // 设置非8倍宽填充

input_data.non_m8_pad_h = enc_handle_ptr->scs_instance_array[instance_index]->scs->max_input_pad_bottom; // 设置非8倍高填充

input_data.enable_tpl_la = enc_handle_ptr->scs_instance_array[instance_index]->scs->tpl; // 设置TPL长跨度标志

input_data.in_loop_ois = enc_handle_ptr->scs_instance_array[instance_index]->scs->in_loop_ois; // 设置环路内OIS标志

input_data.enc_dec_segment_col = (uint16_t)enc_handle_ptr->scs_instance_array[instance_index]->scs->tpl_segment_col_count_array; // 设置编码解码段列数

input_data.enc_dec_segment_row = (uint16_t)enc_handle_ptr->scs_instance_array[instance_index]->scs->tpl_segment_row_count_array; // 设置编码解码段行数

input_data.final_pass_preset = enc_handle_ptr->scs_instance_array[instance_index]->scs->final_pass_preset; // 设置最终遍历预设

input_data.rate_control_mode = enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config.rate_control_mode; // 设置速率控制模式

MrpCtrls* mrp_ctrl = &(enc_handle_ptr->scs_instance_array[0]->scs->mrp_ctrls); // 获取MRP控制指针

input_data.ref_count_used_list0 = MAX(mrp_ctrl->sc_base_ref_list0_count, MAX(mrp_ctrl->base_ref_list0_count, MAX(mrp_ctrl->sc_non_base_ref_list0_count, mrp_ctrl->non_base_ref_list0_count))); // 设置引用计数列表0

input_data.ref_count_used_list1 = MAX(mrp_ctrl->sc_base_ref_list1_count, MAX(mrp_ctrl->base_ref_list1_count, MAX(mrp_ctrl->sc_non_base_ref_list1_count, mrp_ctrl->non_base_ref_list1_count))); // 设置引用计数列表1

input_data.tpl_synth_size = svt_aom_set_tpl_group(NULL, svt_aom_get_tpl_group_level(1, enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config.enc_mode, enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config.rate_control_mode), input_data.picture_width, input_data.picture_height); // 设置TPL合成大小

input_data.enable_adaptive_quantization = enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config.enable_adaptive_quantization; // 设置自适应量化标志

input_data.calculate_variance = enc_handle_ptr->scs_instance_array[instance_index]->scs->calculate_variance; // 设置计算方差标志

input_data.calc_hist = enc_handle_ptr->scs_instance_array[instance_index]->scs->calc_hist = enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config.scene_change_detection || enc_handle_ptr->scs_instance_array[instance_index]->scs->vq_ctrls.sharpness_ctrls.scene_transition || enc_handle_ptr->scs_instance_array[instance_index]->scs->tf_params_per_type[0].enabled || enc_handle_ptr->scs_instance_array[instance_index]->scs->tf_params_per_type[1].enabled || enc_handle_ptr->scs_instance_array[instance_index]->scs->tf_params_per_type[2].enabled; // 设置计算直方图标志

input_data.tpl_lad_mg = enc_handle_ptr->scs_instance_array[instance_index]->scs->tpl_lad_mg; // 设置TPL LAD MG

input_data.input_resolution = enc_handle_ptr->scs_instance_array[instance_index]->scs->input_resolution; // 设置输入分辨率

input_data.is_scale = enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config.superres_mode > SUPERRES_NONE || enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config.resize_mode > RESIZE_NONE; // 设置缩放标志

input_data.rtc_tune = (enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config.pred_structure == SVT_AV1_PRED_LOW_DELAY_B) ? true : false; // 设置实时调整标志

input_data.enable_variance_boost = enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config.enable_variance_boost; // 设置方差增强标志

input_data.variance_boost_strength = enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config.variance_boost_strength; // 设置方差增强强度

input_data.variance_octile = enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config.variance_octile; // 设置方差八分位数

input_data.static_config = enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config; // 设置静态配置

EB_NEW( // 创建新的父级PCS池

enc_handle_ptr->picture_parent_control_set_pool_ptr_array[instance_index], // 父级PCS池指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_instance_array[instance_index]->scs->picture_control_set_pool_init_count, // 父级PCS池初始化计数

1, // 未知参数(可能为版本或类型)

0, // 未知参数(可能为标志)

svt_aom_picture_parent_control_set_creator, // 父级PCS创建函数

&input_data, // 输入数据指针

NULL); // 未知参数(可能为销毁函数)

if SRM_REPORT

enc_handle_ptr->picture_parent_control_set_pool_ptr_array[0]->empty_queue->log = 0; // 设置空队列日志标志

endif

EB_NEW( // 创建新的运动估计池

enc_handle_ptr->me_pool_ptr_array[instance_index], // 运动估计池指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_instance_array[instance_index]->scs->me_pool_init_count, // 运动估计池初始化计数

1, // 未知参数(可能为版本或类型)

0, // 未知参数(可能为标志)

svt_aom_me_creator, // 运动估计创建函数

&input_data, // 输入数据指针

NULL); // 未知参数(可能为销毁函数)

if SRM_REPORT

enc_handle_ptr->me_pool_ptr_array[instance_index]->empty_queue->log = 0; // 设置空队列日志标志

dump_srm_content(enc_handle_ptr->me_pool_ptr_array[instance_index], FALSE); // 转储SRM内容

endif

}

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->enc_dec_pool_ptr_array, enc_handle_ptr->encode_instance_total_count); // 分配编码解码池指针数组

for (instance_index = 0; instance_index < enc_handle_ptr->encode_instance_total_count; ++instance_index) { // 遍历编码实例

PictureControlSetInitData input_data; // 初始化PCS输入数据

unsigned i;

input_data.enc_dec_segment_col = 0; // 初始化编码解码段列数

input_data.enc_dec_segment_row = 0; // 初始化编码解码段行数

for (i = 0; i <= enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config.hierarchical_levels; ++i) { // 遍历层次级别

input_data.enc_dec_segment_col = enc_handle_ptr->scs_instance_array[instance_index]->scs->enc_dec_segment_col_count_array[i] > input_data.enc_dec_segment_col ? (uint16_t)enc_handle_ptr->scs_instance_array[instance_index]->scs->enc_dec_segment_col_count_array[i] : input_data.enc_dec_segment_col; // 更新编码解码段列数

input_data.enc_dec_segment_row = enc_handle_ptr->scs_instance_array[instance_index]->scs->enc_dec_segment_row_count_array[i] > input_data.enc_dec_segment_row ? (uint16_t)enc_handle_ptr->scs_instance_array[instance_index]->scs->enc_dec_segment_row_count_array[i] : input_data.enc_dec_segment_row; // 更新编码解码段行数

}

input_data.picture_width = enc_handle_ptr->scs_instance_array[instance_index]->scs->max_input_luma_width; // 设置图片宽度

input_data.picture_height = enc_handle_ptr->scs_instance_array[instance_index]->scs->max_input_luma_height; // 设置图片高度

input_data.left_padding = enc_handle_ptr->scs_instance_array[instance_index]->scs->left_padding; // 设置左侧填充

input_data.right_padding = enc_handle_ptr->scs_instance_array[instance_index]->scs->right_padding; // 设置右侧填充

input_data.top_padding = enc_handle_ptr->scs_instance_array[instance_index]->scs->top_padding; // 设置顶部填充

input_data.bot_padding = enc_handle_ptr->scs_instance_array[instance_index]->scs->bot_padding; // 设置底部填充

input_data.bit_depth = enc_handle_ptr->scs_instance_array[instance_index]->scs->encoder_bit_depth; // 设置比特深度

input_data.color_format = color_format; // 设置颜色格式

input_data.b64_size = enc_handle_ptr->scs_instance_array[instance_index]->scs->b64_size; // 设置64x64块大小

input_data.sb_size = enc_handle_ptr->scs_instance_array[instance_index]->scs->super_block_size; // 设置超级块大小

input_data.hbd_md = enc_handle_ptr->scs_instance_array[instance_index]->scs->enable_hbd_mode_decision; // 设置高比特深度模式决策标志

input_data.cdf_mode = enc_handle_ptr->scs_instance_array[instance_index]->scs->cdf_mode; // 设置CDF模式

input_data.mfmv = enc_handle_ptr->scs_instance_array[instance_index]->scs->mfmv_enabled; // 设置MFMV标志

input_data.cfg_palette = enc_handle_ptr->scs_instance_array[0]->scs->static_config.screen_content_mode; // 设置调色板配置

// 从父级PCS获取瓦片信息

PictureParentControlSet parent_pcs = (PictureParentControlSet )enc_handle_ptr->picture_parent_control_set_pool_ptr_array[instance_index]->wrapper_ptr_pool[0]->object_ptr;

input_data.tile_row_count = parent_pcs->av1_cm->tiles_info.tile_rows; // 设置瓦片行数

input_data.tile_column_count = parent_pcs->av1_cm->tiles_info.tile_cols; // 设置瓦片列数

input_data.is_16bit_pipeline = enc_handle_ptr->scs_instance_array[instance_index]->scs->is_16bit_pipeline; // 设置16位管线标志

input_data.av1_cm = parent_pcs->av1_cm; // 设置AV1共同模式

input_data.enc_mode = enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config.enc_mode; // 设置编码模式

input_data.input_resolution = enc_handle_ptr->scs_instance_array[instance_index]->scs->input_resolution; // 设置输入分辨率

input_data.is_scale = enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config.superres_mode > SUPERRES_NONE || enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config.resize_mode > RESIZE_NONE; // 设置缩放标志

EB_NEW( // 创建新的编码解码池

enc_handle_ptr->enc_dec_pool_ptr_array[instance_index], // 编码解码池指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_instance_array[instance_index]->scs->enc_dec_pool_init_count, // 编码解码池初始化计数

1, // 未知参数(可能为版本或类型)

0, // 未知参数(可能为标志)

svt_aom_recon_coef_creator, // 重建系数创建函数

&input_data, // 输入数据指针

NULL); // 未知参数(可能为销毁函数)

}

/

  • 图片控制集:子级

/

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->picture_control_set_pool_ptr_array, enc_handle_ptr->encode_instance_total_count); // 分配子级PCS池指针数组

for (instance_index = 0; instance_index < enc_handle_ptr->encode_instance_total_count; ++instance_index) { // 遍历编码实例

PictureControlSetInitData input_data; // 初始化PCS输入数据

unsigned i;

input_data.enc_dec_segment_col = 0; // 初始化编码解码段列数

input_data.enc_dec_segment_row = 0; // 初始化编码解码段行数

for (i = 0; i <= enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config.hierarchical_levels; ++i) { // 遍历层次级别

input_data.enc_dec_segment_col = enc_handle_ptr->scs_instance_array[instance_index]->scs->enc_dec_segment_col_count_array[i] > input_data.enc_dec_segment_col ? (uint16_t)enc_handle_ptr->scs_instance_array[instance_index]->scs->enc_dec_segment_col_count_array[i] : input_data.enc_dec_segment_col; // 更新编码解码段列数

input_data.enc_dec_segment_row = enc_handle_ptr->scs_instance_array[instance_index]->scs->enc_dec_segment_row_count_array[i] > input_data.enc_dec_segment_row ? (uint16_t)enc_handle_ptr->scs_instance_array[instance_index]->scs->enc_dec_segment_row_count_array[i] : input_data.enc_dec_segment_row; // 更新编码解码段行数

}

input_data.init_max_block_cnt = enc_handle_ptr->scs_instance_array[instance_index]->scs->max_block_cnt; // 初始化最大块计数

input_data.picture_width = enc_handle_ptr->scs_instance_array[instance_index]->scs->max_input_luma_width; // 设置图片宽度

input_data.picture_height = enc_handle_ptr->scs_instance_array[instance_index]->scs->max_input_luma_height; // 设置图片高度

input_data.left_padding = enc_handle_ptr->scs_instance_array[instance_index]->scs->left_padding; // 设置左侧填充

input_data.right_padding = enc_handle_ptr->scs_instance_array[instance_index]->scs->right_padding; // 设置右侧填充

input_data.top_padding = enc_handle_ptr->scs_instance_array[instance_index]->scs->top_padding; // 设置顶部填充

input_data.bot_padding = enc_handle_ptr->scs_instance_array[instance_index]->scs->bot_padding; // 设置底部填充

input_data.bit_depth = enc_handle_ptr->scs_instance_array[instance_index]->scs->encoder_bit_depth; // 设置比特深度

input_data.color_format = color_format; // 设置颜色格式

input_data.b64_size = enc_handle_ptr->scs_instance_array[instance_index]->scs->b64_size; // 设置64x64块大小

input_data.sb_size = enc_handle_ptr->scs_instance_array[instance_index]->scs->super_block_size; // 设置超级块大小

input_data.hbd_md = enc_handle_ptr->scs_instance_array[instance_index]->scs->enable_hbd_mode_decision; // 设置高比特深度模式决策标志

input_data.cdf_mode = enc_handle_ptr->scs_instance_array[instance_index]->scs->cdf_mode; // 设置CDF模式

input_data.mfmv = enc_handle_ptr->scs_instance_array[instance_index]->scs->mfmv_enabled; // 设置MFMV标志

input_data.cfg_palette = enc_handle_ptr->scs_instance_array[0]->scs->static_config.screen_content_mode; // 设置调色板配置

// 从父级PCS获取瓦片信息

PictureParentControlSet parent_pcs = (PictureParentControlSet )enc_handle_ptr->picture_parent_control_set_pool_ptr_array[instance_index]->wrapper_ptr_pool[0]->object_ptr;

input_data.tile_row_count = parent_pcs->av1_cm->tiles_info.tile_rows; // 设置瓦片行数

input_data.tile_column_count = parent_pcs->av1_cm->tiles_info.tile_cols; // 设置瓦片列数

input_data.is_16bit_pipeline = enc_handle_ptr->scs_instance_array[instance_index]->scs->is_16bit_pipeline; // 设置16位管线标志

input_data.av1_cm = parent_pcs->av1_cm; // 设置AV1共同模式

input_data.enc_mode = enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config.enc_mode; // 设置编码模式

input_data.static_config = enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config; // 设置静态配置

input_data.input_resolution = enc_handle_ptr->scs_instance_array[instance_index]->scs->input_resolution; // 设置输入分辨率

input_data.is_scale = enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config.superres_mode > SUPERRES_NONE || enc_handle_ptr->scs_instance_array[instance_index]->scs->static_config.resize_mode > RESIZE_NONE; // 设置缩放标志

EB_NEW( // 创建新的子级PCS池

enc_handle_ptr->picture_control_set_pool_ptr_array[instance_index], // 子级PCS池指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_instance_array[instance_index]->scs->picture_control_set_pool_init_count_child, // 子级PCS池初始化计数

1, // 未知参数(可能为版本或类型)

0, // 未知参数(可能为标志)

svt_aom_picture_control_set_creator, // 子级PCS创建函数

&input_data, // 输入数据指针

NULL); // 未知参数(可能为销毁函数)

}

/

  • 图片缓冲区

/

// 分配资源数组

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->reference_picture_pool_ptr_array, enc_handle_ptr->encode_instance_total_count); // 分配参考图片池指针数组

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->tpl_reference_picture_pool_ptr_array, enc_handle_ptr->encode_instance_total_count); // 分配TPL参考图片池指针数组

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->pa_reference_picture_pool_ptr_array, enc_handle_ptr->encode_instance_total_count); // 分配PA参考图片池指针数组

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->overlay_input_picture_pool_ptr_array, enc_handle_ptr->encode_instance_total_count); // 分配覆盖输入图片池指针数组

pic_mgr_ports[PIC_MGR_INPUT_PORT_SOP].count = enc_handle_ptr->scs_instance_array[0]->scs->source_based_operations_process_init_count; // 设置基于源的操作过程初始化计数

pic_mgr_ports[PIC_MGR_INPUT_PORT_PACKETIZATION].count = EB_PacketizationProcessInitCount; // 设置打包过程初始化计数

pic_mgr_ports[PIC_MGR_INPUT_PORT_REST].count = enc_handle_ptr->scs_instance_array[0]->scs->rest_process_init_count; // 设置剩余过程初始化计数

// 速率控制

rate_control_ports[RATE_CONTROL_INPUT_PORT_INLME].count = EB_PictureManagerProcessInitCount; // 设置INLME输入端口计数

rate_control_ports[RATE_CONTROL_INPUT_PORT_PACKETIZATION].count = EB_PacketizationProcessInitCount; // 设置打包输入端口计数

rate_control_ports[RATE_CONTROL_INPUT_PORT_ENTROPY_CODING].count = enc_handle_ptr->scs_instance_array[0]->scs->entropy_coding_process_init_count; // 设置熵编码输入端口计数

enc_dec_ports[ENCDEC_INPUT_PORT_MDC].count = enc_handle_ptr->scs_instance_array[0]->scs->mode_decision_configuration_process_init_count; // 设置MDC输入端口计数

enc_dec_ports[ENCDEC_INPUT_PORT_ENCDEC].count = enc_handle_ptr->scs_instance_array[0]->scs->enc_dec_process_init_count; // 设置ENCDEC输入端口计数

tpl_ports[TPL_INPUT_PORT_SOP].count = enc_handle_ptr->scs_instance_array[0]->scs->source_based_operations_process_init_count; // 设置SOP输入端口计数

tpl_ports[TPL_INPUT_PORT_TPL].count = enc_handle_ptr->scs_instance_array[0]->scs->tpl_disp_process_init_count; // 设置TPL输入端口计数

for (instance_index = 0; instance_index < enc_handle_ptr->encode_instance_total_count; ++instance_index) { // 遍历编码实例

// 必须始终分配内存,因为此时不知道是否启用了恢复

// 恢复假设只使用1个瓦片,因此只分配1个瓦片的内存... 请参阅svt_av1_alloc_restoration_struct()

PictureControlSet pcs = (PictureControlSet )enc_handle_ptr->picture_control_set_pool_ptr_array[instance_index]->wrapper_ptr_pool[0]->object_ptr; // 获取PCS指针

enc_handle_ptr->scs_instance_array[instance_index]->scs->rest_units_per_tile = pcs->rst_info[0/Y-plane/].units_per_tile; // 设置每个瓦片的恢复单元数

enc_handle_ptr->scs_instance_array[instance_index]->scs->b64_total_count = pcs->b64_total_count; // 设置64x64块总数

create_ref_buf_descs(enc_handle_ptr, instance_index); // 创建参考缓冲区描述符

if FTR_STILL_PICTURE

if(enc_handle_ptr->scs_instance_array[instance_index]->scs->tpl) // 如果启用TPL

endif

create_tpl_ref_buf_descs(enc_handle_ptr, instance_index); // 创建TPL参考缓冲区描述符

create_pa_ref_buf_descs(enc_handle_ptr, instance_index); // 创建PA参考缓冲区描述符

if (enc_handle_ptr->scs_instance_array[0]->scs->static_config.enable_overlays) { // 如果启用覆盖

// 覆盖输入图片缓冲区

EB_NEW( // 创建新的覆盖输入图片池

enc_handle_ptr->overlay_input_picture_pool_ptr_array[instance_index], // 覆盖输入图片池指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_instance_array[instance_index]->scs->overlay_input_picture_buffer_init_count, // 覆盖输入图片缓冲区初始化计数

1, // 未知参数(可能为版本或类型)

0, // 未知参数(可能为标志)

svt_overlay_buffer_header_creator, // 覆盖缓冲区头部创建函数

enc_handle_ptr->scs_instance_array[instance_index]->scs, // 静态配置指针

svt_input_buffer_header_destroyer); // 输入缓冲区头部销毁函数

// 设置序列控制集覆盖输入图片池FIFO指针

enc_handle_ptr->scs_instance_array[instance_index]->enc_ctx->overlay_input_picture_pool_fifo_ptr = svt_system_resource_get_producer_fifo(enc_handle_ptr->overlay_input_picture_pool_ptr_array[instance_index], 0); // 获取生产者FIFO指针

}

}

/

  • 系统资源管理器与FIFO

/

// SRM用于将应用程序链接到资源协调,通过输入命令。输入命令持有2个图片缓冲区:y8bit和其余部分(uv8b + yuv2b)

EB_NEW( // 创建新的输入命令资源

enc_handle_ptr->input_cmd_resource_ptr, // 输入命令资源指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_instance_array[0]->scs->resource_coordination_fifo_init_count, // 资源协调FIFO初始化计数

1, // 未知参数(可能为版本或类型)

EB_ResourceCoordinationProcessInitCount, // 资源协调过程初始化计数

svt_input_cmd_creator, // 输入命令创建函数

enc_handle_ptr->scs_instance_array[0]->scs, // 静态配置指针

NULL); // 未知参数(可能为销毁函数)

enc_handle_ptr->input_cmd_producer_fifo_ptr = svt_system_resource_get_producer_fifo(enc_handle_ptr->input_cmd_resource_ptr, 0); // 获取生产者FIFO指针

// 图片缓冲区SRM用于保存(uv8b + yuv2b)

EB_NEW( // 创建新的输入缓冲区资源

enc_handle_ptr->input_buffer_resource_ptr, // 输入缓冲区资源指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_instance_array[0]->scs->input_buffer_fifo_init_count, // 输入缓冲区FIFO初始化计数

1, // 未知参数(可能为版本或类型)

0, // SRM;无消费者FIFO

svt_input_buffer_header_creator, // 输入缓冲区头部创建函数

enc_handle_ptr->scs_instance_array[0]->scs, // 静态配置指针

svt_input_buffer_header_destroyer); // 输入缓冲区头部销毁函数

enc_handle_ptr->input_buffer_producer_fifo_ptr = svt_system_resource_get_producer_fifo(enc_handle_ptr->input_buffer_resource_ptr, 0); // 获取生产者FIFO指针

// 图片缓冲区SRM用于保存y8b,供Pcs->enhanced和Pa_ref共享

EB_NEW( // 创建新的输入Y8B缓冲区资源

enc_handle_ptr->input_y8b_buffer_resource_ptr, // 输入Y8B缓冲区资源指针

svt_system_resource_ctor, // 系统资源构造函数

MAX(enc_handle_ptr->scs_instance_array[0]->scs->input_buffer_fifo_init_count, enc_handle_ptr->scs_instance_array[0]->scs->pa_reference_picture_buffer_init_count), // 输入缓冲区FIFO初始化计数与PA参考图片缓冲区初始化计数的最大值

1, // 未知参数(可能为版本或类型)

0, // SRM;无消费者FIFO

svt_input_y8b_creator, // 输入Y8B创建函数

enc_handle_ptr->scs_instance_array[0]->scs, // 静态配置指针

svt_input_y8b_destroyer); // 输入Y8B销毁函数

if SRM_REPORT

enc_handle_ptr->input_y8b_buffer_resource_ptr->empty_queue->log = 1; // 设置空队列日志标志

endif

enc_handle_ptr->input_y8b_buffer_producer_fifo_ptr = svt_system_resource_get_producer_fifo(enc_handle_ptr->input_y8b_buffer_resource_ptr, 0); // 获取生产者FIFO指针

// EbBufferHeaderType输出流

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->output_stream_buffer_resource_ptr_array, enc_handle_ptr->encode_instance_total_count); // 分配输出流缓冲区资源指针数组

for (instance_index = 0; instance_index < enc_handle_ptr->encode_instance_total_count; ++instance_index) { // 遍历编码实例

EB_NEW( // 创建新的输出流缓冲区资源

enc_handle_ptr->output_stream_buffer_resource_ptr_array[instance_index], // 输出流缓冲区资源指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_instance_array[instance_index]->scs->output_stream_buffer_fifo_init_count, // 输出流缓冲区FIFO初始化计数

enc_handle_ptr->scs_instance_array[instance_index]->scs->total_process_init_count, // 总过程初始化计数

1, // 未知参数(可能为标志)

svt_output_buffer_header_creator, // 输出缓冲区头部创建函数

&enc_handle_ptr->scs_instance_array[0]->scs->static_config, // 静态配置指针

svt_output_buffer_header_destroyer); // 输出缓冲区头部销毁函数

}

enc_handle_ptr->output_stream_buffer_consumer_fifo_ptr = svt_system_resource_get_consumer_fifo(enc_handle_ptr->output_stream_buffer_resource_ptr_array[0], 0); // 获取消费者FIFO指针

if (enc_handle_ptr->scs_instance_array[0]->scs->static_config.recon_enabled) { // 如果启用重建

// EbBufferHeaderType输出重建

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->output_recon_buffer_resource_ptr_array, enc_handle_ptr->encode_instance_total_count); // 分配输出重建缓冲区资源指针数组

for (instance_index = 0; instance_index < enc_handle_ptr->encode_instance_total_count; ++instance_index) { // 遍历编码实例

EB_NEW( // 创建新的输出重建缓冲区资源

enc_handle_ptr->output_recon_buffer_resource_ptr_array[instance_index], // 输出重建缓冲区资源指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_instance_array[instance_index]->scs->output_recon_buffer_fifo_init_count, // 输出重建缓冲区FIFO初始化计数

enc_handle_ptr->scs_instance_array[instance_index]->scs->enc_dec_process_init_count, // 编码解码过程初始化计数

1, // 未知参数(可能为标志)

svt_output_recon_buffer_header_creator, // 输出重建缓冲区头部创建函数

enc_handle_ptr->scs_instance_array[0]->scs, // 静态配置指针

svt_output_recon_buffer_header_destroyer); // 输出重建缓冲区头部销毁函数

}

enc_handle_ptr->output_recon_buffer_consumer_fifo_ptr = svt_system_resource_get_consumer_fifo(enc_handle_ptr->output_recon_buffer_resource_ptr_array[0], 0); // 获取消费者FIFO指针

}

// 资源协调结果

{

ResourceCoordinationResultInitData resource_coordination_result_init_data; // 初始化资源协调结果数据

EB_NEW( // 创建新的资源协调结果资源

enc_handle_ptr->resource_coordination_results_resource_ptr, // 资源协调结果资源指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_instance_array[0]->scs->resource_coordination_fifo_init_count, // 资源协调FIFO初始化计数

EB_ResourceCoordinationProcessInitCount, // 资源协调过程初始化计数

enc_handle_ptr->scs_instance_array[0]->scs->picture_analysis_process_init_count, // 图片分析过程初始化计数

svt_aom_resource_coordination_result_creator, // 资源协调结果创建函数

&resource_coordination_result_init_data, // 资源协调结果初始化数据指针

NULL); // 未知参数(可能为销毁函数)

}

// 图片分析结果

{

PictureAnalysisResultInitData picture_analysis_result_init_data; // 初始化图片分析结果数据

EB_NEW( // 创建新的图片分析结果资源

enc_handle_ptr->picture_analysis_results_resource_ptr, // 图片分析结果资源指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_instance_array[0]->scs->picture_analysis_fifo_init_count, // 图片分析FIFO初始化计数

enc_handle_ptr->scs_instance_array[0]->scs->picture_analysis_process_init_count, // 图片分析过程初始化计数

EB_PictureDecisionProcessInitCount, // 图片决策过程初始化计数

svt_aom_picture_analysis_result_creator, // 图片分析结果创建函数

&picture_analysis_result_init_data, // 图片分析结果初始化数据指针

NULL); // 未知参数(可能为销毁函数)

}

// 图片决策结果

{

PictureDecisionResultInitData picture_decision_result_init_data; // 初始化图片决策结果数据

EB_NEW( // 创建新的图片决策结果资源

enc_handle_ptr->picture_decision_results_resource_ptr, // 图片决策结果资源指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_instance_array[0]->scs->picture_decision_fifo_init_count, // 图片决策FIFO初始化计数

EB_PictureDecisionProcessInitCount + 2, // 图片决策过程初始化计数加2(一个用于速率控制,另一个用于启用超分辨率重新编码时打包)

enc_handle_ptr->scs_instance_array[0]->scs->motion_estimation_process_init_count, // 运动估计过程初始化计数

svt_aom_picture_decision_result_creator, // 图片决策结果创建函数

&picture_decision_result_init_data, // 图片决策结果初始化数据指针

NULL); // 未知参数(可能为销毁函数)

}

// 运动估计结果

{

MotionEstimationResultsInitData motion_estimation_result_init_data; // 初始化运动估计结果数据

EB_NEW( // 创建新的运动估计结果资源

enc_handle_ptr->motion_estimation_results_resource_ptr, // 运动估计结果资源指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_instance_array[0]->scs->motion_estimation_fifo_init_count, // 运动估计FIFO初始化计数

enc_handle_ptr->scs_instance_array[0]->scs->motion_estimation_process_init_count, // 运动估计过程初始化计数

EB_InitialRateControlProcessInitCount, // 初始速率控制过程初始化计数

svt_aom_motion_estimation_results_creator, // 运动估计结果创建函数

&motion_estimation_result_init_data, // 运动估计结果初始化数据指针

NULL); // 未知参数(可能为销毁函数)

}

// 初始速率控制结果

{

InitialRateControlResultInitData initial_rate_control_result_init_data; // 初始化初始速率控制结果数据

EB_NEW( // 创建新的初始速率控制结果资源

enc_handle_ptr->initial_rate_control_results_resource_ptr, // 初始速率控制结果资源指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_instance_array[0]->scs->initial_rate_control_fifo_init_count, // 初始速率控制FIFO初始化计数

EB_InitialRateControlProcessInitCount, // 初始速率控制过程初始化计数

enc_handle_ptr->scs_instance_array[0]->scs->source_based_operations_process_init_count, // 基于源的操作过程初始化计数

svt_aom_initial_rate_control_results_creator, // 初始速率控制结果创建函数

&initial_rate_control_result_init_data, // 初始速率控制结果初始化数据指针

NULL); // 未知参数(可能为销毁函数)

}

// 图片解复用结果

{

PictureResultInitData picture_result_init_data; // 初始化图片结果数据

EB_NEW( // 创建新的图片解复用结果资源

enc_handle_ptr->picture_demux_results_resource_ptr, // 图片解复用结果资源指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_instance_array[0]->scs->picture_demux_fifo_init_count, // 图片解复用FIFO初始化计数

pic_mgr_port_total_count(), // 图片管理端口总数

EB_PictureManagerProcessInitCount, // 图片管理过程初始化计数

svt_aom_picture_results_creator, // 图片结果创建函数

&picture_result_init_data, // 图片结果初始化数据指针

NULL); // 未知参数(可能为销毁函数)

}

// TPL分配器结果

{

EntropyCodingResultsInitData tpl_disp_result_init_data; // 初始化TPL分配器结果数据

// TPL分配器任务

EB_NEW( // 创建新的TPL分配器结果资源

enc_handle_ptr->tpl_disp_res_srm, // TPL分配器结果SRM指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_instance_array[0]->scs->tpl_disp_fifo_init_count, // TPL分配器FIFO初始化计数

tpl_port_total_count(), // TPL端口总数

enc_handle_ptr->scs_instance_array[0]->scs->tpl_disp_process_init_count, // TPL分配器过程初始化计数

tpl_disp_results_creator, // TPL分配器结果创建函数

&tpl_disp_result_init_data, // TPL分配器结果初始化数据指针

NULL); // 未知参数(可能为销毁函数)

}

// 速率控制任务

{

RateControlTasksInitData rate_control_tasks_init_data; // 初始化速率控制任务数据

EB_NEW( // 创建新的速率控制任务资源

enc_handle_ptr->rate_control_tasks_resource_ptr, // 速率控制任务资源指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_instance_array[0]->scs->rate_control_tasks_fifo_init_count, // 速率控制任务FIFO初始化计数

rate_control_port_total_count(), // 速率控制端口总数

EB_RateControlProcessInitCount, // 速率控制过程初始化计数

svt_aom_rate_control_tasks_creator, // 速率控制任务创建函数

&rate_control_tasks_init_data, // 速率控制任务初始化数据指针

NULL); // 未知参数(可能为销毁函数)

}

// 速率控制结果

{

RateControlResultsInitData rate_control_result_init_data; // 初始化速率控制结果数据

EB_NEW( // 创建新的速率控制结果资源

enc_handle_ptr->rate_control_results_resource_ptr, // 速率控制结果资源指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_instance_array[0]->scs->rate_control_fifo_init_count, // 速率控制FIFO初始化计数

EB_RateControlProcessInitCount, // 速率控制过程初始化计数

enc_handle_ptr->scs_instance_array[0]->scs->mode_decision_configuration_process_init_count, // 模式决策配置过程初始化计数

svt_aom_rate_control_results_creator, // 速率控制结果创建函数

&rate_control_result_init_data, // 速率控制结果初始化数据指针

NULL); // 未知参数(可能为销毁函数)

}

// 编码解码任务

{

EncDecTasksInitData mode_decision_result_init_data; // 初始化模式决策结果数据

unsigned i;

mode_decision_result_init_data.enc_dec_segment_row_count = 0; // 初始化编码解码段行计数

for (i = 0; i <= enc_handle_ptr->scs_instance_array[0]->scs->static_config.hierarchical_levels; ++i) { // 遍历层次级别

mode_decision_result_init_data.enc_dec_segment_row_count = MAX(mode_decision_result_init_data.enc_dec_segment_row_count, enc_handle_ptr->scs_instance_array[0]->scs->enc_dec_segment_row_count_array[i]); // 更新编码解码段行计数

}

EB_NEW( // 创建新的编码解码任务资源

enc_handle_ptr->enc_dec_tasks_resource_ptr, // 编码解码任务资源指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_instance_array[0]->scs->mode_decision_configuration_fifo_init_count, // 模式决策配置FIFO初始化计数

enc_dec_port_total_count(), // 编码解码端口总数

enc_handle_ptr->scs_instance_array[0]->scs->enc_dec_process_init_count, // 编码解码过程初始化计数

svt_aom_enc_dec_tasks_creator, // 编码解码任务创建函数

&mode_decision_result_init_data, // 模式决策结果初始化数据指针

NULL); // 未知参数(可能为销毁函数)

}

// 编码解码结果

{

EncDecResultsInitData enc_dec_result_init_data; // 初始化编码解码结果数据

EB_NEW( // 创建新的编码解码结果资源

enc_handle_ptr->enc_dec_results_resource_ptr, // 编码解码结果资源指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_instance_array[0]->scs->enc_dec_fifo_init_count, // 编码解码FIFO初始化计数

enc_handle_ptr->scs_instance_array[0]->scs->enc_dec_process_init_count, // 编码解码过程初始化计数

enc_handle_ptr->scs_instance_array[0]->scs->dlf_process_init_count, // DLF过程初始化计数

svt_aom_enc_dec_results_creator, // 编码解码结果创建函数

&enc_dec_result_init_data, // 编码解码结果初始化数据指针

NULL); // 未知参数(可能为销毁函数)

}

// DLF结果

{

EntropyCodingResultsInitData delf_result_init_data; // 初始化DLF结果数据

EB_NEW( // 创建新的DLF结果资源

enc_handle_ptr->dlf_results_resource_ptr, // DLF结果资源指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_instance_array[0]->scs->dlf_fifo_init_count, // DLF FIFO初始化计数

enc_handle_ptr->scs_instance_array[0]->scs->dlf_process_init_count, // DLF过程初始化计数

enc_handle_ptr->scs_instance_array[0]->scs->cdef_process_init_count, // CDEF过程初始化计数

dlf_results_creator, // DLF结果创建函数

&delf_result_init_data, // DLF结果初始化数据指针

NULL); // 未知参数(可能为销毁函数)

}

// CDEF结果

{

EntropyCodingResultsInitData cdef_result_init_data; // 初始化CDEF结果数据

EB_NEW( // 创建新的CDEF结果资源

enc_handle_ptr->cdef_results_resource_ptr, // CDEF结果资源指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_instance_array[0]->scs->cdef_fifo_init_count, // CDEF FIFO初始化计数

enc_handle_ptr->scs_instance_array[0]->scs->cdef_process_init_count, // CDEF过程初始化计数

enc_handle_ptr->scs_instance_array[0]->scs->rest_process_init_count, // 恢复过程初始化计数

cdef_results_creator, // CDEF结果创建函数

&cdef_result_init_data, // CDEF结果初始化数据指针

NULL); // 未知参数(可能为销毁函数)

}

// 恢复结果

{

EntropyCodingResultsInitData rest_result_init_data; // 初始化恢复结果数据

EB_NEW( // 创建新的恢复结果资源

enc_handle_ptr->rest_results_resource_ptr, // 恢复结果资源指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_instance_array[0]->scs->rest_fifo_init_count, // 恢复FIFO初始化计数

enc_handle_ptr->scs_instance_array[0]->scs->rest_process_init_count, // 恢复过程初始化计数

enc_handle_ptr->scs_instance_array[0]->scs->entropy_coding_process_init_count, // 熵编码过程初始化计数

rest_results_creator, // 恢复结果创建函数

&rest_result_init_data, // 恢复结果初始化数据指针

NULL); // 未知参数(可能为销毁函数)

}

// 熵编码结果

{

EntropyCodingResultsInitData entropy_coding_results_init_data; // 初始化熵编码结果数据

EB_NEW( // 创建新的熵编码结果资源

enc_handle_ptr->entropy_coding_results_resource_ptr, // 熵编码结果资源指针

svt_system_resource_ctor, // 系统资源构造函数

enc_handle_ptr->scs_instance_array[0]->scs->entropy_coding_fifo_init_count, // 熵编码FIFO初始化计数

enc_handle_ptr->scs_instance_array[0]->scs->entropy_coding_process_init_count, // 熵编码过程初始化计数

EB_PacketizationProcessInitCount, // 打包过程初始化计数

svt_aom_entropy_coding_results_creator, // 熵编码结果创建函数

&entropy_coding_results_init_data, // 熵编码结果初始化数据指针

NULL); // 未知参数(可能为销毁函数)

}

/

  • 应用程序回调

/

for (instance_index = 0; instance_index < enc_handle_ptr->encode_instance_total_count; ++instance_index) // 遍历编码实例

enc_handle_ptr->scs_instance_array[instance_index]->enc_ctx->app_callback_ptr = enc_handle_ptr->app_callback_ptr_array[instance_index]; // 设置应用程序回调指针

// svt输出缓冲区FIFO指针

for (instance_index = 0; instance_index < enc_handle_ptr->encode_instance_total_count; ++instance_index) { // 遍历编码实例

enc_handle_ptr->scs_instance_array[instance_index]->enc_ctx->stream_output_fifo_ptr = svt_system_resource_get_producer_fifo(enc_handle_ptr->output_stream_buffer_resource_ptr_array[instance_index], 0); // 设置流输出FIFO生产者指针

if (enc_handle_ptr->scs_instance_array[0]->scs->static_config.recon_enabled) // 如果启用重建

enc_handle_ptr->scs_instance_array[instance_index]->enc_ctx->recon_output_fifo_ptr = svt_system_resource_get_producer_fifo(enc_handle_ptr->output_recon_buffer_resource_ptr_array[instance_index], 0); // 设置重建输出FIFO生产者指针

}

/

  • 上下文

/

// 资源协调上下文

EB_NEW( // 创建新的资源协调上下文

enc_handle_ptr->resource_coordination_context_ptr, // 资源协调上下文指针

svt_aom_resource_coordination_context_ctor, // 资源协调上下文构造函数

enc_handle_ptr); // 编码器处理指针

// 图片分析上下文

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->picture_analysis_context_ptr_array, enc_handle_ptr->scs_instance_array[0]->scs->picture_analysis_process_init_count); // 分配图片分析上下文指针数组

for (process_index = 0; process_index < enc_handle_ptr->scs_instance_array[0]->scs->picture_analysis_process_init_count; ++process_index) { // 遍历图片分析过程

EB_NEW( // 创建新的图片分析上下文

enc_handle_ptr->picture_analysis_context_ptr_array[process_index], // 图片分析上下文指针

svt_aom_picture_analysis_context_ctor, // 图片分析上下文构造函数

enc_handle_ptr, // 编码器处理指针

process_index); // 过程索引

}

// 图片决策上下文

{

// 初始化各种图片类型

instance_index = 0;

EB_NEW( // 创建新的图片决策上下文

enc_handle_ptr->picture_decision_context_ptr, // 图片决策上下文指针

svt_aom_picture_decision_context_ctor, // 图片决策上下文构造函数

enc_handle_ptr, // 编码器处理指针

enc_handle_ptr->scs_instance_array[instance_index]->scs->calc_hist); // 计算直方图标志

}

// 运动分析上下文

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->motion_estimation_context_ptr_array, enc_handle_ptr->scs_instance_array[0]->scs->motion_estimation_process_init_count); // 分配运动估计上下文指针数组

for (process_index = 0; process_index < enc_handle_ptr->scs_instance_array[0]->scs->motion_estimation_process_init_count; ++process_index) { // 遍历运动估计过程

EB_NEW( // 创建新的运动估计上下文

enc_handle_ptr->motion_estimation_context_ptr_array[process_index], // 运动估计上下文指针

svt_aom_motion_estimation_context_ctor, // 运动估计上下文构造函数

enc_handle_ptr, // 编码器处理指针

process_index); // 过程索引

}

// 初始速率控制上下文

EB_NEW( // 创建新的初始速率控制上下文

enc_handle_ptr->initial_rate_control_context_ptr, // 初始速率控制上下文指针

svt_aom_initial_rate_control_context_ctor, // 初始速率控制上下文构造函数

enc_handle_ptr); // 编码器处理指针

// 基于源的操作上下文

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->source_based_operations_context_ptr_array, enc_handle_ptr->scs_instance_array[0]->scs->source_based_operations_process_init_count); // 分配基于源的操作上下文指针数组

for (process_index = 0; process_index < enc_handle_ptr->scs_instance_array[0]->scs->source_based_operations_process_init_count; ++process_index) { // 遍历基于源的操作过程

EB_NEW( // 创建新的基于源的操作上下文

enc_handle_ptr->source_based_operations_context_ptr_array[process_index], // 基于源的操作上下文指针

svt_aom_source_based_operations_context_ctor, // 基于源的操作上下文构造函数

enc_handle_ptr, // 编码器处理指针

tpl_port_lookup(TPL_INPUT_PORT_SOP, process_index), // TPL端口查找(SOP)

pic_mgr_port_lookup(PIC_MGR_INPUT_PORT_SOP, process_index)); // 图片管理端口查找(SOP)

}

// TPL分配器上下文

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->tpl_disp_context_ptr_array, enc_handle_ptr->scs_instance_array[0]->scs->tpl_disp_process_init_count); // 分配TPL分配器上下文指针数组

for (process_index = 0; process_index < enc_handle_ptr->scs_instance_array[0]->scs->tpl_disp_process_init_count; ++process_index) { // 遍历TPL分配器过程

EB_NEW( // 创建新的TPL分配器上下文

enc_handle_ptr->tpl_disp_context_ptr_array[process_index], // TPL分配器上下文指针

svt_aom_tpl_disp_context_ctor, // TPL分配器上下文构造函数

enc_handle_ptr, // 编码器处理指针

process_index, // 过程索引

tpl_port_lookup(TPL_INPUT_PORT_TPL, process_index)); // TPL端口查找(TPL)

}

// 图片管理上下文

EB_NEW( // 创建新的图片管理上下文

enc_handle_ptr->picture_manager_context_ptr, // 图片管理上下文指针

svt_aom_picture_manager_context_ctor, // 图片管理上下文构造函数

enc_handle_ptr, // 编码器处理指针

rate_control_port_lookup(RATE_CONTROL_INPUT_PORT_INLME, 0)); // 速率控制端口查找(INLME)

// 速率控制上下文

EB_NEW( // 创建新的速率控制上下文

enc_handle_ptr->rate_control_context_ptr, // 速率控制上下文指针

svt_aom_rate_control_context_ctor, // 速率控制上下文构造函数

enc_handle_ptr, // 编码器处理指针

EB_PictureDecisionProcessInitCount); // 图片决策过程初始化计数(ME端口索引)

// 模式决策配置上下文

{

// 模式决策配置上下文

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->mode_decision_configuration_context_ptr_array, enc_handle_ptr->scs_instance_array[0]->scs->mode_decision_configuration_process_init_count); // 分配模式决策配置上下文指针数组

for (process_index = 0; process_index < enc_handle_ptr->scs_instance_array[0]->scs->mode_decision_configuration_process_init_count; ++process_index) { // 遍历模式决策配置过程

EB_NEW( // 创建新的模式决策配置上下文

enc_handle_ptr->mode_decision_configuration_context_ptr_array[process_index], // 模式决策配置上下文指针

svt_aom_mode_decision_configuration_context_ctor, // 模式决策配置上下文构造函数

enc_handle_ptr, // 编码器处理指针

process_index, // 过程索引

enc_dec_port_lookup(ENCDEC_INPUT_PORT_MDC, process_index)); // 编码解码端口查找(MDC)

}

}

// 编码解码上下文

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->enc_dec_context_ptr_array, enc_handle_ptr->scs_instance_array[0]->scs->enc_dec_process_init_count); // 分配编码解码上下文指针数组

for (process_index = 0; process_index < enc_handle_ptr->scs_instance_array[0]->scs->enc_dec_process_init_count; ++process_index) { // 遍历编码解码过程

EB_NEW( // 创建新的编码解码上下文

enc_handle_ptr->enc_dec_context_ptr_array[process_index], // 编码解码上下文指针

svt_aom_enc_dec_context_ctor, // 编码解码上下文构造函数

enc_handle_ptr, // 编码器处理指针

process_index, // 过程索引

enc_dec_port_lookup(ENCDEC_INPUT_PORT_ENCDEC, process_index)); // 编码解码端口查找(ENCDEC)

}

// DLF上下文

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->dlf_context_ptr_array, enc_handle_ptr->scs_instance_array[0]->scs->dlf_process_init_count); // 分配DLF上下文指针数组

for (process_index = 0; process_index < enc_handle_ptr->scs_instance_array[0]->scs->dlf_process_init_count; ++process_index) { // 遍历DLF过程

EB_NEW( // 创建新的DLF上下文

enc_handle_ptr->dlf_context_ptr_array[process_index], // DLF上下文指针

svt_aom_dlf_context_ctor, // DLF上下文构造函数

enc_handle_ptr, // 编码器处理指针

process_index); // 过程索引

}

// CDEF上下文

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->cdef_context_ptr_array, enc_handle_ptr->scs_instance_array[0]->scs->cdef_process_init_count); // 分配CDEF上下文指针数组

for (process_index = 0; process_index < enc_handle_ptr->scs_instance_array[0]->scs->cdef_process_init_count; ++process_index) { // 遍历CDEF过程

EB_NEW( // 创建新的CDEF上下文

enc_handle_ptr->cdef_context_ptr_array[process_index], // CDEF上下文指针

svt_aom_cdef_context_ctor, // CDEF上下文构造函数

enc_handle_ptr, // 编码器处理指针

process_index); // 过程索引

}

// 恢复上下文

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->rest_context_ptr_array, enc_handle_ptr->scs_instance_array[0]->scs->rest_process_init_count); // 分配恢复上下文指针数组

EbPictureBufferDescInitData input_data; // 初始化图片缓冲区描述符数据

input_data.enc_mode = enc_handle_ptr->scs_instance_array[0]->scs->static_config.enc_mode; // 设置编码模式

for (process_index = 0; process_index < enc_handle_ptr->scs_instance_array[0]->scs->rest_process_init_count; ++process_index) { // 遍历恢复过程

EB_NEW( // 创建新的恢复上下文

enc_handle_ptr->rest_context_ptr_array[process_index], // 恢复上下文指针

svt_aom_rest_context_ctor, // 恢复上下文构造函数

enc_handle_ptr, // 编码器处理指针

&input_data, // 输入数据指针

process_index, // 过程索引

pic_mgr_port_lookup(PIC_MGR_INPUT_PORT_REST, process_index)); // 图片管理端口查找(REST)

}

// 熵编码上下文

EB_ALLOC_PTR_ARRAY(enc_handle_ptr->entropy_coding_context_ptr_array, enc_handle_ptr->scs_instance_array[0]->scs->entropy_coding_process_init_count); // 分配熵编码上下文指针数组

for (process_index = 0; process_index < enc_handle_ptr->scs_instance_array[0]->scs->entropy_coding_process_init_count; ++process_index) { // 遍历熵编码过程

EB_NEW( // 创建新的熵编码上下文

enc_handle_ptr->entropy_coding_context_ptr_array[process_index], // 熵编码上下文指针

svt_aom_entropy_coding_context_ctor, // 熵编码上下文构造函数

enc_handle_ptr, // 编码器处理指针

process_index, // 过程索引

rate_control_port_lookup(RATE_CONTROL_INPUT_PORT_ENTROPY_CODING, process_index)); // 速率控制端口查找(熵编码)

}

// 打包上下文

EB_NEW( // 创建新的打包上下文

enc_handle_ptr->packetization_context_ptr, // 打包上下文指针

svt_aom_packetization_context_ctor, // 打包上下文构造函数

enc_handle_ptr, // 编码器处理指针

rate_control_port_lookup(RATE_CONTROL_INPUT_PORT_PACKETIZATION, 0), // 速率控制端口查找(打包)

pic_mgr_port_lookup(PIC_MGR_INPUT_PORT_PACKETIZATION, 0), // 图片管理端口查找(打包)

EB_PictureDecisionProcessInitCount + EB_RateControlProcessInitCount); // 图片决策过程初始化计数加速率控制过程初始化计数(ME端口索引)

/

  • 线程句柄

/

EbSvtAv1EncConfiguration *config_ptr = &enc_handle_ptr->scs_instance_array[0]->scs->static_config; // 获取编码器配置指针

if CLN_LP_LVLS

if (config_ptr->pin_threads || config_ptr->target_socket != -1) // 如果固定线程或目标插座不为-1

else

if (config_ptr->pin_threads == 1) // 如果固定线程为1

endif

svt_set_thread_management_parameters(config_ptr); // 设置线程管理参数

control_set_ptr = enc_handle_ptr->scs_instance_array[0]->scs; // 获取控制集指针

// 资源协调

EB_CREATE_THREAD(enc_handle_ptr->resource_coordination_thread_handle, svt_aom_resource_coordination_kernel, enc_handle_ptr->resource_coordination_context_ptr); // 创建资源协调线程

EB_CREATE_THREAD_ARRAY(enc_handle_ptr->picture_analysis_thread_handle_array, control_set_ptr->picture_analysis_process_init_count, svt_aom_picture_analysis_kernel, enc_handle_ptr->picture_analysis_context_ptr_array); // 创建图片分析线程数组

// 图片决策

EB_CREATE_THREAD(enc_handle_ptr->picture_decision_thread_handle, svt_aom_picture_decision_kernel, enc_handle_ptr->picture_decision_context_ptr); // 创建图片决策线程

// 运动估计

EB_CREATE_THREAD_ARRAY(enc_handle_ptr->motion_estimation_thread_handle_array, control_set_ptr->motion_estimation_process_init_count, svt_aom_motion_estimation_kernel, enc_handle_ptr->motion_estimation_context_ptr_array); // 创建运动估计线程数组

// 初始速率控制

EB_CREATE_THREAD(enc_handle_ptr->initial_rate_control_thread_handle, svt_aom_initial_rate_control_kernel, enc_handle_ptr->initial_rate_control_context_ptr); // 创建初始速率控制线程

// 基于源的操作

EB_CREATE_THREAD_ARRAY(enc_handle_ptr->source_based_operations_thread_handle_array, control_set_ptr->source_based_operations_process_init_count, svt_aom_source_based_operations_kernel, enc_handle_ptr->source_based_operations_context_ptr_array); // 创建基于源的操作线程数组

// TPL分配器

EB_CREATE_THREAD_ARRAY(enc_handle_ptr->tpl_disp_thread_handle_array, control_set_ptr->tpl_disp_process_init_count, svt_aom_tpl_disp_kernel, enc_handle_ptr->tpl_disp_context_ptr_array); // 创建TPL分配器线程数组

// 图片管理

EB_CREATE_THREAD(enc_handle_ptr->picture_manager_thread_handle, svt_aom_picture_manager_kernel, enc_handle_ptr->picture_manager_context_ptr); // 创建图片管理线程

// 速率控制

EB_CREATE_THREAD(enc_handle_ptr->rate_control_thread_handle, svt_aom_rate_control_kernel, enc_handle_ptr->rate_control_context_ptr); // 创建速率控制线程

// 模式决策配置过程

EB_CREATE_THREAD_ARRAY(enc_handle_ptr->mode_decision_configuration_thread_handle_array, control_set_ptr->mode_decision_configuration_process_init_count, svt_aom_mode_decision_configuration_kernel, enc_handle_ptr->mode_decision_configuration_context_ptr_array); // 创建模式决策配置线程数组

// 编码解码过程

EB_CREATE_THREAD_ARRAY(enc_handle_ptr->enc_dec_thread_handle_array, control_set_ptr->enc_dec_process_init_count, svt_aom_mode_decision_kernel, enc_handle_ptr->enc_dec_context_ptr_array); // 创建编码解码线程数组

// DLF过程

EB_CREATE_THREAD_ARRAY(enc_handle_ptr->dlf_thread_handle_array, control_set_ptr->dlf_process_init_count, svt_aom_dlf_kernel, enc_handle_ptr->dlf_context_ptr_array); // 创建DLF线程数组

// CDEF过程

EB_CREATE_THREAD_ARRAY(enc_handle_ptr->cdef_thread_handle_array, control_set_ptr->cdef_process_init_count, svt_aom_cdef_kernel, enc_handle_ptr->cdef_context_ptr_array); // 创建CDEF线程数组

// 恢复过程

EB_CREATE_THREAD_ARRAY(enc_handle_ptr->rest_thread_handle_array, control_set_ptr->rest_process_init_count, svt_aom_rest_kernel, enc_handle_ptr->rest_context_ptr_array); // 创建恢复线程数组

// 熵编码过程

EB_CREATE_THREAD_ARRAY(enc_handle_ptr->entropy_coding_thread_handle_array, control_set_ptr->entropy_coding_process_init_count, svt_aom_entropy_coding_kernel, enc_handle_ptr->entropy_coding_context_ptr_array); // 创建熵编码线程数组

// 打包

EB_CREATE_THREAD(enc_handle_ptr->packetization_thread_handle, svt_aom_packetization_kernel, enc_handle_ptr->packetization_context_ptr); // 创建打包线程

svt_print_memory_usage(); // 打印内存使用情况

return return_error; // 返回错误代码

}

相关文章:

  • 力扣刷题Day 25:反转链表(206)
  • 【android bluetooth 协议分析 11】【AVDTP详解 1】【宏观感受一下avdtp是个啥东东】
  • 入住刚装修好的新房,房间隔音太差应该怎么办?
  • ERP系统多少钱一套?| 上海达策TECH-SONIC
  • 三维几何变换
  • 修改element UI 分页组件样式(解决样式不生效问题)
  • Java多线程编程初阶指南
  • 【实战】oninput 文本框输入实时查询防抖机制实现
  • 数字IC低功耗设计——基础概念和低功耗设计方法
  • 出现了锁等待或死锁现象怎么办?乐观锁?分布式锁了解一下?
  • 前端笔记-Vue3(中)
  • 输入框仅支持英文、特殊符号、全角自动转半角 vue3
  • Sqlserver安全篇之_Sqlcmd命令使用windows域账号认证sqlserver遇到问题如何处理的案例
  • JVM考古现场(二十四):逆熵者·时间晶体的永恒之战
  • 乐视系列玩机---乐视1 x600系列线刷救砖以及刷写第三方twrp 卡刷第三方固件步骤解析
  • 【AI News | 20250422】每日AI进展
  • Java 静态内部类面试题与高质量答案合集
  • 华为仓颉编程语言基础概述
  • 【漫话机器学习系列】215.处理高度不平衡数据策略(Strategies For Highly Imbalanced Classes)
  • 性能比拼: Redis vs Dragonfly
  • 18米巨作绘写伏羲女娲,安徽展石虎最后十年重彩画
  • “电化长江”的宜昌成果:船舶航运停靠都能用电,助力一江清水向东流
  • 牛市早报|外汇局:4月以来外汇市场交易保持平稳,跨境资金延续净流入
  • 中纪委驻中组部纪检监察组原组长李刚被捕
  • 关税飓风下的跨境电商人:已度过焦虑期,和中国做生意是美国最优解
  • 竹笋食用不当,小心“鲜”变“险”