DMVR的相关整理

DMVR(decode MV refinement)解码端MV细化。

顾名思义,就是将MV在解码端做一个细化操作,那么相应的,就可以不在编码端做过多的搜索细化等操作。好处是可以减小传输的码率,缩短编码时间。为了保证质量,将细化的任务放在解码端,虽然增加了一部分解码时间,但在一定条件下,可以将增加的解码时间减小到最少。


以上便是DMVR的思想:分为两步,第一步:构造template;第二步:搜索最匹配的块。

代码中的实现逻辑:

主要由几个函数构成:

 Void xBIPMVRefine(TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefPicList, Int iWidth, Int iHeight, TComYuv* pOrgYuv, TComYuv* pDstYuv, UInt uiMaxSearchRounds, UInt nSearchStepShift, UInt& uiMinCost);
  UInt xDirectMCCost(Int iBitDepth, Pel* pRef, UInt uiRefStride, Pel* pOrg, UInt uiOrgStride, Int iWidth, Int iHeight);
  Void xPredInterLines(TComDataCU *cu, TComPicYuv *refPic, UInt partAddr, TComMv *mv, Int width, Int height, Pel* dstPix, Int dstStride, Bool bi, const Int bitDepth);
  Void xFillPredBorder(TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefPicList, Int iWidth, Int iHeight, TComYuv* pDstYuv);
#if HIS_
### 关于视频编码中虚拟参考帧的概念、用途及实现方法 #### 概念定义 在视频压缩标准中,虚拟参考帧(Virtual Reference Frame, VRF)是一种特殊的参考机制。这种技术允许编解码器创建并存储一些并非来自实际输入序列的图像作为参考帧。这些帧可以由算法合成或者基于已有的真实帧通过特定处理生成。 #### 主要作用 引入VRF的主要目的是为了提高预测效率和增强压缩性能。具体来说: - **提升预测精度**:利用合成出来的理想化场景来辅助未来或过去画面的重建工作,从而减少残差数据量; - **改善视觉质量**:当遇到快速运动或其他复杂变换情况时,传统仅依赖前向/后向参照可能无法提供足够的准确性;而借助精心设计过的假想样本,则有助于平滑过渡效果以及降低伪影现象的发生概率[^1]。 #### 实现途径 对于如何构建有效的VRF体系结构,在不同代际的标准里有着各自特色化的解决方案: - 在较新的HEVC(H.265)/VVC(H.266)等高级别规格下,支持多种灵活多变的方法论,比如MMAP(Multi-Hypothesis Motion Compensation Prediction with Adaptive Weights),该特性能够融合多个候选方向上的位移矢量信息,并据此推导出更贴近实际情况的理想型态用于后续运算过程之中。 此外还有如DMVR(Directly Derived Motion Vector Refinement), ITMC(Intra-frame Temporal Motion Compensated prediction)等功能模块也都是围绕着优化这一概念展开深入研究的实际成果体现[^2]。 ```cpp // C++ Pseudo Code Example for DMVR Implementation void refineMotionVectors(Frame& currentFrame, const std::vector<Frame>& referenceFrames){ // Simplified pseudo code to demonstrate the concept of refining motion vectors using multiple references. foreach (Block block : currentFrame.blocks()){ float bestCost = INFINITY; Vec2f optimalMV(0, 0); foreach (const Frame& refFrame : referenceFrames){ foreach (Vec2i mvOffset : searchRangeAroundInitialEstimate(block.motionVector)){ float cost = calculatePredictionError(refFrame[block.position + mvOffset], block); if(cost < bestCost){ bestCost = cost; optimalMV = mvOffset; } } } block.refinedMotionVector = initialMV + optimalMV; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值