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