更改 HM 参考软件以显示有关比特流的一些信息
changing HM reference software to display some information about the bitstream
我对 HM HEVC(和 JEM)参考软件还很陌生,目前正在尝试了解源代码。我想为每个组件添加一些行来显示:Algo 的名称(即 inter/intra Algos)+ 比特流的长度+ 输出 bin 文件中的位置。
了解哪个组件的编码成本更高以及编解码器的工作原理。在那之后我也想为 JEM 做同样的事情。
我的问题首先是我无法理解那里的很多功能,注释不够,所以有没有参考代码来理解代码??!! (我已经读过曼努埃尔,没有帮助)。
第二,我不知道在哪里以及如何添加这些行;是 TEncGOP
、TEncSlice
还是 TEncCU
。 Ps:我不认为 TEncGOP.compressGOP
所以也许在另外两个 类.
要点 1:有一个经验法则,记录编码决策(例如预测模式、MV、IPM、块大小)在解码器端比编码器端容易得多。这是因为您在编码器端有超级复杂的 RDO 过程,很容易让您迷失在循环中。但在解码器端,一切都只出现一次。但是,如果您坚持在编码器端这样做,您可能会在这里找到一些提示:
要点 2:与编码决策不同,解码器端的记录率(即不同语法元素的写入位数)比编码器端更复杂。对于与以非 EP 模式(即使用 CABAC 上下文)编码的任何内容相关联的小数位尤其如此。所以你可以在编码器端做这部分。但恐怕并不容易。
要点3:我认为理解代码的最好方法是逐行阅读。这非常耗时,但如果您从理论上了解标准,您可能能够区分重要部分而忽略其余部分。
PS:我觉得你的post中的问题太多了,大多太笼统了。这让我很难一一回答。所以你我会等你迈出下一步并提出更精确的问题。
(我把@Mourad 四小时前发表评论的答案放在这里,因为它会很长)
我假设您可以找到实现 RDO 循环后实际编码的位置。正如您正确提到的那样,xEncodeCU
是您需要参考的函数,以确保您不在 RDO 中。
现在您需要在 xEncodeCU
中找到负责您的目标编解码器工具的确切函数。
例如,如果你想计算系数编码的位数,你应该查看 m_pcEntropyCoder->encodeCoeff()
(这是一个 JEM 函数,在 HM 中可能有不同的名称)。一旦你在 xEncodeCU
中找到这一行,你就可以这样做并获得 encodeCoeff()
函数中写入的位数:
UInt b_before = m_pcEntropyCoder->getNumberOfWrittenBits();
m_pcEntropyCoder->encodeCoeff( ... );
UInt b_after = m_pcEntropyCoder->getNumberOfWrittenBits();
UInt writtenBitsCoeff = b_after - b_before;
重要的一点:如您所见,函数 getNumberOfWrittenBits()
为您提供整数比率,它是通过将对应于函数 encodeCoeff
内编码的所有语法元素的分数比率四舍五入求和而获得的。根据您的问题,此错误可能会或可能不会被接受。例如,如果你想知道 CBF
的速率而不是系数编码率,那么这个错误是根本不能接受的。因为,CBF
rate 大多不到一位。如果是这种情况,那么您需要一个一个地计算小数位。这将是完全不同的,并且比这更复杂。
我对 HM HEVC(和 JEM)参考软件还很陌生,目前正在尝试了解源代码。我想为每个组件添加一些行来显示:Algo 的名称(即 inter/intra Algos)+ 比特流的长度+ 输出 bin 文件中的位置。
了解哪个组件的编码成本更高以及编解码器的工作原理。在那之后我也想为 JEM 做同样的事情。
我的问题首先是我无法理解那里的很多功能,注释不够,所以有没有参考代码来理解代码??!! (我已经读过曼努埃尔,没有帮助)。
第二,我不知道在哪里以及如何添加这些行;是 TEncGOP
、TEncSlice
还是 TEncCU
。 Ps:我不认为 TEncGOP.compressGOP
所以也许在另外两个 类.
要点 1:有一个经验法则,记录编码决策(例如预测模式、MV、IPM、块大小)在解码器端比编码器端容易得多。这是因为您在编码器端有超级复杂的 RDO 过程,很容易让您迷失在循环中。但在解码器端,一切都只出现一次。但是,如果您坚持在编码器端这样做,您可能会在这里找到一些提示:
要点 2:与编码决策不同,解码器端的记录率(即不同语法元素的写入位数)比编码器端更复杂。对于与以非 EP 模式(即使用 CABAC 上下文)编码的任何内容相关联的小数位尤其如此。所以你可以在编码器端做这部分。但恐怕并不容易。
要点3:我认为理解代码的最好方法是逐行阅读。这非常耗时,但如果您从理论上了解标准,您可能能够区分重要部分而忽略其余部分。
PS:我觉得你的post中的问题太多了,大多太笼统了。这让我很难一一回答。所以你我会等你迈出下一步并提出更精确的问题。
(我把@Mourad 四小时前发表评论的答案放在这里,因为它会很长)
我假设您可以找到实现 RDO 循环后实际编码的位置。正如您正确提到的那样,xEncodeCU
是您需要参考的函数,以确保您不在 RDO 中。
现在您需要在 xEncodeCU
中找到负责您的目标编解码器工具的确切函数。
例如,如果你想计算系数编码的位数,你应该查看 m_pcEntropyCoder->encodeCoeff()
(这是一个 JEM 函数,在 HM 中可能有不同的名称)。一旦你在 xEncodeCU
中找到这一行,你就可以这样做并获得 encodeCoeff()
函数中写入的位数:
UInt b_before = m_pcEntropyCoder->getNumberOfWrittenBits();
m_pcEntropyCoder->encodeCoeff( ... );
UInt b_after = m_pcEntropyCoder->getNumberOfWrittenBits();
UInt writtenBitsCoeff = b_after - b_before;
重要的一点:如您所见,函数 getNumberOfWrittenBits()
为您提供整数比率,它是通过将对应于函数 encodeCoeff
内编码的所有语法元素的分数比率四舍五入求和而获得的。根据您的问题,此错误可能会或可能不会被接受。例如,如果你想知道 CBF
的速率而不是系数编码率,那么这个错误是根本不能接受的。因为,CBF
rate 大多不到一位。如果是这种情况,那么您需要一个一个地计算小数位。这将是完全不同的,并且比这更复杂。