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