A bug of H.264 video from KDV1000 can not be played by Polycom MT

本文主要描述了KDV1000终端和Polycom会议终端对通时Polycom设备浏览KDV1000的High Profile码流绿屏问题。

[hide for=”!logged”]

案例描述

行 业视讯产线测试人员在对KDV1000设备和Polycom的会议终端进行对通测试时,发现当KDV1000开启H.264 HP编码等级后,Polycom终端解码图像绿屏。产线人员反馈,当KDV1000开启H.264 BP编码等级时,Polycom终端解码图像正常。

案例分析

由于该问题是Polycom解码器无法解码科达编码器编码码流,因而无法通过解码端跟踪调试问题原因。只能通过对KDV1000码流和Polycom码流存取的码流进行对比分析,寻找二者的差异性。

二者码流的差异性主要有为:

语法特性 KDV1000 Polycom
Level 4.1 4.0
Poc Type 0 2
VUI参数信息
Slice数目

首先尝试把我们编码语法中与Polycom有差异的地方调整为一致进行验证。发现Polycom解码仍然花屏。

考 虑到Polycom可以正常浏览KDV1000的H.264 BP等级编码图像。对我们编码器的BP等级和HP等级进行对比分析,HP等级编码码流相比BP等级编码码流增加了CABAC,Intra8x8预 测,8×8变换等特性。我们尝试在编码端把增加的特性依次关闭,观察Polycom是否能正常解码。经过测试,当关闭CABAC编码特性 时,Polycom可正常浏览编码码流。从以上测试可以初步怀疑,我们编码的带CABAC码流,Polycom无法解析。现在疑问是,我们的CABAC码 流使用第三方Elecard,CoreAVC,JM参考解码器等都可以正常解码。于是怀疑Polycom的解码器是否存在某种限制。

于是我们构造一段标准JM编码器的码流给Polycom解码,如果可以无法解码,则可以说明以上的怀疑是存在的。通过测试发现,Polycom可以正常解码JM编码码流。说明我们的CABAC某些语法Polycom无法解析。

由 于JM编码码流Polycom可以正常解码,我们通过对同一视频序列分别使用JM和我们自己的编码器进行编码,并且尽可能简化特性,使二者编出的码流相 近,并分析语法差异性。根据经验,CABAC核心编码流程应该没有问题,否则其他解码器肯定也无法解码。于是把重点放在CABAC编码起始和CABAC编 码结束。通过走读编码器代码,编码Slice头使用的VLC编码,编码Slice数据使用CABAC编码,在编码Slice头结束后会对已编码流数据进行 字节对齐操作并初始化CABAC模型。对比我们的编码器和JM编码器的源码发现,在该处字节对齐处理逻辑中,如码流需要填充3bit才能字节对齐,我们的 代码处理结果是写入了两个bit的0和1个bit的1,而JM的处理结果是写入了3个bit的1。通过走读H.264标准协议,协议中语法应该是当编码 Slice数据开始时,如果是CABAC模式,已编码流非字节对齐时,应该用cabac_alignment_one_bit填 充,cabac_alignment_one_bit为等于1的bit。也就是此处代码对齐中应该全部填充1,而我们的代码中填充了错误的值。

至此,问题的原因基本找到,将此处代码修改后在系统中验证,发现图像上边一部分正常,下边花屏。怀疑是我们的多Slice码流Polycom解析存在问题。于是修改为单Slice版本在系统中验证。此时,Polycom可以正常浏览KDV1000码流。

解决过程

1 修改H.264编码代码中,CABAC模式时对编码Slice数据起始处码流对齐处理代码;

2 调整编码Slice为单Slice模式;

总结

加强代码走读,避免细小的疏漏导致出现Bug。

[/hide]

Author: Jacky Wei

I am a programmer, welcome to my blog: http://rg4.net.

Leave a Reply

Your email address will not be published. Required fields are marked *