SVTAV1源码-set_all_ref_frame_type

set_all_ref_frame_type函数的主要作用是为当前图像设置所有可能用到的参考帧类型,并将这些参考帧类型存储到一个数组中,同时记录总共有多少个参考帧类型,以下是该函数的各部分解释:

初始化和准备

MvReferenceFrame rf2;

*tot_ref_frames = 0;

定一个大小为2的MvReferenceFrame类型的数组rf,用于暂时存储参考帧类型

将tot_ref_frames变量初始化为0,用于记录总共有多少个参考帧类型

处理参考列表中0的单向参考帧

for (uint8_t ref_idx0 = 0; ref_idx0 < ppcs->ref_list0_count_try; ++ref_idx0) {

rf0 = svt_get_ref_frame_type(REF_LIST_0, ref_idx0);

ref_frame_arr(*tot_ref_frames ++) = rf0;

}

遍历参考列表0中的所有参考帧索引

对于每个参考帧索引ref_idx0, 使用svt_get_ref_frame_type 函数获取对应的参考帧类型并存储在rf0中。

将获取到的参考帧类型添加到ref_frame_arr数组中,并增加tot_ref_frames计数。

处理参考列表1中的单向参考帧

for (uint8_t ref_idx1 = 0; ref_idx1 < ppcs->ref_list1_count_try; ++ref_idx1)

{

rf1 = svt_get_ref_frame_type(REF_LIST_1, ref_idx1);

ref_frame_arr(\*tot_ref_frames)++ = rf1;

}

遍历参考列表1中的所有参考帧索引

对于每个参考帧索引ref_idx1, 使用svt_get_ref_frame_type函数获取对应的参考帧类型,并存储在rf1中。

将获取到的参考帧类型添加到ref_frame_arr数组中,并增加tot_ref_frames 计数

处理双向符合参考帧

for (uint8_t ref_idx0 = 0; ref_idx0 < ppcs->ref_list0_count_try; ++ref_idx0)

for (uint8_t ref_idx1 = 0; ref_idx1 < ppcs->ref_list1_count_try; ++ref_idx1)

{

rf0 = svt_get_ref_frame_type(REF_LIST_0, ref_idx0);

rf1 = svt_get_ref_frame_type(REF_LIST_1, ref_idx1);

ref_frame_arr(\*tot_ref_frames)++ = av1_ref_frame_type(rf);

}

嵌套循环遍历参考列表0和参考列表1中的所有参考帧索引组合

对于每个组合,获取参考列表0和参考列表1中的参考帧类型,分别存储在rf0和rf1中。

将这两个参考帧类型组合成一个复合参考帧类型,并使用av1_ref_frame_type函数转换后,添加到ref_frame_arr数组中,并增加tot_ref_frames 计数。

处理B帧的复合单向参考帧

if (ppcs->slice_type == B_SLICE) {

//处理复合单向参考帧 参考列表0

if (ppcs->ref_list0_count_try > 1) {

rf0 = LAST_FRAME;

rf1 = LAST2_FRAME;

ref_frame_arr(\*tot_ref_frames)++ = av1_ref_frame_type(rf);

if (ppcs->ref_list0_count_try > 2) {

rf1 = LAST3_FRAME;

ref_frame_arr(\*tot_ref_frames)++ = av1_ref_frame_type(rf);

if (ppcs->ref_list0_count_try > 3) {

rf1 = GOLDEN_FRAME;

ref_frame_arr(\*tot_ref_frames)++ = av1_ref_frame_type(rf);

}

}

}

//处理复合单向参考帧 参考列表1

if (ppcs->ref_list1_count_try > 2) {

rf0 = BWDREF_FRAME;

rf1 = ALTREF_FRAME;

ref_frame_arr(\*tot_ref_frames)++ = av1_ref_frame_type(rf);

}

}

如果当前图像的切片类型是B帧 B_SLICE ,则额外处理一些复合单向参考帧

参考列表0的复合单向参考帧

如果参考列表0的参考帧计数大于1,则将LAST_FRAME和LAST2_FRAME组合成一个复合参考帧类型,并添加到ref_frame_arr数组中

如果参考列表0的参考帧计数大于2,则将LAST_FRAME和LAST3_FRAME组合成一个复合参考帧类型,并添加到数组中。

如果参考列表0的参考帧计数大于3,则将LAST_FRAME和GOLDEN_FRAME组合成一个复合参考帧类型,并添加到数组中。

这个函数的核心目的根据当前图像的参考列表list0和list1 以及切片类型如B帧,收集所有可能的参考组合类型,并将它们存储在一个数组中,这些参考类型将在后续的编码过程中用于运动估计和补偿等操作,以提高编码效率和视频质量。

相关推荐
DogDaoDao20 小时前
【H266/VVC提案解读】ITU-T H.274 (V4) 规范深度解读 — 视频编码 SEI 消息的全面演进
音视频·实时音视频·视频编解码·流媒体·h266·vvc·视频编解码标准
DogDaoDao2 天前
MSU 2026 视频编解码大赛放榜深度解读
音视频·视频编解码·hevc·av1·h266·msu·avs
DogDaoDao2 天前
NNVC-17.1 深度解析:神经网络视频编码的最新进展与性能全景
神经网络·音视频·视频编解码·h266·vvc·vtm·nnvc
DogDaoDao3 天前
H.266/VVC 双雄对决:VTM vs VVenC 深度对比分析
音视频·视频编解码·vvc·vtm·h.266·视频压缩·vvenc
海带紫菜菠萝汤10 天前
VP9 vs AV1 vs H.265 编码格式对比:压缩效率与解码性能实测
音视频·h.265·av1·vp9
星花月10 天前
视频压缩为什么会变糊?从码率、分辨率到 H.264/H.265 的参数选择指南
ffmpeg·音视频·h.265·视频编解码·视频
DogDaoDao11 天前
VVC (H.266) 视频编解码标准最新研究进展:2025-2026 前沿论文与标准提案介绍
深度学习·音视频·视频编解码·vvc·h.266·预测编码·视频编解码标准
DogDaoDao11 天前
FFmpeg 9.0 “Lei“ 正式发布:十年之后,以你之名
ffmpeg·音视频·实时音视频·视频编解码·ffprobe·ffmpeg 9.0
DogDaoDao13 天前
DeepQTMT: 深度学习加速VVC帧内编码CU划分 —— 论文深度解读与源码拆解
人工智能·深度学习·视频编解码·h266·vvc·帧内预测·deepqtmt
一个有点技术的程序猿13 天前
局域网中视频采集,颜色空间转换,编码,网络发送,接收,解码,渲染全链路卡顿分析
网络·音视频·视频编解码