【AV1 spec学习一】OBU类型及码流结构
【AV1 spec学习一】OBU类型及码流结构
- 基本概念
- 基本语法表示形式
- OBU类型
- 码流结构
基本概念
刚开始看AV1 spec,对一些初见的名词在此做些记录,随见随添。
缩写 | 全称 | 含义 |
---|---|---|
OBU | Open Bitstream Unit | AV1的语法结构都打包在OBU中。 每个OBU都有一个header,header提供该OBU所包含数据(payload)的标识信息。存在一种只有header的OBU(header-only OBU)。 |
基本语法表示形式
形式 | 含义 |
---|---|
leb128() | 用于编码表示一个变量的值 (如长度),解码时每次读一个字节,每个字节的MSB是信号位,低7-bit以二进制的形式表示值:字节的MSB为1表示解码该值需要继续读取下一个字节;字节的MSB为0表示该值的所有表示已达尾端。 |
OBU类型
AV1的语法结构都以OBU的形式打包,每个OBU都有自己的obu_header,obu_header中会标明obu_type,根据obu_type可将OBU区分为以下几类:
sequence_header_obu,标识profile、still_picture、frame_width_bits_minus_1、frame_height_bits_minus_1等序列信息和一些滤波和编码工具开关信息。同时序列的BitDepth和颜色格式信息也在sequence_header_obu中以color_config的形式标识。(详见AV1 spec 5.5.1。)
temporal_delimiter_obu,一个payload为空的obu。解码端发现这个OBU时不需要解析码流,但是要将SeenFrameHeader设置为0。(详见AV1 spec 5.6。)
frame_header_obu,标识display_frame_id、frame_type等信息,同时也传输屏幕内容编码工具、MV精度控制、参考帧、tile划分、量化参数、滤波参数、frame_size等信息。可以说frame_header中存有解码所需要的大部分功能控制类信息。需要注意的是frame_header_obu可对应OBU_FRAME_HEADER和OBU_REDUNDANT_FRAME_HEADER两种obu_type。
– 当obu_type为OBU_FRAME_HEADER时OBU payload中有完整的frame_header信息(SeenFrameHeader为0);
– 当obu_type为OBU_REDUNDANT_FRAME_HEADER时,复制此前得到的frame_header信息(SeenFrameHeader为1)。(详见AV1 spec 5.9。)
Spec中关于frame_header_obu的几个重要备注摘录如下。Note1: Bitstreams may contain several copies of the frame_header_obu interspersed with tile_group_obu to allow for greater error resilience. However, the copies must contain identical contents to the original frame_header_obu.
If obu_type is equal to OBU_FRAME_HEADER, it is a requirement of bitstream conformance that SeenFrameHeader is equal to 0.
If obu_type is equal to OBU_REDUNDANT_FRAME_HEADER, it is a requirement of bitstream conformance that SeenFrameHeader is equal to 1.Note2: These requirements ensure that the first frame header for a frame has obu_type equal to OBU_FRAME_HEADER, while later copies of this frame header (if present) have obu_type equal to OBU_REDUNDANT_FRAME_HEADER.
有个不解之处,按照Note1中所述,码流中为了提高容错性允许传输与原始frame_header_obu相同的多份header信息;按照Note2中所述,后传的frame_header_obu都是OBU_REDUNDANT_FRAME_HEADER类型的(此时SeenFrameHeader为1)。但是当SeenFrameHeader为1时解码器只是将之前已收到的“original frame_header_obu”信息复制一份插入使用,那么如果“original frame_header_obu”就已经出错或丢失的话,这个机制是如何提高容错性的呢?有一个可能是后续传输的是OBU_FRAME_HEADER类型的frame_header_obu,但在那之前要传一个temporal_delimiter_obu将*SeenFrameHeader *设置为0。当然这只是本人的一个猜测,先留个坑在这里,后续分析代码如果能有明确答案再填上。
frame_obu,内含frame_header_obu和tile_group_obu。详见AV1 spec 5.10。)
tile_group_obu,包含一个或多个tile(及tile内SB)的码流信息。(详见AV1 spec 5.11.1。)
metadata_obu,包含已定义好的多种metadata,以metadata_type标识。解码器发现无法识别的metadata_type时,可将整个OBU丢弃。(详见AV1 spec 5.8.1。)
tile_list_obu,标识output_frame_width_in_tiles_minus_1、output_frame_height_in_tiles_minus_1、tile_count_minus_1、tile_list_entry()信息。在tile_list_entry中包含anchor_frame_idx、anchor_tile_row、anchor_tile_col、tile_data_size_minus_1、coded_tile_data。从spec上看,这tile list是取自不多于127个frame的随机tile集合(集合中tile的个数不多于511个),coded_tile_data中存储的也是来自这个集合的下层码流数据。这是一个很有趣的语法,但是不知道应用场景是什么。在spec中也不要求解码器一定要能解码该类型的码流,引用AV1 spec 7.3.1部分内容如下:
The large scale tile decoding process is used to decode a random subset of tiles taken from a number of coded frames.
The list of tiles is specified by a tile list OBU. One possible use case for this process is described in Annex D.Note: A decoder is recommended to support decoding of tile list OBUs, but this is not a requirement for decoder conformance.
padding_obu,一个填充数据OBU,可以被AV1标准解码器忽略。 该OBU类型的payload有效内容的最后一个字节被视为payload中最后一个非零字节(其他的OBU也有类似规则,如metadata_obu等)。(详见AV1 spec 5.7。)
reserved_obu。若一个OBU的obu_type与上述所有OBU都不相同的话,则该OBU为reserved_obu。reserved_obu是payload为空的OBU,但是与temporal_delimiter_obu的不同之处在于,reserved_obu是既不解析码流也不对任何变量做任何操作。(详见AV1 spec 5.4。)
码流结构
从上文分析,一段AV1码流可以由sequence_header_obu,frame_obu组成,也可由sequence_header_obu,frame_obu,frame_header_obu, tile_group_obu,temporal_delimiter_obu穿插组成。下图是一个简单的码流结构示意图。
【AV1 spec学习一】OBU类型及码流结构相关推荐
- AVS3码流结构解析
AVS3编码学习过程中,很重要的一部分是捋清码流结构.通过学习AVS3-P2(FCD 2.0)-20200403_N2805.pdf,博主整理了AVS3的码流结构思维导图,并将编码树.编码单元.变换单 ...
- H.264码流结构解析
大概前五六年之前写过的一个大体分析H.264格式,不是很详细,可以大致看看有哪些格式. H.264码流结构解析 那个时候上传的百度文库,以前记得有多积分,现在都不能下载了,还要充钱才可以.真是~~~ ...
- H.264码流结构及JM8.6中码流的产生步骤
整理自:http://www.cnblogs.com/xkfz007/archive/2012/08/12/2612931.html H.264中的码流结构 H.264码流结构示意图: NALU第一字 ...
- 【mpeg】mpeg1、mpeg2与mpeg4码流结构区别分析
Date: 2018.10.25 1.参考 http://www.cnblogs.com/CoderTian/p/9246225.html 2.前言 最近在学习和研究MPEG-2标准的过程中, ...
- H.264中NALU、RBSP、SODB的关系 (弄清码流结构)
NALU:Coded H.264 data is stored or transmitted as a series of packets known as NetworkAbstraction La ...
- 音视频学习(十一)——H265视频码流
网络分层结构 和H264/AVC结构类似,H265/HEVC也采用了视频编码层(video code layer ,简称VCL)和网络适配层(network abstract layer,简称NAL) ...
- 【FFmpeg学习】H264 视频码流分析
1. H264编码分层 NAL层:(Network Abstraction Layer,视频数据网络抽象层): 它的作用是H264只要在网络上传输,在传输的过程每个包以太网是1500字节,而H264的 ...
- h264码流及h265码流结构分析,NAL头类型分析
视频编码标准规定了编码后码流的语法语义,也就阐明了从比特流提取语法元素并进行解释的方法,也就是视频的解码过程. 1.h264码流结构解析: H.264/AVC(Advanced Video ...
- (推荐阅读)H264, H265硬件编解码基础及码流分析
需求 在移动端做音视频开发不同于基本的UI业务逻辑工作,音视频开发需要你懂得音视频中一些基本概念,针对编解码而言,我们必须提前懂得编解码器的一些特性,码流的结构,码流中一些重要信息如sps,pps,v ...
最新文章
- 今日头条员工感慨:30岁以上既可怜又可悲,宁愿选择23岁的,便宜、听话、好用!...
- 获取网络时间并刷新本地时间(源码2)
- SAP Netweaver和阿里云的战略合作关系
- 深度学习之基于Tensorflow2.0实现Xception网络
- 修改了sql默认路径无法登录服务器,PostgreSQL错误'无法连接到服务器:没有这样的文件或目录'...
- Redis非阻塞I/O多路复用机制
- 转成数组_JavaScript之数组扁平化
- python123外汇兑换计算器_Python 3.x--使用re模块,实现计算器运算实例
- 微信网站-微信应用-微信二次开发-演示方案
- 洗礼灵魂,修炼python(8)--高效的字典
- python下载bt文件_python获取bt种子的详细信息
- CMM3上的集成软件管理
- UEditor 配置
- FTP原理和修改FTP默认端口
- thon3爬虫之urllib携带cookie爬取网页的方法
- 周年更名,元宇宙产业委再上新台阶
- 【图像分类】华为云·垃圾分类亚军方案分享
- endnote文件enl突然没了_科学网—实际操作中的Endnote库文件损坏修复方法 - 尹卓忻的博文...
- 函数图像变换的规律,以一元函数和二元函数为例来说明,对多元函数同样适用。...
- oracle11g 磁盘心跳_31串口心跳和磁盘心跳的区别
热门文章
- Nand Flash引脚(Pin)的说明
- ASEMI整流桥2W10中文资料,ABS10整流桥参数
- gdb调试[奇牛学院]
- 使用全局变量有什么好处?有什么坏处?_一起来了解下:喝贡菊花茶有什么好处、喝菊花茶的好处和坏处...
- MomentJs 常用api
- 《安全屋》第一季华丽登场,一桩划算的数据“买卖”
- 旧时光的伤感日志:我们的转身,泪倾城
- 网络测速linux,Linux系统下的网络带宽测速
- 做站群前期的准备工作
- 法律常识(一)婚姻法全文