H264编解码中的防止竞争机制

来源:互联网 发布:creo4数据交换 编辑:程序博客网 时间:2024/06/03 20:30

问题h264流就是一个接一个的NAL组成,那么解码器如何在数据流中分辨每个NAL的起始和终止?

H264的解决方案: 在每个NAL前面添加起始码(3个字节): 0x00 00 01;此外,在某些类型的介质上,为了寻址方便,要求数据流在长度上对其,或必须是某个常数的倍数,考虑到这种情况,H264建议在起始码前添加若干字节的0来填充,直到该NAL的长度符合要求。在这样的机制下,解码器在码流中检测起始码,作为一个NAL的起始标识,当检测到下一个起始码时当前NAL结束。H264规定当检测到0x00 00 00时也可以表征当前NAL的结束,这时因为连着3个字节的0中,任何一个字节的0要么属于起始码,要么是起始码前面添加的0。

引入的问题:如果在NAL内部出现0x00 00 00 或者0x 00 00 01怎么办?而且这种可能性是很大的!

解决引入问题的方案:“防止竞争”机制


具体操作如下:
    当编码器编码完一个NAL后,检查该NAL单元内部是否出现以下左侧的四个字节序列,如果存在,编码器将在最后一个字节前插入一个新的字节:0x03
    从而使其变成右侧的样子,这样在NAL内部就不会出现0x00 00 00或者0x00 00 01了;然后解码器在NAL内部检测到0x00 00 03的序列时,将0x03丢弃,
    恢复原始数据。
        
                0x00 00 00  -----> 0x00 00 03 00
                0x00 00 01  -----> 0x00 00 03 01
                0x00 00 02  -----> 0x00 00 03 02
                0x00 00 03  -----> 0x00 00 03 03
                
    0x00 00 02是做保留用,0x00 00 03是为了避免原始数据中0x00 00 03序列。   
0 0
原创粉丝点击