我是HEVC的新手,我现在正在理解参考软件(现在正在查看帧内预测)。
我需要在编码后获得如下信息。
我知道在m_pcCuEncoder->compressCtu( pCtu )
中调用TEncSlice.cpp
时会做出CTU决定。但究竟我可以获得这些具体信息?有人可以帮我弄这个吗?
P.S。我也在学习C ++(我有Java背景)。
答案 0 :(得分:4)
如果您不熟悉代码,获取CTU信息(分区等)有点棘手。但我试着帮助你。 我要告诉你的一切都是基于JEM代码,而不是HM,但我很确定你也可以将它们应用到HM。
您可能已经注意到,每个CTU的压缩/编码有两个完全独立的阶段:
在CTU级别,这两个阶段分别由m_pcCuEncoder->compressCtu( pCtu )
和m_pcCuEncoder->encodeCtu( pCtu )
函数在compressSlice()
文件的TEncSlice.cpp
函数中执行。 / p>
鉴于以上信息,您必须在第二阶段而不是第一阶段中寻找您正在寻找的内容(您可能已经了解这些内容,但是我怀疑你可能正在考虑第一阶段。
所以,现在这是我获取您的信息的建议。这不是最好的方法,但这里更容易解释。 您首先要在HM代码中找到这一点:
compressGOP() -> encodeSlice() -> encodeCtu() -> xEncodeCU()
然后找到预测模式(帧内/帧间)编码的行:
m_pcEntropyCoder->encodePredMode()
此时,您可以访问pcCU
对象,其中包含在第一阶段进行的所有最终决策,包括您查找的信息。在代码的这一点上,您正在处理单个CU而不是整个CTU。但如果您想要整个CTU的信息,可以回到
compressGOP() -> encodeSlice() -> encodeCtu()
并找到第一次调用xEncodeCU()
函数的行。在那里,您将可以访问pCtu
对象。
提醒:每个TComDataCU
对象(pcCU
如果您在CU级别,或pCtu
,如果您在CTU级别)大小{ {1}}被拆分为WxH
个大小为NumPartition=(W/4)x(H/4)
的分区。每个分区都可以通过索引(4x4
)访问,该索引指示其Z扫描顺序。例如,uiAbsPartIdx
分区的uiAbsPartIdx
为4.
现在,您执行以下步骤:
通过调用<x=8,y=0>
获取NumPartition
中的分区数(pCtu
)。
循环遍历所有pCtu->getTotalNumPart()
个分区并调用NumPartition
,pCtu->getWidth(idx)
,pCtu->getHeight(idx)
和pCtu->getCUPelX(idx)
函数,其中pCtu->getCUPelY()
为你的循环迭代器。这些函数返回与idx
分区CU
重合的4x4
的以下信息:width,height,positionX,positionY。 [两个位置都相对于框架的像素idx
]
以上信息足以导出当前<0,0>
的CTU分区!所以最后一步是写一段代码来做到这一点。
这是如何在第二阶段(即编码阶段)期间提取CTU分区信息的示例。但是,您可以调用一些适当的函数来获取第二个问题中的其他信息。例如,要获得选定的亮度帧内模式,您可以调用pCtu
,而不是pCtu->getIntraDir(CHANNEL_TYPE_LUMA, idx)
函数。或getWidth()/getHeight()
获取QP值。
您始终可以在pCtu->getQP(CHANNEL_TYPE_LUMA, idx)
班级(pCtu
)找到TComDataCU
级别提供有用信息的功能列表。
我希望这会对你有所帮助。如果没有,请告诉我!
祝你好运,