我已经在HM参考软件上工作了一段时间,以改进帧内预测部分的内容。现在,在代码中添加了一种新的帧内预测算法,我让编码器在我的算法和默认的HM算法(当然是根据RDCost )之间进行选择。
我现在需要的是为每个PU发出信号,以便解码器能够执行编码器在速率失真循环中决定的相同算法。
我想知道到底该怎么做才能正确地将这一位标志添加到流中,而不会破坏代码中的任何内容。
假设我想使用CABAC上下文模型来跟踪我的国旗统计数据,我还应该做什么:
ContextModel3DBuffer m_cCUIntraAlgorithmSCModel )添加到TEncSbac.h文件中。m_pcBinIf->encodeBin(myFlag, cCUIntraAlgorithmSCModel)和m_pcTDecBinIfdecodeBin(myFlag, cCUIntraAlgorithmSCModel)。我采取了这三步,但显然它打破了一些东西。
PS:即使是相当可能的信号(即不使用CABAC上下文)也是有用的。我只想和平地送这面旗帜!
提前谢谢。
发布于 2017-05-31 16:00:06
我终于能解决这个问题了。这是CABAC上下文初始化中的一个错误。
但我想分享这一经历,因为许多人可能想做同样的事情。
我解释的三个步骤本质上是添加新语法元素所必需的,但对于以下内容,您可能会非常小心:
ContextModel3DBuffer,最好的方法是:在代码中找到一个类似的语法元素;然后复制它的ContextModel3DBuffer的定义以及它在代码中的所有存在。这样可以保证你在考虑所有的事情。encodeCtu函数)。splitFlag之后编码,而在编码器侧在predMode之前编码,则应该在解码器侧的splitFlag和predMode之间对其进行精确解码。encodeBin时,可以确保使用的索引是正确的。我在这部分犯了愚蠢的错误!除了上面的说明之外,我发现一个函数getState对于调试非常有用。当您访问CABAC上下文模型时,此函数将返回代码中任意位置的状态。在不匹配的情况下,比较编码器和解码器相同位置的状态是非常有用的。例如,对1进行编码,但对0进行解码,会发生很多情况。在这种情况下,您需要在编码和解码之前检查CABAC上下文的状态。应该是一样的。如果它们不相同,跟踪错误以找到第一个不匹配的位置。
希望能帮上忙。
https://stackoverflow.com/questions/41044483
复制相似问题