首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在HM (HEVC测试模型)中添加一个新的语法元素

如何在HM (HEVC测试模型)中添加一个新的语法元素
EN

Stack Overflow用户
提问于 2016-12-08 16:39:59
回答 1查看 244关注 0票数 1

我已经在HM参考软件上工作了一段时间,以改进帧内预测部分的内容。现在,在代码中添加了一种新的帧内预测算法,我让编码器在我的算法和默认的HM算法(当然是根据RDCost )之间进行选择。

我现在需要的是为每个PU发出信号,以便解码器能够执行编码器在速率失真循环中决定的相同算法。

我想知道到底该怎么做才能正确地将这一位标志添加到流中,而不会破坏代码中的任何内容。

假设我想使用CABAC上下文模型来跟踪我的国旗统计数据,我还应该做什么:

  1. 将新的上下文模型(如ContextModel3DBuffer m_cCUIntraAlgorithmSCModel )添加到TEncSbac.h文件中。
  2. 通过查看HM如何初始化其他上下文模型,正确地初始化模型(在编码器和解码器端)。
  3. 在编码器侧和解码器侧分别调用函数m_pcBinIf->encodeBin(myFlag, cCUIntraAlgorithmSCModel)m_pcTDecBinIfdecodeBin(myFlag, cCUIntraAlgorithmSCModel)

我采取了这三步,但显然它打破了一些东西。

PS:即使是相当可能的信号(即不使用CABAC上下文)也是有用的。我只想和平地送这面旗帜!

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-31 16:00:06

我终于能解决这个问题了。这是CABAC上下文初始化中的一个错误。

但我想分享这一经历,因为许多人可能想做同样的事情。

我解释的三个步骤本质上是添加新语法元素所必需的,但对于以下内容,您可能会非常小心:

  1. 首先,您需要决定是否要为语法元素使用单独的上下文模型?还是你想用现有的?在CABAC分离的情况下,您应该定义一个ContextModel3DBuffer,最好的方法是:在代码中找到一个类似的语法元素;然后复制它的ContextModel3DBuffer的定义以及它在代码中的所有存在。这样可以保证你在考虑所有的事情。
  2. 每个语法元素的编码发生在两个不同的位置:第一,在RDO循环中进行“决策”;第二,在实际的编码阶段和决策被编码时(例如,encodeCtu函数)。
  3. 在编码器/解码器侧,编码/解码语法元素的顺序应该相同。例如,如果您的新语法元素是在splitFlag之后编码,而在编码器侧在predMode之前编码,则应该在解码器侧的splitFlagpredMode之间对其进行精确解码。
  4. 上下文模型被实现为3D矩阵,以便跟踪不同块大小、组件等的语法元素的统计信息。这意味着当您想调用函数encodeBin时,可以确保使用的索引是正确的。我在这部分犯了愚蠢的错误!

除了上面的说明之外,我发现一个函数getState对于调试非常有用。当您访问CABAC上下文模型时,此函数将返回代码中任意位置的状态。在不匹配的情况下,比较编码器和解码器相同位置的状态是非常有用的。例如,对1进行编码,但对0进行解码,会发生很多情况。在这种情况下,您需要在编码和解码之前检查CABAC上下文的状态。应该是一样的。如果它们不相同,跟踪错误以找到第一个不匹配的位置。

希望能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41044483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档