如何在HM中添加新的语法元素

参考https://stackoverflow.com/questions/41044483/how-to-add-a-new-syntax-element-in-hm-hevc-test-model

1.向TEncSbac.h文件中加入一个新的上下文模型(context model),例如:ContextModel3DBuffer m_cCUIntraAlgorithmSCModel

2.通过参考HM中初始化其他context models的方法正确的初始化当前的model(编码端和解码端都要)

3.在编码端和解码端各自调用函数m_pcBinIf->encodebin(myflag,cCUIntraAlgorithmSCModel)和m_pcTDecBinIfdecodeBin(myfla,cCUIntraAlgorithmSCModel)

需要注意的:

1.开始时,你需要决定是否为语法元素设置单独的context model,或者你可以使用一个已经存在的语法元素(这里称作语法元素的复用)。在CABAC独立的情况下,你应该定义一个ContextModel3DBuffer,最好的方法是:在编码端找到一个最相似的语法元素,然后复制他的“ContextModel3DBuffer”定义以及它在代码中的所有实现。这样可以确保你考虑了所有的事情。

2.每个语法元素的编码发生在两个不同的地方。(1)在RDO循环部分做一个决策(包括块划分,预测信息,这部分的编码只是得到编码比特数,而没有实际写到码流中)(2)实际编码时期,在决策后写入码流。

3.语法元素的编解码顺序应该在编解码端相同。比如,如果你的新语法元素编码在splitFlag之前,在predMode之后,那么在解码端你应该在splitFlag和predMode之间将它正确解码。

4.将上下文模型实现为一个三维矩阵,以便对不同块大小、组件集等的syntaxt元素分别进行跟踪统计信息。这意味着,当您想要调用encodeBin函数时,您可以确保使用了正确的索引。在这个部分我犯了一个愚蠢的错误。

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值