H264分析源码学习之结构体篇——nal_t结构体

来源:互联网 发布:光大证券mac版下载 编辑:程序博客网 时间:2024/04/30 00:30

最近学习H264的编解码,因此先学习了解H264的结构。我是通过h264分析开源库的源码进行学习的。首先先从数据结构体入手,通过了解重要的数据结构体来认识H264!


我们首先认识几个概念:

VCL:video code layer(视频编码层)   NAL:network abstract layer(网络提取层)

NALU:coded h264 data is stored or transmitted as  a series of packets knowns as Network Abstract Layer Unit 网络提取层单元

RBSP:a NALU contains a Raw Byte Sequence Payload(原始字节序列负载,按字节对齐了的)

SODB:String Of Data Bits(原始数据比特流,长度不一定是8的倍数)


SODB + trailing bits(尾部补齐字节数)   = RBSP

NAL header(1 byte)  + RBSP  = NALU

... + StartCode(3 byte) + NALU + StartCode(3 byte) + NALU + ... = h264 stream




再介绍一下NAL header

NAL Header:占用了一个字节,按照比特自高至低排列可以表示如下:

forbidden_bit(1位)nal_reference_bit(2位)nal_unit_type(5位)
forbidden_bit:为禁止位

nal_reference_bit:优先级,00b 表示可丢弃(比如SEI,B slice),非零表示不可丢弃,如SPS、PPS、I Slice、P Slice等

nal_unit_type:此NAL的类型,也就是RBSP的数据到底是什么。


nal_unit_type不同的值,代表不同NAL类型,如下:

  • 0:未规定
  • 1:非IDR图像中不采用数据划分的片段
  • 2:非IDR图像中A类数据划分片段
  • 3:非IDR图像中B类数据划分片段
  • 4:非IDR图像中C类数据划分片段
  • 5:IDR图像的片段
  • 6:补充增强信息(SEI)
  • 7:序列参数集(SPS)
  • 8:图像参数集(PPS)
  • 9:分割符
  • 10:序列结束符
  • 11:流结束符
  • 12:填充数据
  • 13:序列参数集扩展
  • 14:带前缀的NAL单元
  • 15:子序列参数集
  • 16 – 18:保留
  • 19:不采用数据划分的辅助编码图像片段
  • 20:编码片段扩展
  • 21 – 23:保留
  • 24 – 31:未规定

因此可以发现,SODB的数据不一定都是视频图像数据,也有可能是其他信息(为解码提供相关信息),nal_unit_type取值1-5的NAL,称为VCL的NAL单元;其他类型的NAL,

成为非VCL的NAL单元



这里的nal_t结构体的成员包括nal的头部信息和一个指向rbsp的指针。





 






0 0
原创粉丝点击