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; // 返回错误代码
}