You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改HM帧间预测模块的estIntraPredLumaQT等代码,用原始块做参考实现类无损预测

HM编码测试模型:帧间/帧内预测修改方案

一、帧间预测修改:用原始块替代重建块作为参考

要实现不同QP下帧间预测使用原始块作为参考,核心是替换帧间预测中参考块的来源(从重建DPB改为原始输入帧):

  1. 定位参考块获取逻辑
    帧间预测的参考块读取逻辑主要集中在InterSearch.cpp的xFillReferenceBlock或xGetInterPrediction函数中。默认代码会从重建参考帧(存储在DPB的PicYuv对象)中读取像素。

  2. 替换为原始帧数据
    HM编码器中,原始输入帧存储在PicYuv类的m_picOrg成员中(对应未编码的原始YUV数据)。找到代码中获取重建参考块地址的部分,替换为原始帧的地址:

    // 原代码(从重建帧读取)
    const Pel* refLuma = refPic->getLumaAddr() + refPos.y * refPic->getStride() + refPos.x;
    
    // 修改后(从原始帧读取)
    // 需确保refPicOrg为对应参考帧的原始PicYuv对象
    const Pel* refLuma = refPicOrg->getLumaAddr() + refPos.y * refPicOrg->getStride() + refPos.x;
    
  3. 维护原始参考帧缓冲区
    默认DPB仅存储重建帧,需在Encoder.cpp中添加原始帧的存储逻辑,确保每个参考帧的原始数据被保留,供帧间预测调用。

  4. QP无关化处理
    无需针对QP做分支判断,直接全局替换参考块来源即可——无论QP设置多少,帧间预测都会使用无失真的原始块,避免重建误差累积,接近无损帧间预测效果。

二、帧内预测修改:替换重建参考块为原始块(无损第一步)

帧内预测默认使用当前帧已编码的重建相邻块作为参考,替换为原始块的步骤如下:

  1. 定位帧内预测核心函数
    亮度帧内预测的核心逻辑在IntraPrediction.cpp的estIntraPredLumaQT函数中,该函数负责生成帧内预测模式的预测值。

  2. 替换相邻参考像素来源
    找到函数中读取左、上、右上、左上相邻像素的代码,将从重建缓冲区(pRec)读取改为从原始帧缓冲区(pOrg)读取:

    // 原代码(读取重建相邻像素)
    const Pel* pRecAbove = pRec + (pos.y - 1) * stride;
    const Pel* pRecLeft = pRec - 1;
    
    // 修改后(读取原始相邻像素)
    const Pel* pOrgAbove = pOrg + (pos.y - 1) * strideOrg;
    const Pel* pOrgLeft = pOrg - 1;
    

    注意:需使用原始帧的行跨度(strideOrg),避免因帧存储格式差异导致的像素偏移。

  3. 后续无损优化提示
    仅替换参考块只是第一步,若要实现完全无损帧内预测,还需:

    • 将QP设置为0(关闭量化)
    • 修改变换模块为无损模式(如跳过DCT变换,使用恒等变换)
    • 关闭熵编码的有损压缩选项

内容的提问来源于stack exchange,提问作者John Z

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 23:50:36