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; // 返回错误代码
}
相关文章:
SVT-AV1编码器初始化函数
一 函数解释 这个函数SVT-AV1编码器初始化的核心函数,负责配置编码器组件,分配资源并启动编码线程,以下时对每一行的详细解释。 函数签名和参数检查 EB_API EbErrorType svt_av1_enc_init(EbComponentType *svt_enc_component) { if (svt_enc…...
Unity 导出Excel表格
1.首先,需要导入EPPlus.dll;(我这里用的是Unity 2017.3.0f3) https://download.csdn.net/download/qq_41603955/90670669 2.代码如下: using UnityEngine; using UnityEditor; using System.IO; using OfficeOpenXm…...
Web前端开发技术——HTML5、CSS3、JavaScript
一、HTML 1.基本结构 <html lang "en"><head><meta charset"UTF-8"><meta name"Keywords" content""><meta name"Description" content""><title>Web网页标题</title&g…...
野外价值观:在真实世界的语言模型互动中发现并分析价值观
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
【华为HCIP | 华为数通工程师】821—多选解析—第十二页
多选727、某台路由器的输出信息如下所示,以下描述正确的有哪些选项? A、路由器Router ID为10.0.1.1 B、路由器Router ID为10.0.2.2。 C、本路由器的接口地址为10.0.12.2。 D、本路由器是DR。 解析:display ospf peer //获取的OSPF邻居信…...
Selenium 在爬取过程中,网络响应被退出的解决方案
我在使用 Selenium 爬取网站的时候,直接get url ,却立马闪退,遇到了获取网络响应直接被退出的问题。 这通常是由于 反爬机制、浏览器检测 或 网络限制 导致的。 以下是 完整排查与解决方案: 1. 检查常见原因 问题类型典型表现可…...
楼宇自控怎样全方位融入建筑领域,为绿色建筑发展添砖加瓦
在全球积极倡导可持续发展的大背景下,绿色建筑已成为建筑领域发展的必然趋势。绿色建筑旨在减少对环境的负面影响,提高能源利用效率,为用户提供健康、舒适的室内环境。而楼宇自控系统作为建筑智能化的核心组成部分,正以其独特的技…...
语音合成(TTS)从零搭建一个完整的TTS系统-第二节-中文转拼音
一、概述 本节我们进行语音合成前端中的第二步,需要把中文转换为拼音。通过python和c两种语言进行实现,python可以直接调用pypinyin库实现。c实现是本节的重点,首先根据词典进行分词,接着把分词后的词进行词典映射,得到…...
基于springboot的停车位管理系统(源码+数据库)
12基于springboot的停车位管理系统:前端 thymeleaf、Jquery、bootstrap,后端 Springboot、Mybatis,系统角色分为:用户、管理员,管理员在管理后台录入车位信息,用户在线查找车位、预约车位,解决停…...
深入理解 Spring @Configuration 注解
在 Spring 框架中,@Configuration 注解是一个非常重要的工具,它用于定义配置类,这些类可以包含 Bean 定义方法。通过使用 @Configuration 和 @Bean 注解,开发者能够以编程方式创建和管理应用程序上下文中的 Bean。本文将详细介绍 @Configuration 注解的作用、如何使用它以及…...
15.三数之和(LeetCode)java
个人理解: 1.使用双指针做法,首先对数组进行排序 第一重for循环控制第一个数,对数组进行遍历。双指针初始化为lefti1, rigthnums.length-1。然后使用while循环移动双指针寻找合适的数。因为返回的是数,不是下标,数不能…...
2022年全国职业院校技能大赛 高职组 “大数据技术与应用” 赛项赛卷(10卷)任务书
2022年全国职业院校技能大赛 高职组 “大数据技术与应用” 赛项赛卷(10卷)任务书 模块A:大数据平台搭建(容器环境)(15分)任务一:Hadoop 伪分布式安装配置任务二:Flume安装…...
Redis—内存淘汰策略
记:全体LRU,ttl LRU,全体LFU,ttl LFU,全体随机,ttl随机,最快过期,不淘汰(八种) Redis 实现的是一种近似 LRU 算法,目的是为了更好的节约内存&…...
新能源汽车可视化大屏系统毕业设计
以下是一个基于Python和Flask框架的新能源汽车可视化大屏系统后台代码示例。这个系统提供API接口用于前端大屏展示新能源汽车相关数据。 主应用文件 (app.py) python from flask import Flask, jsonify, request from flask_cors import CORS import random from datetime imp…...
02-keil5的配置和使用
一、创建工程 1、在菜单栏”Project”,在弹出的下拉菜单,选择“New uVision Project”。 2、在弹出的对话框,填写工程的名字,例如工程名字为project。 3、为保存的工程,选择对应的芯片。 4、为当前工程,添…...
电脑硬盘丢失怎么找回?解决硬盘数据恢复的2种方法
无论是个人用户还是企业用户来讲,存储在磁盘中的文档、图片、视频、音频等数据都具有相当的价值。但在日常使用过程中,误删操作、病毒攻击、硬件故障等情况都可能造成电脑硬盘突然消失不见数据丢失。面对电脑硬盘丢失这类问题时,采取正确的应…...
【Spring】依赖注入的方式:构造方法、setter注入、字段注入
在Spring框架中,除了构造器注入(Constructor Injection)和Setter注入(Setter Injection),还有一种依赖注入方式:字段注入(Field Injection)。字段注入通过在Bean的字段上…...
涨薪技术|0到1学会性能测试第22课-关联函数web_reg_save_param_ex
前面的推文我们掌握了性能测试脚本开发3种常见的关联技术,今天开始给大家分享关联函数web_reg_save_param_ex,后续文章都会系统分享干货! LoadRunner最新版本中,使用的关联函数为web_reg_save_param_ex,以前的版本使用的关联函数为web_reg_save_param,但这两个函数实质差…...
Vue 的数据代理机制
2025/4/22 向 一、什么是数据代理机制 通过访问代理对象的属性,来间接访问目标对象的属性,数据代理机制的实现需要依赖Object.defineProperty()方法。 如下所示: <!DOCTYPE html> <html lang"en"> <head><…...
Android-KeyStore安全的存储系统
在 Android 中,AndroidKeyStore 是一个安全的存储系统,用于存储加密密钥。它提供了一种安全的方式来生成、存储和管理密钥,而无需将密钥暴露给应用程序本身。以下是如何使用 AndroidKeyStore 的基本步骤和示例代码。 检查 AndroidKeyStor…...
部署私有gitlab网站
以下是建立私有 GitLab 代码版本维护平台的完整步骤,涵盖环境准备、安装配置、初始化及日常管理,适用于企业/团队内部代码托管: 一、环境准备 1. 服务器要求(最低配置) 用途CPU内存存储系统要求小型团队(…...
(区间 dp)洛谷 P6879 JOI2020 Collecting Stamps 3 题解
题意 给定一个周长为 L L L 的圆,从一个点出发,有 N N N 个黑白熊雕像,编号为 1 1 1 到 N N N,第 i i i 个雕像在顺时针 X i X_i Xi 米处,如果你没有在 T i T_i Ti 秒内收集到这个黑白熊雕像,那…...
AtCoder 第402场初级竞赛 A~E题解
A CBC 【题目链接】 原题链接:A - CBC 【考点】 枚举 【题目大意】 找出所有的大写字母 【解析】 遍历字符串,判断是否为大写字母,如果是则输出。 【难度】 GESP二级 【代码参考】 #include <bits/stdc++.h> using namespace std;int main() {string s;ci…...
驱动开发硬核特训 · Day 17:深入掌握中断机制与驱动开发中的应用实战
🎥 视频教程请关注 B 站:“嵌入式 Jerry” 一、前言 在嵌入式驱动开发中,“中断”几乎无处不在。无论是 GPIO 按键、串口通信、网络设备,还是 SoC 上的各种控制器,中断都扮演着核心触发机制的角色。对中断机制掌握程度…...
深入理解依赖、Jar 包与 War 包:Java 开发基石探秘
一、引言 在 Java 开发的广袤天地里,依赖管理如同建筑的基石,默默支撑着项目的稳定构建与运行。而 Jar 包和 War 包,作为 Java 应用的常见打包形式,各自承载着不同的使命。本文将深入探讨依赖的重要性,并清晰解说 Jar…...
01.Python代码Pandas是什么?pandas的简介
01.Python代码Pandas是什么?pandas的简介 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是pandas的使用语法。前后每一小节的内容是存在的有:学习and理解的关联性,希望对您有用~ pyth…...
国产紫光同创FPGA实现SDI视频编解码+图像缩放,基于HSSTHP高速接口,提供2套工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目本博已有的 SDI 编解码方案本方案在Xilinx--Artix7系列FPGA上的应用本方案在Xilinx--Kintex系列FPGA上的应用本方案在Xilinx--Zynq系列FPGA上的应用本方案在Xilinx--U…...
25.4.22学习总结
如何通过好友列表对聊天框的切换 首先,我们知道,你的好友列表是用ListView组件实现的,那么,接下来,我们将开始讲解如何实现切换。 一、改造数据结构 如果你是跟着我的上一篇文章做的话,应该需要修改一些的…...
Agent智能体ReAct机制深度解读:推理与行动的完美闭环
一、从Chain-of-Thought到ReAct的范式演进 1.1 传统决策机制的局限 #mermaid-svg-Jf3ygvgHcGciJvX8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Jf3ygvgHcGciJvX8 .error-icon{fill:#552222;}#mermaid-svg-Jf3y…...
UnityDots学习(四)
官方案例HelloCube和Tank学习研究: HelloCube: 通用部分: 使用Authoring根据Inspector的勾选添加为Entity添加不同Component。然后每个System会根据实体添加的Component运行不同的System逻辑。 1. MainThread 简单构造System 先看System接口定义&am…...
Debian 12.10 root 登录失败,两步解决!
大家好,这里是 DBA学习之路,专注于提升数据库运维效率。 前言 今天看到 debian 正式发布 12.10,安装完成后发现无法登录 root 用户: 这里我一开始怀疑是 root 密码错了,所以改了一下 root 密码,忘记 root …...
AI大模型:(二)2.3 预训练自己的模型
目录 1.预训练原理 2.预训练范式 1.未标注数据 2.标注数据 3.有正确答案、也有错误答案 3.手撕transform模型 3.1.transform模型代码 3.2.训练数据集 3.3.预训练 3.4.推理 4.如何选择模型 5.如何确定模型需要哪种训练 大模型预训练(Large-scale Pre-training…...
【C语言】初阶算法相关习题(一)
个人主页 文章目录 ⭐一、数字在升序数组中出现的次数🏠二、整数转换🚀三、至少是其他数字两倍的最大数🏝️四、字符个数的统计🎄五、自除数🎡六、除自身以外数组的乘积🎉七、两个数组的交集 ⭐一、数字在…...
WITH 临时表 SQL优化
在 SQL 优化中, 临时表(CTE,Common Table Expression,公共表表达式) 是一种强大的工具,它通过定义一个临时的结果集(可以理解为 “虚拟表”),让复杂查询更易读、更高效&a…...
Go语言中 defer 使用场景及深度注意事项指南
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
第33周JavaSpringCloud微服务 面试题
一、项目面试 面试中介绍项目的方法 在面试过程中,若被问及相关项目,为提升通过几率,应着重介绍项目的功能点和架构升级内容。确保将项目的亮点讲透讲精彩,这对获取 offer 至关重要。 1. 项目架构 项目整体架构概述 项目整体…...
鸿蒙开发:Swiper轮播图
鸿蒙Swiper组件详解 一、Swiper组件概述 Swiper是鸿蒙(HarmonyOS)系统中提供的一个滑动容器组件,它允许用户通过手指滑动来切换子组件(通常是页面或图片),实现轮播图、引导页、图片浏览器等常见UI效果。 说明 该组件从API versi…...
Go语言之sync包 WaitGroup的使用和底层实现
在 Go 语言里,sync 包中的 WaitGroup 是一个实用工具,用于等待一组 goroutine 完成任务。其核心原理是通过内部维护一个计数器,该计数器初始值为 0,每启动一个新的 goroutine 就将计数器加 1,每个 goroutine 完成任务后…...
7N60-ASEMI无人机专用功率器件7N60
编辑:LL 7N60-ASEMI无人机专用功率器件7N60 型号:7N60 品牌:ASEMI 封装:TO-220F 最大漏源电流:7A 漏源击穿电压:600V 批号:最新 RDS(ON)Max:1.20Ω …...
SystemV-消息队列与责任链模式
一、SystemV 消息队列 1. 消息队列API Ftok 函数定义: key_t ftok(const char *pathname, int proj_id);函数作用: 获取唯一的key值标识符,用于标识系统V消息队列。参数解释: pathname:有效的文件路径(需…...
Ubuntu与Linux的关系
Linux 是一个 操作系统内核。它是一个类 Unix 系统,免费、开源,许多不同的操作系统(叫“发行版”)都是基于 Linux 内核构建的。 Ubuntu 是一个 基于 Linux 内核的操作系统发行版。它是目前最流行、最易用的 Linux 发行版之一&…...
同时支持windows和Linux的NFC读写器web插件
一个网站集成了NFC读写器的功能,如何才能跨系统运行呢,既要在windows系统下正常运行,也需要在银河麒麟,统信UOS等信创系统下运行。 友我科技NFC读写器web插件很好的解决了这个问题,在客户端不仅支持windows系统&#x…...
突破AI检测边界:对抗技术与学术伦理的终极博弈
随着GPT-4、Claude等大模型的文本生成能力突破人类写作水平,AI检测工具与对抗技术的博弈已进入白热化阶段。本文深入解析基于对抗训练的文本风格混淆网络如何突破GPTZero最新防御体系,探讨OpenAI多模态内容溯源系统引发的技术升级,并针对学术…...
pg数据库删除自建表空间
1. tbs_sjzx已经创建(略) pg数据库删除自己创建表空间;--查看表空间相关表 SELECT * FROM pg_tablespace; SELECT relname FROM pg_class WHERE reltablespace (SELECT oid FROM pg_tablespace WHERE spcname tbs_sjzx); SELECT * FROM pg_tables WHE…...
C++ 学习指南
new 关键字 #include <iostream> using namespace std;int* func() {// 在堆区创建int* p new int(10); return p; }void test01(void) {int *p func();cout << *p << endl;cout << *p << endl;cout << *p << endl;delete p;// 这…...
Scribe: 一个非常方便的操作文档编写工具
在日常生活中,当我们需要指导别人使用一个软件/web应用时,我们常常需要按流程对工具进行操作,走一遍主要功能,然后针对每一步进行截图,并附上操作说明。往往这样一套流程走下来,就会花费很长的时间。那么有…...
数据结构与算法-顺序表应用
一.通讯录的创建 首先我们要理解的是通讯录本身就是以顺序表为底层的 只不过顺序表中的数组,这里我们是用结构体来替代,用来存储用户的信息 由于是通讯录的本质就是顺序表,所以顺序表的任何方法它都能套用 Contact.h: #pragma once #def…...
DeepSeek系列(5):助力数据分析
数据解读与可视化建议 在数据驱动的商业环境中,有效解读数据并将其转化为直观可视化结果至关重要。DeepSeek作为强大的AI助手,可以帮助您从海量数据中提取洞见并提供专业的可视化建议。 DeepSeek在数据解读中的优势 DeepSeek可以通过以下方式帮助您更高效地解读数据: 上下…...
虚幻基础:动画k帧
文章目录 动画k帧:调整骨骼的变换达到自己想要的效果步骤打开动画原始文件选中骨骼调整到目标变换添加关键帧时间:自动添加到停留的那一帧数值:自动填写为调整后的数值 注释数值与骨骼细节面板上的数值并不对应,但是同样的效果为什…...
使用 LlamaIndex Workflows 与 Elasticsearch
作者:来自 Elastic Jeffrey Rengifo 在本文中,你将学习如何利用 LlamaIndex Workflows 与 Elasticsearch 快速构建一个使用 LLM 的自过滤搜索应用程序。 LlamaIndex Workflows 提出了一种不同的方式来处理将任务拆分给不同 agent 的问题,它引…...