基于HM软件提取B帧中4x4 CU的Merge模式信息技术问询
HM解码后提取B帧Merge模式4x4 CU的判断逻辑补全
核心逻辑说明
HM中B帧的Merge候选列表有固定结构:
- 前5个为空间候选,每个候选会明确使用L0、L1或双向参考
- 第6个为时间候选
- 后续为组合双向候选(本次需求暂不涉及)
要区分空间/时间预测及L0/L1方向,需通过TComDataCU的接口获取Merge候选的索引和参考方向信息,同时要确保只处理4x4尺寸的CU。
补全后的完整代码
string save = "**********"; ofstream CU_merge; string CU_file_name = "cu_merge.txt"; CU_merge.open(save + CU_file_name, std::ios_base::app); for (UInt ctuRsAddr = 0; ctuRsAddr < pcPic->getNumberOfCtusInFrame(); ctuRsAddr++) { TComDataCU* pCtu = pcPic->getCtu(ctuRsAddr); for (int i = 0; i < pCtu->getTotalNumPart(); i++) { int zscan = g_auiRasterToZscan[i]; // 仅处理B帧、无双向预测限制、使用Merge模式的4x4 CU if ((pcSlice->isInterB()) && (!pCtu->isBipredRestriction(zscan)) && (pCtu->getMergeFlag(zscan)) && (pCtu->getPartSize(zscan) == SIZE_4x4)) { UInt mergeIdx = pCtu->getMergeIndex(zscan); const TComMvField& mergeCand = pCtu->getMergeCand(zscan)[mergeIdx]; if (mergeIdx < 5) // 空间候选范围 { if (mergeCand.getRefIdx(REF_PIC_LIST_0) != -1 && mergeCand.getRefIdx(REF_PIC_LIST_1) == -1) { // 单向空间预测(L0) CU_merge << "S0"; } else if (mergeCand.getRefIdx(REF_PIC_LIST_1) != -1 && mergeCand.getRefIdx(REF_PIC_LIST_0) == -1) { // 单向空间预测(L1) CU_merge << "S1"; } // 若需处理双向空间候选,可添加else分支标记为"B" } else if (mergeIdx == 5) // 时间候选 { // 时间预测 CU_merge << "T"; } // 后续组合候选可根据需求补充处理 } } } CU_merge.close();
关键接口说明
getPartSize(zscan):判断当前CU的尺寸,SIZE_4x4是HM定义的枚举值,确保只处理目标尺寸单元getMergeIndex(zscan):获取当前CU选中的Merge候选在列表中的索引getMergeCand(zscan)[mergeIdx]:获取对应索引的Merge候选数据,包含参考列表索引信息getRefIdx(REF_PIC_LIST_0/1):获取候选使用的参考列表索引,返回-1表示未使用该列表
内容的提问来源于stack exchange,提问作者Y90
相关产品推荐
相关产品推荐

