set_all_ref_frame_type函数的主要作用是为当前图像设置所有可能用到的参考帧类型,并将这些参考帧类型存储到一个数组中,同时记录总共有多少个参考帧类型,以下是该函数的各部分解释:
初始化和准备
MvReferenceFrame rf[2];
*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) {
rf[0] = svt_get_ref_frame_type(REF_LIST_0, ref_idx0);
ref_frame_arr(*tot_ref_frames ++) = rf[0];
}
遍历参考列表0中的所有参考帧索引
对于每个参考帧索引ref_idx0, 使用svt_get_ref_frame_type 函数获取对应的参考帧类型并存储在rf[0]中。
将获取到的参考帧类型添加到ref_frame_arr数组中,并增加tot_ref_frames计数。
处理参考列表1中的单向参考帧
for (uint8_t ref_idx1 = 0; ref_idx1 < ppcs->ref_list1_count_try; ++ref_idx1)
{
rf[1] = svt_get_ref_frame_type(REF_LIST_1, ref_idx1);
ref_frame_arr[(*tot_ref_frames)++] = rf[1];
}
遍历参考列表1中的所有参考帧索引
对于每个参考帧索引ref_idx1, 使用svt_get_ref_frame_type函数获取对应的参考帧类型,并存储在rf[1]中。
将获取到的参考帧类型添加到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)
{
rf[0] = svt_get_ref_frame_type(REF_LIST_0, ref_idx0);
rf[1] = 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中的参考帧类型,分别存储在rf[0]和rf[1]中。
将这两个参考帧类型组合成一个复合参考帧类型,并使用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) {
rf[0] = LAST_FRAME;
rf[1] = LAST2_FRAME;
ref_frame_arr[(*tot_ref_frames)++] = av1_ref_frame_type(rf);
if (ppcs->ref_list0_count_try > 2) {
rf[1] = LAST3_FRAME;
ref_frame_arr[(*tot_ref_frames)++] = av1_ref_frame_type(rf);
if (ppcs->ref_list0_count_try > 3) {
rf[1] = GOLDEN_FRAME;
ref_frame_arr[(*tot_ref_frames)++] = av1_ref_frame_type(rf);
}
}
}
//处理复合单向参考帧 参考列表1
if (ppcs->ref_list1_count_try > 2) {
rf[0] = BWDREF_FRAME;
rf[1] = 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帧,收集所有可能的参考组合类型,并将它们存储在一个数组中,这些参考类型将在后续的编码过程中用于运动估计和补偿等操作,以提高编码效率和视频质量。