我是HM HEVC(和JEM)参考软件的新手,我目前正在尝试理解源代码。我想为每个组件添加一些显示行:Algo的名称(即inter / intra Algos)+比特流的长度+输出bin文件中的位置。
要知道哪个组件需要花费更多代码来编码以及编解码器如何工作。在那之后我也希望为JEM做同样的事情。
我的问题首先是我无法理解那里的很多功能,评论是不够的,所以是否有任何参考理解代码?? !! (我已经读过曼努埃尔,没有帮助)。
第二我不知道在哪里和如何添加这些线条;是TEncGOP
,TEncSlice
还是TEncCU
。 Ps:我不会在TEncGOP.compressGOP
中考虑,也可能在其他2个班级中思考。
答案 0 :(得分:0)
第1点:有一个规则是在解码器端比编码器更容易记录编码决策(例如,预测模式,MV,IPM,块大小)。这是因为你在编码器端有一个超级复杂的RDO过程,很容易让你在循环中丢失。但在解码器方面,一切都只出现一次。但是,如果您坚持在编码器端执行此操作,可以在此处找到一些提示:Get some information from HEVC reference software
点2:与编码决策不同,记录速率(即,不同语法元素的写入位数)在解码器侧比编码器更复杂。对于与以非EP模式(即,具有CABAC上下文)编码的任何事物相关联的小数位,尤其如此。所以你可以在编码器方面做这个部分。但我担心这并不容易。
第3点:我认为理解代码的最佳方法是逐行阅读。这是非常耗时的,但如果您理论上知道标准,您可能会解散重要部分而忽略其余部分。
PS:我认为你的帖子中有太多问题,大多数都太笼统了。这让我有点难以一起回答它们。所以,我等你下一步,提出更准确的问题。答案 1 :(得分:0)
(我把答案评论说@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
速率大多小于一位。如果是这种情况,那么您需要逐个计算小数位。这将是完全不同的,相对更复杂。