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的指针。
- H264分析源码学习之结构体篇——nal_t结构体
- H264分析源码学习之结构体篇——h264_stream_t结构体
- H264分析源码学习之结构体篇——h264_stream_t结构体
- MYSQL源码分析之结构体浅析
- ExtJs源码分析与学习—ExtJs源码结构
- linux内核学习之网络篇——IP和TCP结构体源码
- libuv 源码分析 结构体
- Libevent源码分析之event结构体初识
- Linux 源码分析之task_struck进程管理结构体
- H264码流结构分析
- H264码流结构分析
- H264码流结构分析
- H264码流结构分析
- H264码流结构分析
- H264码流结构分析
- H264码流结构分析
- H264码流结构分析
- H264码流结构分析
- 剖析同步器(转载)
- Java-JDK各个版本的新特性
- C++:内嵌类、静态成员变量和函数、单例模式、友元函数和友元类
- Android学习十二---在android上实现图像匹配
- C++笔记之类外定义
- H264分析源码学习之结构体篇——nal_t结构体
- Linux网卡数据流路径
- 小练习 - 排序:冒泡、选择、快排
- mysql 协议的ColumnDefinition包及解析
- 对象移动
- |BZOJ 1477|扩展欧几里得算法|青蛙的约会
- 算法提高 文化之旅
- Spring 的Servlet拦截器匹配规则
- web开发之图片选择