一 pd_process.c 是SVT-AV1编码器中的Picture Decision处理模块,主要功能包括
核心功能
1 图片决策上下文管理,创建和管理PD处理所需要的数据结构
--创建和销毁Picture Decision上下文
--管理图片决策过程中的各种数据结构和缓冲区
2 场景转换检测:使用直方图差异检测场景切换和突然变化
--检测视频序列中的场景切换
--检测突然变化(如闪光灯效果)
--使用直方图差异(AHD - Average Historgram Difference)进行检测
3 参考图片集管理:填充,统计信息收集等
--生成的管理参考图片集信息
--设置参考图片列表List0和List1
--处理参考图片的POC Picture Order Count 和显示顺序
4 图片预处理:填充,统计信息收集等
--图片填充(padding)到SuperBlock尺寸的倍数
--图片填充到最小块尺寸的倍数
--图片统计信息收集
5 Mini GOP管理:管理图片组的结构和配置
--管理Mini GOP的结构和配置
--处理Mini GOP内的图片顺序和依赖关系
--评估Mini GOP的活动度(Activity)
6 时域滤波处理:管理时域滤波相关的图片缓冲区
--管理时域滤波相关的图片缓冲区
--处理低延迟模式下的时域滤波
--多级时域滤波 MCTF
7 预测结构设置:根据配置设置预测结构
--根据编码配置设置预测结构
--支持多种预测结构:Flat, Hierarchical等
--设置关键帧 Key Frame, 和S帧 S-Frame
8 图片决策主循环:处理图片并发送到后续模块
--处理来自Picture Analysis的结果
--为每个图片设置编码参数
--将处理后的图片发送到后续处理阶段ME,TF等
9 屏幕内容检测
--检测输入内容是否为屏幕内容,Screen Content
-- 平米内容需要特殊的编码策略
10 自适应量化 Adaptive Quantization
-- 初始化循环刷新 Cycle Refresh
-- 管理AQ相关的参数
在编码流程中的位置
输入:来自Picture Analysis Porcess的结果
输出:发送到Motion Estimation和Temporal Filtering模块
关键数据结构
-PictureDecisionContext: 图片决策上下文,包含所有决策相关的状态信息
PictureParentControlSet: 图片父控制集,包含图片的所有编码参数
SequenceControlSet 序列控制集,包含序列级别的配置。
与其他模块的关系
输入:来自Picture Analysis Process的结果
输出:发送到Motion Estimation 和Temporal Filterting 模块
处理流程:
1 接收Picture Analysis 的结果
2 进行场景转换检测
3 设置预测结构和参考图片集
4 进行图片预处理和统计信息收集
5 管理Mini GOP结构
6 设置图片编码参数
7 发送到后续处理阶段
性能优化:
使用多线程处理
支持低延迟模式
支持多级时域滤波
支持自适应量化
/*
Defines 定义常量
层级偏移量定义,用于预测结构中的层级索引
这些偏移用于在分层预测结构中定位不同层级的图片
函数名:calc_ahd
功能:计算平均直方图差异,Average Histogram Difference, AHD
该函数用于场景转换检测,通过比较当前图片和参考图片的直方图差异来判断
场景是否发生变化,AHD值越大,表示两帧之间的差异越大
参数:
scs 序列控制集,包含序列级别的配置信息
input_pcs 输入图片的控制集,当前要分析的图片
ref_pcs: 参考图片的控制集,用于比较的参考图片
active_region_cnt 输出参数,统计活跃区域的数量。
ahd 计算得到的平均直方图差异值
算法说明:
1 将图片成多个区域
2 对每个区域,计算其直方图与参考图片对应区域直方图的差异
3 累加所有区域的差异值得到总的AHD
4 如果某个区域的差异超过阈值,则将其标记为活跃区域
*/
static uint32_t calc_ahd(
SequenceControlSet *scs, #序列控制集指针
PictureParentControlSet *input_pcs, #输入图片控制集指针
PictureParentControlSet *ref_pcs, #参考图片控制集指针
uint8_t *active_region_cnt #活跃区域计数指针
)
{
uint32_t ahd = 0;//初始化AHD值为0,用于累加所有区域的直方图差异
//计算每个区域的宽度和高度
//区域宽度 = 图片宽度 / 水平方向区域数量
uint32_t region_width = ref_pcs->enhance_pic->width / scs->picture_analysis_number_of_regions_per_width;
//区域高度 = 图片高度 / 垂直方向区域数量
uint32_t region_height = ref_pcs->enhance_pic->height / scs->picture_analysis_number_of_regions_per_height;
//遍历图片中的所有区域
//外层循环,遍历水平方向的所有区域
for (int i = 0; i<width;i++)
for (int j = 0; j<height; j++) {
uint32_t ahd_per_region = 0;
for (int bin = 0; bin < 255; bin++) {
//计算当前区域在指定bin上的直方图差异
//取绝对值,累加到当前区域的AHD值中
ahd_per_region += ABS((int32_t)input_pcs->picture_histogram[region_in_picture_width_index][region_in_picture_height_index][bin] - (int32_t)ref_pcs->picture_histogram[region_in_picture_width_index][region_in_picture_height_index][bin]);
}
ahd += ahd_per_region;//将当前区域的AHD值累加到总AHD值中
//如果当前区域的AHD值超过阈值,区域面积,则认为是活跃区域
//活跃区域表示该区域发生了显著变化
if (ahd_per_region > (region_width * region_height))
(*active_region_cnt)++; //增加活跃区域计算
}
}
return ahd; //返回计算得到总的ahd值
}
1980

被折叠的 条评论
为什么被折叠?



