HM编码器中未变换量化残差提取及m_ppcPredYuvBest相关技术问询
HM编码器残差提取与预测帧匹配问题解答
1. 未变换量化的原始预测残差提取位置
直接在变换阶段前的CU编码逻辑中提取。HM编码器的TEncCu::xEncodeCU函数里,完成帧内/帧间预测后、调用xTransform执行变换操作前,会计算原始残差(原始像素块 - 预测像素块)。你可以在这个代码节点直接获取残差数据,此时的残差还未经过变换和量化处理。
2. 残差存储方式选择
优先选择直接用原始图像减去m_ppcPredYuvBest,不推荐使用全局变量:
- 全局变量会引入线程安全风险(HM支持多线程并行编码),同时增加代码耦合度,不利于后续维护;
m_ppcPredYuvBest是当前CU确定的最优预测帧数据,在预测阶段结束后其值固定,直接计算差值能保证残差的准确性,避免全局变量存储时可能出现的覆盖、数据不一致问题;- 若需要临时保存残差,可在CU编码的局部作用域内创建临时变量存储,使用后及时释放,更安全高效。
3. 非64x64 CTU边缘预测帧不匹配问题解决
这种情况由边缘CTU的边界处理逻辑导致,可按以下步骤处理:
- 确认读取
m_ppcPredYuvBest的时机:必须在该CTU熵编码完成前读取,熵编码阶段可能会对预测数据做隐含的边界对齐调整,后续读取会导致数据偏差; - 匹配像素范围:非64x64 CTU的边缘CU预测可能涉及相邻CTU的参考像素扩展,要确保计算残差时,原始图像块的像素范围与
m_ppcPredYuvBest的像素范围完全对应,包括边界扩展的部分; - 排除环路滤波影响:
m_ppcPredYuvBest应为未经过环路滤波的原始预测数据,若你读取的是环路滤波后的预测帧,必然会出现不匹配。需确认读取的是环路滤波执行前的m_ppcPredYuvBest数据。
内容的提问来源于stack exchange,提问作者John Z
相关产品推荐
相关产品推荐

