【AV1 spec学习一】OBU类型及码流结构

【AV1 spec学习一】OBU类型及码流结构

基本概念

刚开始看AV1 spec,对一些初见的名词在此做些记录,随见随添。

缩写全称含义
OBUOpen Bitstream UnitAV1的语法结构都打包在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。)
    OBU结构

码流结构

从上文分析,一段AV1码流可以由sequence_header_obu,frame_obu组成,也可由sequence_header_obu,frame_obu,frame_header_obu, tile_group_obu,temporal_delimiter_obu穿插组成。下图是一个简单的码流结构示意图。
码流结构示意图

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
AV1是一种新兴的开源、版权免费的视频压缩格式,由开放媒体联盟(AOMedia)行业联盟于2018年初联合开发并最终定稿。AV1的发展前景应该会比较好,因为主流的互联网及硬件厂家都在参与其中,AV1的软件生态已经比较完善,开源的编码器如libaom、svt-av1等都比较成熟。国内各大互联网公司也都在AV1赛道发力。虽然AV1仍旧是一款混合编码架构下的编码器,但是AV1已经有一些对机器学习的探索,内部也开始引入机器学习的编码工具。AV1针对视频传输的痛点,提出的编码工具不单纯为了提高压缩率,更多的是解决点播、直播或者实时应用传输利用面临的问题。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [AV1编码标准整体概述](https://blog.csdn.net/Wu_qz/article/details/129106186)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [AV1编码技术分析](https://blog.csdn.net/irainsa/article/details/127930320)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值