x265 mctf代码逻辑分析

发布于:2025-07-19 ⋅ 阅读:(10) ⋅ 点赞:(0)

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;

}

}

//如果找到了就用最终实际编码帧类型配置时域滤波参考帧信息


网站公告

今日签到

点亮在社区的每一天
去签到