2017-04-20 13 views
1

我在[Mac OS X] [GCC 4.2.1] [64]上使用HEVC参考软件HM编码器版本[16.15](包括RExt) bit],并且想要在编码器侧提取:1)每个块的运动矢量 2)帧分区信息,即运动矢量涉及的帧中的每个块的大小和位置。如何在HEVC HM中提取帧分区上的运动矢量和信息16.15

有没有人提示每个编码单元存储这些信息的变量是什么?谢谢!

+0

[对于这个问题]的答案(https://stackoverflow.com/questions/40502892/in-hevc-reference-software-hm-16-9-i-need-help-for-generating-details-of -cus-pu)应该会有所帮助。 – damjeux

回答

0

所有你需要的是在TComDataCU类。

1)对于运动信息,存在返回运动矢量的函数getCUMvField()。尽管如此,这并不容易。

基本上,要访问几乎所有的PU/CU级语法元素,您需要能够使用该PU/CU的绝对索引。这个唯一的索引通过指向该部分的左上方4x4块来告诉您PUU/CU在CTU中的位置。 我记得大部分时间这个指数存储在变量uiAbsPartIdx中。

如果您已经知道如何使用该索引,那么您将能够在CTU级别获得块分区信息。所以对于2)我的建议是,当你在CUT上有一个循环时,你进入切片级别(我认为这是在compressSlice()函数中完成的)。在为每个CTU调用compressCtu()函数(这意味着所有的RDO决策已经完成并且CTU分区已经决定)之后,您对CTU的所有uiAbsPartIdx进行循环,并获得它们的宽度和高度。例如,如果您的CTU大小为128,那么CTU中将有32 * 32 = 1024个独特的4x4块。用于获得对应于某个uiAbsPartIdx的CU的宽度/高度的函数是pCtu->getWidth(uiAbsPartIdx)

我希望它很清楚。

+0

感谢您的回答。我不知道如何在每个CTU的所有'uiAbsPartIdxs'上循环。在'compressSlice'中,我在for循环 (for UInt ctuTsAddr = startCtuTsAddr; ctuTsAddr SimonFD

+0

假设你的CTU宽度是64,这使得256个单元的4×4。那么如果你设置'boundingCtuAddr = 256',你将在CTU内的所有CU上迭代。对于每个CU,可以将此CU索引('ctuTsAddr')传递给'getHeight'和'getWidth'函数以获取当前CU的大小。 –

+0

但非常重要的一点是,当您的CU大于4x4时,这意味着CU由多个4x4单元覆盖,您需要注意不要多次考虑这种CU。例如,如果你的第一个CU是8x8,那么'ctuTsAddr = 0,1,2,3'将指向这个CU,如果你对这些值使用'getWidth'或'getHeight'函数,你将获得4次8x8的大小。我希望它很清楚! –