一 x265源码中,mctf参考帧构建
//检查是否启用时域滤波,并且当前帧需要滤波(根据切片类型配置)
if (m_param->bEnableTEmporalFilter && isFilterThisFrame(frameEnc[0]->m_mcstf->m_sliceTypConfig, frameEnc[0]->m_lowres.sliceType))
{
//遍历所有参考帧(m_numRef 是参考帧数量, 循环为每个参考帧配置滤波所需要的信息)
for (int i = 0; i < frameEnc[0]->m_mcstf->m_numRef; i++)
//遍历所有参考帧
//m_numRef 当前帧的参考帧数量
//循环为每个参考帧配置滤波所需要的信息
TemporalFilterRefPicInfo* ref = &frameEnc[0]->m_mcstfRefList[i];
//ref 指向当前处理的参考帧信息结构体
//Resetting the reference picture buffer from mcstfpiclist
Frame* iterFrame = frameEnc[0]->m_encData->m_slice->m_mcstfRefFrameList[1][i];
//从参考帧列表中获取第i个参考帧对象
ref->picBuffer = iterFrame->m_mcstffencPic;//存储用于滤波的像素数据
//通过lookahead 模块预测帧类型
//计算参考帧的POC,当前帧到参考帧的POC偏移量
ref->slicetype = m_lookahead->findSliceType(frameEnc[0]->m_poc + ref->origOffset);
Frame* dpbframePtr = m_dpb->m_picList.getPOC(frameEnc[0]->m_poc + ref->origOffset, 0);//从解码图像缓冲区DPB中按照POC 查找已经重建的帧
if (dpbframePtr != NULL)
{
if (dpbframePtr->m_encData->m_slice->m_sliceType == B_SLICE)
ref->slicetype = X265_TYPE_B;
else if (dpbframePtr->m_encData->m_slice->m_sliceType == P_SLICE)
ref->slicetype = X265_TYPE_P;
else
ref->slicetype = X265_TYPE_I;
}
}
//如果找到了,就用最终实际编码帧类型,配置时域滤波参考帧信息