SVT-AV1学习-svt_aom_get_sg_filter_level,svt_av1_selfguided_restoration_c
一 函数的作用
根据编码模式,输入分辨率和快速解码标志动态计算自引导恢复(Self Guide Restoration)过滤器的启动级别,以下是详细解析;
1 参数说明
EncMode enc_mode 编码模式(如ENC_MO,ENC_M3等, 通常表示编码复杂度,数值越小模式越低)
uint8_t input_resolution 输入视频 的分辨率范围(如INPUT_SIZE_8k_RANGE,
INPUT_SIZE_360p_RANGE等)。
uint8_t fast_decode 快速解码标志
2 核心逻辑
根据编码模式设置初始化过滤级别
if (enc_mode <= ENC_M0)
sg_filter_lvl = 1;
else if (enc_mode <= ENC_M3)
sg_filter_lvl = 3;
else
sg_filter_lvl = 0;
低编码模式(如ENC_M0) 优先保证图像质量,启用过滤(强度1)
中低编码模式(如ENC_M3) 进一步优化质量,启用更强过滤
高编码模式 性能优先,关闭滤镜。
根据分辨率和快速解码调整过滤级别
if (input_resolution >= INPUT_SIZE_8K_RANGE ||
(fast_decode && !(input_resolution <= INPUT_SIZE_360p_RANGE)))
sg_filter_lvl = 0;
高分辨率 >= 8k. 关闭滤镜,
二 sg filter详解
Self-Guide 滤波器,是一种用于图像和视频恢复的技术,旨在通过结合两个初始过滤帧X1和X2来改善图像质量,总结:
1 SGF目的
设计用于获取两个初始化过滤帧X1和X2,并通过他们来恢复最终图像X
2 最终恢复公式
最终恢复X1是退化样本X和X1,X2与X的差值组合,公式如下
Xr = X + a(X1-X) + b(X2-X)
3 编码器参数计算
a和b是使用最小均方差方法计算得到的。
a,b^T = (A^T A)^-1 A^Tb
其中A时由X1-X和X2-X组成的矩阵,b是原始样本向量y减去样本向量x的结果
4 引导滤波器控制参数
X1和X2是使用引导滤波得到的,由半径参数r和噪声参数e控制。
r的较大值意味着更高的空间方差,e的较大值意味着更高的范围方差。
5 SGF应用
编码器需要将r1,e1,r2,e2,a和b的值信号传输到比特流中
6 初始过滤帧派生步骤
分别为X1和X2生成提供(r,e)对
计算以待过滤像素为中心的窗口内的输入样本的均值u和方差sigma^2.
使用如下公式计算每个样本的过滤样本
X' = sigma ^2/(sigma ^ 2 + e) + e/(sigma^2 + e) * u
使用过滤样本x',为LRU中的每个样本生成X1和X2
7 SGF的最终应用
使用如下方程和信号传输的(a,b)应用SGF
Xr = X + a(X1 - X) + b(X2-X)
SGF通过结合退化样本和粗略恢复样本的差异,以及通过引导滤波得到的两个初始过滤帧,来优化图像质量,这种方法允许在保持图像细节的同时减少噪声和压缩伪影。
三 滤波函数svt_av1_selfguided_restoration_c
svt_av1_selfguided_restoration_c 函数是SVT-AV1编码器中用于执行自引导恢复(Self-Guided Restoration,SGR)的函数,以下是该函数的参数解释和功能说明。
参数解释
dgd8: 指向输入图像数据的指针, 表示需要恢复的图像
width 输入图像的宽度
height 输入图像的高度
dgd_stride 输入图像的步长,即每行像素的字节数
flt0 指向第一个过滤器的指针,用于存储过滤后的图像数据
flt1 指向第二个过滤器的指针,用于存储过滤后的图像数据
flt_stride 过滤器的补偿,即每行过滤器数据的字节数
sgr_params_idx 自引导恢复参数的索引,用于特定的恢复参数
bit_depth 图像深度
highbd 是否使用高比特深度处理
四 svt_av1_selfguided_restoration_c函数注释
void svt_av1_selfguided_restoration_c(const uint8_t *dgd8, int32_t width, int32_t height, int32_t dgd_stride,
int32_t *flt0, int32_t *flt1, int32_t flt_stride, int32_t sgr_params_idx,
int32_t bit_depth, int32_t highbd)
{
//定义一个局部数组,用于存储扩展后的图像数据,包括边界扩展部分
int32_t dgd32_[RESTORATION_PROC_UNIT_PELS];
//计算扩展图像的步长,包括水平方向的边界扩展
const int32_t dgd32_stride = width + 2 * SGRPROJ_BORDER_HORZ;
//指向扩展后图像数据的指针,初始位置指向扩展区域的中心
int32_t *dgd32 = dgd32_ + dgd32_stride * SGRPROJ_BORDER_VERT + SGRPROJ_BORDER_HORZ;
//如果是高比特深度的处理
if (highbd) {
//将输入图像数据转换为16位短整型指针
const uint16_t *dgd16 = CONVERT_TO_SHORTPTR(dgd8);
//对图像进行垂直方向的边界扩展
for (int32_t i = -SGRPROJ_BORDER_VERT; i < height + SGRPROJ_BORDER_VERT; ++i) {//对图像进行水平方向的边界扩展
for (int32_t j = -SGRPROJ_BORDER_HORZ; j < width + SGRPROJ_BORDER_HORZ; ++j)
//将扩展后的图像数据存储到dgd32数组中
dgd32[i * dgd32_stride + j] = dgd16[i * dgd_stride + j];
}
} else {
//对图像进行垂直方向的边界扩展
for (int32_t i = -SGRPROJ_BORDER_VERT; i < height + SGRPROJ_BORDER_VERT; ++i) {//对图像进行水平的边界扩展
for (int32_t j = -SGRPROJ_BORDER_HORZ; j < width + SGRPROJ_BORDER_HORZ; ++j)
//将扩展后的图像数据存储到dgd32数组中
dgd32[i * dgd32_stride + j] = dgd8[i * dgd_stride + j];
}
}
//获取自引导恢复参数,根据参数索引sgr_params_idx从预定的参数表中获取
const SgrParamsType *const params = &svt_aom_eb_sgr_params[sgr_params_idx];
// If params->r == 0 we skip the corresponding filter. We only allow one of
// the radii to be 0, as having both equal to 0 would be equivalent to
// skipping SGR entirely.
//断言,确保两个半径参数重至少有一个部位0,否则自引导恢复将没有意义
assert(!(params->r[0] == 0 && params->r[1] == 0));
//如果第一个半径参数大于0, 则执行快速自引导恢复
if (params->r[0] > 0)
selfguided_restoration_fast_internal(
dgd32, width, height, dgd32_stride, flt0, flt_stride, bit_depth, sgr_params_idx, 0);
if (params->r[1] > 0)
//如果第二个半径参数大于0,则执行标准自引导恢复
selfguided_restoration_internal(
dgd32, width, height, dgd32_stride, flt1, flt_stride, bit_depth, sgr_params_idx, 1);
}
边界扩展 在处理图像时,为了处理图像边界像素,通常会进行边界扩展,这里的SGRPROJ_BORDER_VERT 和 SGRPROJ_BORDER_HORZ 定义了垂直和水平方向的扩展宽度。
高比特深度处理 highbd参数指示是否使用高比特深度处理,如果是,则输入数据以16位短整形表示,否则以8位无符号字符表示
自引导恢复参数 sgr_params_idx 用于从预定义的参数表中选择自引导恢复参数,这些参数定义了恢复过程中的关键参数,如半径等。
断言 assert 用于确保两个半径参数中至少有一个部位0,否则自引导恢复将无意义。
恢复函数 selfguided_restoration_fast_internal 和selfguided_restoration_internal 分别用于快速和标准的自引导恢复处理。