【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,标识profilestill_pictureframe_width_bits_minus_1frame_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_idframe_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_1output_frame_height_in_tiles_minus_1tile_count_minus_1、tile_list_entry()信息。在tile_list_entry中包含anchor_frame_idxanchor_tile_rowanchor_tile_coltile_data_size_minus_1coded_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_obureserved_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类型及码流结构相关推荐

  1. AVS3码流结构解析

    AVS3编码学习过程中,很重要的一部分是捋清码流结构.通过学习AVS3-P2(FCD 2.0)-20200403_N2805.pdf,博主整理了AVS3的码流结构思维导图,并将编码树.编码单元.变换单 ...

  2. H.264码流结构解析

    大概前五六年之前写过的一个大体分析H.264格式,不是很详细,可以大致看看有哪些格式.  H.264码流结构解析 那个时候上传的百度文库,以前记得有多积分,现在都不能下载了,还要充钱才可以.真是~~~ ...

  3. H.264码流结构及JM8.6中码流的产生步骤

    整理自:http://www.cnblogs.com/xkfz007/archive/2012/08/12/2612931.html H.264中的码流结构 H.264码流结构示意图: NALU第一字 ...

  4. 【mpeg】mpeg1、mpeg2与mpeg4码流结构区别分析

    Date: 2018.10.25 1.参考 http://www.cnblogs.com/CoderTian/p/9246225.html 2.前言     最近在学习和研究MPEG-2标准的过程中, ...

  5. H.264中NALU、RBSP、SODB的关系 (弄清码流结构)

    NALU:Coded H.264 data is stored or transmitted as a series of packets known as NetworkAbstraction La ...

  6. 音视频学习(十一)——H265视频码流

    网络分层结构 和H264/AVC结构类似,H265/HEVC也采用了视频编码层(video code layer ,简称VCL)和网络适配层(network abstract layer,简称NAL) ...

  7. 【FFmpeg学习】H264 视频码流分析

    1. H264编码分层 NAL层:(Network Abstraction Layer,视频数据网络抽象层): 它的作用是H264只要在网络上传输,在传输的过程每个包以太网是1500字节,而H264的 ...

  8. h264码流及h265码流结构分析,NAL头类型分析

    视频编码标准规定了编码后码流的语法语义,也就阐明了从比特流提取语法元素并进行解释的方法,也就是视频的解码过程.   1.h264码流结构解析:     H.264/AVC(Advanced Video ...

  9. (推荐阅读)H264, H265硬件编解码基础及码流分析

    需求 在移动端做音视频开发不同于基本的UI业务逻辑工作,音视频开发需要你懂得音视频中一些基本概念,针对编解码而言,我们必须提前懂得编解码器的一些特性,码流的结构,码流中一些重要信息如sps,pps,v ...

最新文章

  1. 今日头条员工感慨:30岁以上既可怜又可悲,宁愿选择23岁的,便宜、听话、好用!...
  2. 获取网络时间并刷新本地时间(源码2)
  3. SAP Netweaver和阿里云的战略合作关系
  4. 深度学习之基于Tensorflow2.0实现Xception网络
  5. 修改了sql默认路径无法登录服务器,PostgreSQL错误'无法连接到服务器:没有这样的文件或目录'...
  6. Redis非阻塞I/O多路复用机制
  7. 转成数组_JavaScript之数组扁平化
  8. python123外汇兑换计算器_Python 3.x--使用re模块,实现计算器运算实例
  9. 微信网站-微信应用-微信二次开发-演示方案
  10. 洗礼灵魂,修炼python(8)--高效的字典
  11. python下载bt文件_python获取bt种子的详细信息
  12. CMM3上的集成软件管理
  13. UEditor 配置
  14. FTP原理和修改FTP默认端口
  15. thon3爬虫之urllib携带cookie爬取网页的方法
  16. 周年更名,元宇宙产业委再上新台阶
  17. 【图像分类】华为云·垃圾分类亚军方案分享
  18. endnote文件enl突然没了_科学网—实际操作中的Endnote库文件损坏修复方法 - 尹卓忻的博文...
  19. 函数图像变换的规律,以一元函数和二元函数为例来说明,对多元函数同样适用。...
  20. oracle11g 磁盘心跳_31串口心跳和磁盘心跳的区别

热门文章

  1. Nand Flash引脚(Pin)的说明
  2. ASEMI整流桥2W10中文资料,ABS10整流桥参数
  3. gdb调试[奇牛学院]
  4. 使用全局变量有什么好处?有什么坏处?_一起来了解下:喝贡菊花茶有什么好处、喝菊花茶的好处和坏处...
  5. MomentJs 常用api
  6. 《安全屋》第一季华丽登场,一桩划算的数据“买卖”
  7. 旧时光的伤感日志:我们的转身,泪倾城
  8. 网络测速linux,Linux系统下的网络带宽测速
  9. 做站群前期的准备工作
  10. 法律常识(一)婚姻法全文