gpt4 book ai didi

hevc - (为什么)HM 会把一个 CU 分割成具有相同 MV 的 PU?

转载 作者:行者123 更新时间:2023-12-01 14:59:33 24 4
gpt4 key购买 nike

在调试 HM 16.2 的解码时,我看到 CU 看起来像是被分割为 PU。每个PU都有相同的MV。在一个 CU 中允许不同的 MV 是我(目前)知道将 CU 拆分为 PU 的唯一原因。

我想知道我是否误解了 CTU 数据结构 (TComDataCU)*。谁能帮我这个?你知道是否还有其他原因将 CU 拆分为 PU?

相关问题:

  1. 为什么 TComDataCU 将 64x64 CTU 拆分为 256 个部分? (我最初预计会看到 64 个部分,每个部分对应最小的 8x8 CU。现在我假设额外的部分允许更小的 PU/TU。)
  2. TComMv::getHor()TCovMv::getVer() 直接解释为 MV 是否正确,还是必须提供一些附加信息(例如合并/跳过信息、增量等..) 被合并以获得“真正的”MV?

* 对于一个名为 ctuTComDataCU*,我明白了

ctu->getTotalNumPart() == 256
ctu->getDepth(48) == 3
ctu->getPredictionMode(48) == INTER_MODE
ctu->getPartitionSize(48) == Nx2N

其中 mvf = ctu->getCUMvField(REF_PIC_LIST_0)(仅使用单向预测,具有简单的 GOP:I <- P <- P <- P ...),

mvf->getMv(48).getHor() == mvf->getMv(50).getHor() &&
mvf->getMv(49).getHor() == mvf->getMv(51).getHor() &&
mvf->getMv(48).getVer() == mvf->getMv(50).getVer() &&
mvf->getMv(49).getVer() == mvf->getMv(51).getVer() &&
mvf->getMv(48).getHor() == mvf->getMv(49).getHor() &&
mvf->getMv(48).getVer() == mvf->getMv(49).getVer()

将这些观察结果与我的问题联系起来,对于这个 CU,我知道 CU 有两个包含索引 48,50 和 49,51 的 PU

+--+--+|48|49|+--+--+|50|51|+--+--+

and so I expect

mvf->getMv(48).getHor() == mvf->getMv(50).getHor() &&
mvf->getMv(49).getHor() == mvf->getMv(51).getHor() &&
mvf->getMv(48).getVer() == mvf->getMv(50).getVer() &&
mvf->getMv(49).getVer() == mvf->getMv(51).getVer() && (
mvf->getMv(48).getHor() != mvf->getMv(49).getHor() ||
mvf->getMv(48).getVer() != mvf->getMv(49).getVer()
)

为什么两个 PU(看起来)有相同的 MV?

最佳答案

首先,正如您所注意到的,HEVC 中的最小块大小是 4x4。 CU 只能采用 64x64 和 8x8 之间的大小,但 PU 或 TU 可以缩小到 4x4。除了你提到的原因,一个CU也可以在帧内编码的情况下分成4个PU,这4个PU可以有不同的帧内预测方向。

由于最小的 block 大小是 4x4,一个 64x64 的 CTU 由 256 个部分组成。

在 HM 引用软件中,CTU TComDataCU 的数据结构将始终包含所有可能的最小块,而不管实际 block 结构如何。这就是为什么 CU 数据有可能(而且通常是这种情况)被冗余存储的原因。

例如,一个名为 ctu 的 64x64 CTU 包含单个 CU(因此 CU 大小为 64x64)将存储 256 个深度 0。如果您检查 (z-scan) 索引 0 处的深度,ctu->getDepth(0),您将得到 0。这足以描述 CU 的大小,但是如果您检查在另一个索引 ctu->getDepth(48) 处的深度,你也会得到 0,这是多余的。

这就是您在案例中观察到的情况。您的 CU 被分成 2 个垂直 PU (Nx2N),因此 (48,50) 是一个 PU,并用一个运动向量来描述。然而,HM中的数据结构将MV存储在48和50两个地方。

为了解决您的第二个相关问题,是的,MV 的水平和垂直部分“真实地”描述了它。但是,您可能还需要引用帧的索引。这可以在 TComMvField 中找到,除了 TComMv 之外,它还有一个 Int 索引。

关于hevc - (为什么)HM 会把一个 CU 分割成具有相同 MV 的 PU?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28014901/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com