从HEVC参考软件

时间:2017-12-10 23:12:22

标签: video-encoding hevc

我是HEVC的新手,我现在正在理解参考软件(现在正在查看帧内预测)。

我需要在编码后获得如下信息。

  • 给定CTU的CU结构
  • 对于计算期间的每个CU,它是信息(例如,QP值,Luma的选定模式,色度的选定模式,CU是否处于CTU分裂决策的最终CU结构中等)。

我知道在m_pcCuEncoder->compressCtu( pCtu )中调用TEncSlice.cpp时会做出CTU决定。但究竟我可以获得这些具体信息?有人可以帮我弄这个吗?

P.S。我也在学习C ++(我有Java背景)。

1 个答案:

答案 0 :(得分:4)

如果您不熟悉代码,获取CTU信息(分区等)有点棘手。但我试着帮助你。 我要告诉你的一切都是基于JEM代码,而不是HM,但我很确定你也可以将它们应用到HM。

您可能已经注意到,每个CTU的压缩/编码有两个完全独立的阶段:

  1. RDO阶段:首先是速率 - 失真优化循环,以便做出决定"。在该阶段中,实际上测试了所有可能的参数组合(例如,差分分区,帧内模式,滤波器等)。在此阶段结束时,RDO确定最佳组合并将其传递到第二阶段。
  2. 编码阶段:此处编码器执行实际的最终编码步骤。这包括根据在RDO阶段确定的参数将所有二进制位写入比特流。
  3. 在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.

    现在,您执行以下步骤:

    1. 通过调用<x=8,y=0>获取NumPartition中的分区数(pCtu)。

    2. 循环遍历所有pCtu->getTotalNumPart()个分区并调用NumPartitionpCtu->getWidth(idx)pCtu->getHeight(idx)pCtu->getCUPelX(idx)函数,其中pCtu->getCUPelY()为你的循环迭代器。这些函数返回与idx分区CU重合的4x4的以下信息:width,height,positionX,positionY。 [两个位置都相对于框架的像素idx]

    3. 以上信息足以导出当前<0,0>的CTU分区!所以最后一步是写一段代码来做到这一点。

    4. 这是如何在第二阶段(即编码阶段)期间提取CTU分区信息的示例。但是,您可以调用一些适当的函数来获取第二个问题中的其他信息。例如,要获得选定的亮度帧内模式,您可以调用pCtu,而不是pCtu->getIntraDir(CHANNEL_TYPE_LUMA, idx)函数。或getWidth()/getHeight()获取QP值。

      您始终可以在pCtu->getQP(CHANNEL_TYPE_LUMA, idx)班级(pCtu)找到TComDataCU级别提供有用信息的功能列表。

      我希望这会对你有所帮助。如果没有,请告诉我!

      祝你好运,