当前位置: 首页 > article >正文

AV1 Bitstream Decoding Process Specification--[5]: 语法结构语义-1

  • 原文地址:https://aomediacodec.github.io/av1-spec/av1-spec.pdf
  • 没有梯子的下载地址:AV1 Bitstream & Decoding Process Specification
  • 摘要:这份文档定义了开放媒体联盟(Alliance for Open Media)AV1视频编解码器的比特流格式和解码过程。
  • 规范:此文档规定了开放媒体联盟(Alliance for Open Media)AV1比特流格式和解码过程。

语法结构语义(Syntax structures semantics)

通用(General)

  • 这一节说明了在语法结构中读取的语法元素的含义。
  • 重要的变量和函数调用也进行了描述。

OBU语义(OBU semantics)

通用OBU语义( General OBU semantics)

  1. 一系列有序的OBU(Obligatory Bitstream Unit)被呈现给解码过程。每个OBU作为一串字节提供给解码过程,并附带一个变量sz,该变量标识OBU中的总字节数。
  2. 如果OBU头部中的语法元素obu_has_size_field等于1,则变量sz将不被使用,也无需提供。
  3. obu_size包含OBU的大小(以字节为单位),不包括obu_header或obu_size语法元素内的字节。
  4. 在交付或容器格式中对OBU进行帧定界的方法(即识别OBU系列及其大小和有效载荷数据的方法)可能以本规范范围之外的方式确定。一个简单的方法在附录B中描述。
  5. OBU数据从给定字节的第一个(最高有效)位开始,到最后一位结束。一个OBU的有效载荷位于给定字节的第一个位和第一个尾随位之前的最后一位之间。除非OBU仅包含头部,否则尾随位始终存在。当OBU的有效载荷不是字节对齐时,尾随位实现字节对齐。尾随位也可用于额外的字节填充,如果使用,则在sz值中考虑。在所有情况下,尾随位的模式保证所有OBU(除了仅包含头部的OBU)都以相同的模式结束:一个位设置为一,后面可选地跟着零位。
    • 注意:作为对畸形编码数据的有效性检查,以及在可能发生丢失和错误的环境中操作,解码器可能会检测到错误,如果解析数据的结尾不是直接跟随正确的尾随位模式,或者解析OBU头部和有效载荷导致消耗尾随位内的位(除了在第8.2.4节中描述的允许瓦片组数据读取尾随位的一小部分)。
  6. drop_obu()是一个函数调用,指示解码过程应该忽略一个OBU,因为它不包含在选定的操作点中。当一个OBU不在选定的操作点时,其内容对解码过程没有影响。
    • 当调用这个函数时,位流位置指示器应该前进obu_size * 8位。

OBU 头语义(OBU header semantics)

  1. OBUs(视频编码单元)由头部和有效载荷组成。头部通过obu_type头部参数标识有效载荷的类型。
  2. obu_forbidden_bit必须设置为0。
    • 注意:这确保了可以通过防止模拟MPEG2传输流ID来实现MPEG2传输。
  3. obu_type指定了OBU有效载荷中包含的数据结构类型:
    在这里插入图片描述
  4. 保留的单元在未来使用,应该被 AV1 解码器忽略。
  5. obu_extension_flag表示是否存在可选的 obu_extension_header。
  6. obu_has_size_field 等于 1 表示将包含 obu_size语法元素。obu_has_size_field 等于 0 表示不会包含 obu_size 语法元素。
  7. obu_reserved_1bit 必须设置为 0。解码器会忽略这个值。

OBU 扩展头语义(OBU extension header semantics)

  1. temporal_id 指定了OBU中包含数据的时间层级。当 temporal_id 不存在时,推断 temporal_id 等于 0。
  2. spatial_id 指定了OBU中包含数据的空间层级。当 spatial_id 不存在时,推断 spatial_id 等于 0。
    a. 注意:术语“空间”指的是这里的增强发生在空间维度:要么是空间分辨率的增加,要么是空间保真度的增加(信噪比SNR提高)。
  3. spatial_idtemporal_id 都等于 0 相关的瓦片组OBU数据被称为基底层,而与 spatial_id 大于 0 或 temporal_id 大于 0 相关的瓦片组OBU数据被称为增强层。
  4. 具有时间层级 temporal_id T 和空间层级 spatial_id S 的编码视频数据只允许引用之前编码的视频数据的时间层级 temporal_id T’ 和空间层级 spatial_id S’,其中 T’ ≤ T 且 S’ ≤ S。
  5. extension_header_reserved_3bits 必须设置为 0。解码器会忽略这个值。

拖尾比特语义(Trailing bits semantics)

  1. 注意:瓦片组OBUs、瓦片列表OBUs和帧OBUs确实以尾随位结束,但在这些情况下,尾随位被exit_symbol过程消耗。
  2. 拖尾一位(trailing_one_bit)应等于1。
  3. 当读取语法元素拖尾一位(trailing_one_bit)时,要求nbBits大于零。
  4. 拖尾零位(trailing_zero_bit)应等于0,并插入到比特流中,以将比特位置对齐到8位的倍数,并为OBU添加可选的零填充字节。

字节对齐语义(Byte alignment semantics)

  1. 零位(zero_bit)应等于0,并插入到比特流中,以将比特位置对齐到8位的倍数。

保留的OBU语义(Reserved OBU semantics)

  1. 保留的OBU允许以一种方式扩展此规范,增加额外的OBU类型,这种方式使得旧的解码器可以忽略它们。

序列头OBU语义(Sequence header OBU semantics)

通用序列头OBU语义(General Sequence header OBU semantics)

  1. seq_profile 指定了编码视频序列中可以使用的特性。
    在这里插入图片描述

  2. still_picture 等于 1 表示编码视频序列只包含一个编码帧。still_picture 等于 0 表示编码视频序列包含一个或多个编码帧。

  3. reduced_still_picture_header 表示省略了静像不需要的语法元素。

    • 如果 reduced_still_picture_header 等于 1,比特流合规性要求 still_picture 必须等于 1。
    • 注意:允许 still_picture 等于 1 且 reduced_still_picture_header 等于 0。这允许通过改变单个位将视频帧转换为静像。
  4. timing_info_present_flag 指定编码视频序列中是否存在时间信息。

  5. decoder_model_info_present_flag 指定编码视频序列中是否存在解码器模型信息。

  6. initial_display_delay_present_flag 指定编码视频序列中是否存在初始显示延迟信息。

  7. operating_points_cnt_minus_1 指示编码视频序列中存在的操作点数量减去 1。操作点指定了应该解码哪些空间和时间层。

  8. operating_point_idc[ i ] 包含一个位掩码,指示对于操作点 i 应该解码哪些空间和时间层。如果应该解码时间层 k(对于 k 在 0 到 7 之间),则第 k 位等于 1。如果应该解码空间层 j(对于 j 在 0 到 3 之间),则第 j+8 位等于 1。

    • 然而,如果 operating_point_idc[ i ] 等于 0,则表示编码视频序列在 OBU 扩展头部没有可伸缩性信息,操作点适用于整个编码视频序列。这意味着所有 OBUs 都必须被解码。
    • 比特流合规性的要求是 operating_point_idc[ i ] 对于 j = 0…(i - 1) 不等于 operating_point_idc[ j ]。
    • 注意:这个限制意味着不允许两个操作点具有相同的 operating_point_idc 值。
    • 如果对于任何值 op 从 0 到 operating_points_cnt_minus_1,operating_point_idc[ op ] 不等于 0,那么比特流合规性的要求是 obu_extension_flag 必须等于 1。
  9. seq_level_idx[ i ] 指定当选择操作点 i 时,编码视频序列符合的级别。注意:编码器应选择满足操作点的最低级别,以最大化能够解码流的解码器数量,但这不是比特流合规性的要求。

  10. seq_tier[ i ] 指定当选择操作点 i 时,编码视频序列符合的层级。

  11. decoder_model_present_for_this_op[ i ] 等于一表示与操作点 i 相关联有解码器模型。decoder_model_present_for_this_op[ i ] 等于零表示与操作点 i 无关联解码器模型。

  12. initial_display_delay_present_for_this_op[ i ] 等于 1 表示为操作点 i 指定了 initial_display_delay_minus_1。initial_display_delay_present_for_this_op[ i ] 等于 0 表示未为操作点 i 指定 initial_display_delay_minus_1。

  13. initial_display_delay_minus_1[ i ] 加 1 指定,对于操作点 i,在显示第一个可呈现帧之前,应该在缓冲池中存在的解码帧数。这将确保序列中的所有可呈现帧都能在计划显示的时间或之前被解码。如果没有信号,则 initial_display_delay_minus_1[ i ] = BUFFER_POOL_MAX_SIZE - 1。

  14. choose_operating_point() 是一个函数调用,表示应选择操作点。这个函数的实现取决于所选实现的能力。操作点的顺序指示产生输出的首选顺序:解码器应选择列表中最早满足其解码能力的、与每个操作点相关联的级别的操作点。

    • 解码器必须从 choose_operating_point 返回一个介于 0 和 operating_points_cnt_minus_1 之间的值,或者如果在解码器的能力范围内找不到任何级别,则放弃解码过程。
    • 注意:为了帮助合规性测试,解码器可能允许通过外部方式明确信号操作点。
    • 注意:当新的编码视频序列开始时,解码器可能需要更改操作点选择。
  15. OperatingPointIdc 指定所选操作点的 operating_point_idc 值。

    • 比特流合规性的要求是,如果 OperatingPointIdc 等于 0,则在此序列头之后的所有 OBUs 中 obu_extension_flag 必须等于 0,直到下一个序列头。
  16. frame_width_bits_minus_1 指定用于传输帧宽语法元素的位数减去 1。

  17. frame_height_bits_minus_1 指定用于传输帧高语法元素的位数减去 1。

  18. max_frame_width_minus_1 指定此序列头表示的帧的最大宽度减去 1。

  19. max_frame_height_minus_1 指定此序列头表示的帧的最大高度减去 1。

  20. frame_id_numbers_present_flag 指定编码视频序列中是否存在帧 ID 号码。

    • 注意:帧 ID 号码(在 display_frame_id、current_frame_id 和 RefFrameId[ i ] 中表示)不是解码过程所必需的,但允许解码器发现丢失的帧并采取适当的行动。
  21. additional_frame_id_length_minus_1 用于计算用于编码 frame_id 语法元素的位数。

  22. delta_frame_id_length_minus_2 指定用于编码 delta_frame_id 语法元素的位数减去 2。

  23. use_128x128_superblock,当等于 1 时,表示超块包含 128x128 亮度样本。当等于 0 时,表示超块包含 64x64 亮度样本。(包含的色度样本数量取决于 subsampling_x 和 subsampling_y。)

  24. enable_filter_intra 等于 1 指定可能存在 use_filter_intra 语法元素。enable_filter_intra 等于 0 指定不会存在 use_filter_intra 语法元素。

  25. enable_intra_edge_filter 指定是否应该启用内部边缘过滤过程。

  26. enable_interintra_compound 等于 1 指定对于间隔块,模式信息可能包含 interintra 语法元素。enable_interintra_compound 等于 0 指定不会存在 interintra 语法元素。

  27. enable_masked_compound 等于 1 指定对于间隔块,模式信息可能包含 compound_type 语法元素。enable_masked_compound 等于 0 指定不会存在 compound_type 语法元素。

  28. enable_warped_motion 等于 1 表示可能存在 allow_warped_motion 语法元素。enable_warped_motion 等于 0 表示不会存在 allow_warped_motion 语法元素。

  29. enable_order_hint 等于 1 表示可以使用基于顺序提示值的工具。enable_order_hint 等于 0 表示禁用基于顺序提示值的工具。

  30. enable_dual_filter 等于 1 表示可以在水平和垂直方向独立指定间隔预测滤波器类型。如果标志等于 0,则只能指定一种滤波器类型,然后在两个方向上使用。

  31. enable_jnt_comp 等于 1 表示对于间隔预测,可能使用距离权重过程。

  32. enable_ref_frame_mvs 等于 1 表示可能存在 use_ref_frame_mvs 语法元素。enable_ref_frame_mvs 等于 0 表示不会存在 use_ref_frame_mvs 语法元素。

  33. seq_choose_screen_content_tools 等于 0 表示将存在 seq_force_screen_content_tools 语法元素。seq_choose_screen_content_tools 等于 1 表示应将 seq_force_screen_content_tools 设置为 SELECT_SCREEN_CONTENT_TOOLS。

  34. seq_force_screen_content_tools 等于 SELECT_SCREEN_CONTENT_TOOLS 表示帧头中将存在 allow_screen_content_tools 语法元素。否则,seq_force_screen_content_tools 包含 allow_screen_content_tools 的值。

  35. seq_choose_integer_mv 等于 0 表示将存在 seq_force_integer_mv 语法元素。seq_choose_integer_mv 等于 1 表示应将 seq_force_integer_mv 设置为 SELECT_INTEGER_MV。

  36. seq_force_integer_mv 等于 SELECT_INTEGER_MV 表示如果 allow_screen_content_tools 等于 1,则帧头中将存在 force_integer_mv 语法元素。否则,seq_force_integer_mv 包含 force_integer_mv 的值。

  37. order_hint_bits_minus_1 用于计算 OrderHintBits。

  38. OrderHintBits 指定用于 order_hint 语法元素的位数。

  39. enable_superres 等于 1 表示未压缩头部中将存在 use_superres 语法元素。enable_superres 等于 0 表示不会存在 use_superres 语法元素(相反,未压缩头部中将设置 use_superres 为 0,而不需要读取)。

    • 注意:即使编码视频序列中的任何帧的 use_superres 不等于 1,也允许将 enable_superres 设置为 1。
  40. enable_cdef 等于 1 表示可能启用 cdef 过滤。enable_cdef 等于 0 表示禁用 cdef 过滤。

    • 注意:即使编码视频序列中的任何帧不使用 cdef 过滤,也允许将 enable_cdef 设置为 1。
  41. enable_restoration 等于 1 表示可能启用循环恢复过滤。enable_restoration 等于 0 表示禁用循环恢复过滤。

    • 注意:即使编码视频序列中的任何帧不使用循环恢复,也允许将 enable_restoration 设置为 1。
  42. film_grain_params_present 指定编码视频序列中是否存在胶片颗粒参数。

颜色配置语义(Color config semantics)

  1. high_bitdepth 和 twelve_bit 是语法元素,它们与 seq_profile 一起决定了比特深度。

  2. mono_chrome 等于 1 表示视频不包含 U 和 V 色度平面。mono_chrome 等于 0 表示视频包含 Y、U 和 V 色度平面。

  3. color_description_present_flag 等于 1 指定了存在 color_primaries、transfer_characteristics 和 matrix_coefficients。color_description_present_flag 等于 0 指定了不存在 color_primaries、transfer_characteristics 和 matrix_coefficients。

  4. color_primaries 是一个整数,由 ISO/IEC 23091-4/ITU-T H.273 的 “Color primaries” 部分定义。
    在这里插入图片描述

  5. transfer_characteristics 是一个整数,它由 ISO/IEC 23091-4/ITU-T H.273 标准中的 “Transfer characteristics”(传输特性)部分定义。
    在这里插入图片描述

  6. matrix_coefficients 是一个整数,它根据 ISO/IEC 23091-4/ITU-T H.273 标准中的 “Matrix coefficients”(矩阵系数)部分来定义。
    在这里插入图片描述

  7. color_range 是一个二进制值,与 ISO/IEC 23091-4/ITU-T H.273 标准中指定的 VideoFullRangeFlag 变量相关联。当 color_range 等于 0 时,应称之为studio范围表示,而当 color_range 等于 1 时,应称之为full范围表示,就本规范的所有相关意图而言。

    • 注意:当信号为studio范围时,本规范不强制执行范围。因此,应用程序应根据指定的范围执行额外的限定和颜色转换操作。
  8. subsampling_x, subsampling_y 指定了色度子采样格式:
    在这里插入图片描述

    • 如果 matrix_coefficients 等于 MC_IDENTITY,比特流合规性的一个要求是 subsampling_x 必须等于 0 并且 subsampling_y 必须等于 0。
  9. chroma_sample_position 指定了子采样流的色度样本位置:
    在这里插入图片描述

  10. separate_uv_delta_q等于 1 表示 U 和 V 平面可能具有独立的增量量化器值。separate_uv_delta_q等于 0 表示 U 和 V 平面将共享相同的增量量化器值。

时间信息语义(Timing info semantics)

  1. num_units_in_display_tick 是一个以 time_scale赫兹频率运行的时钟的单位数量,对应于一个时钟刻度计数器的增加。显示时钟刻度,以秒为单位,等于 num_units_in_display_tick除以 time_scale。
    在这里插入图片描述

    • 注意:÷ 运算符代表标准数学除法(与代表整数除法的 / 运算符相对)。
    • 比特流合规性的一个要求是 num_units_in_display_tick 必须大于 0。
  2. time_scale是每秒经过的时间单位数量。

    • 比特流合规性的一个要求是 time_scale 必须大于 0。
  3. equal_picture_interval 等于 1 表示应该按照它们的输出顺序显示图片,两个连续图片(不丢帧)之间的刻度数由 num_ticks_per_picture_minus_1 + 1 指定。equal_picture_interval 等于 0 表示两个连续图片之间的间隔没有指定。

  4. num_ticks_per_picture_minus_1 加 1 指定了按照输出顺序,两个连续图片之间的输出时间对应的时钟刻度数。

    • 比特流合规性的一个要求是 num_ticks_per_picture_minus_1 的值应在 0 到 (1 << 32) − 2(包含)的范围内。
    • 注意:当明确指定帧率时,它适用于比特流的顶层时间层。如果预计比特流会被操纵,例如通过中间网络元素,那么结果的帧率可能与指定的不匹配。在这种情况下,建议编码器使用显式时间码或一些在比特流之外传递图片定时信息的机制。

解码器模式信息语义(Decoder model info semantics)

  1. buffer_delay_length_minus_1 加 1 指定了 decoder_buffer_delay 和 encoder_buffer_delay 语法元素的长度,单位为比特。

  2. num_units_in_decoding_tick 是一个解码时钟的计数器每次增加一个刻度所对应的时间单位数量,该解码时钟以 time_scale 赫兹的频率运行:
    在这里插入图片描述

    • 注意:÷ 运算符代表标准数学除法(与整数除法的 / 运算符相对)。
    • num_units_in_decoding_tick 必须大于 0。DecCT 表示解码单个帧的预期时间,或者是不同大小和尺寸的帧在编码视频序列中解码的预期时间的公因数。
  3. buffer_removal_time_length_minus_1 加 1 指定了 buffer_removal_time 语法元素的长度,单位为比特。

  4. frame_presentation_time_length_minus_1 加 1 指定了 frame_presentation_time 语法元素的长度,单位为比特。

操作参数信息语义(Operating parameters info semantics)

  1. decoder_buffer_delay[ op ] 指定对于操作点 op,平滑缓冲区中第一个比特到达与随后移除属于第一个编码帧的数据之间的时间间隔,以 1/90000 秒为单位。decoder_buffer_delay 的长度由 buffer_delay_length_minus_1 + 1 指定,单位为比特。
  2. encoder_buffer_delay[ op ] 与 decoder_buffer_delay[ op ] 语法元素结合使用,指定要解码到平滑缓冲区的帧的第一个比特到达时间。encoder_buffer_delay 以 1/90000 秒为单位进行测量。
    ○ 对于包含一个或多个随机访问点的视频序列,decoder_buffer_delay 和 encoder_buffer_delay 的总和应保持不变。
  3. low_delay_mode_flag[ op ] 等于 1 表示对于操作点 op,平滑缓冲区在低延迟模式下运行。在低延迟模式下,允许晚解码时间和缓冲区欠流。low_delay_mode_flag[ op ] 等于 0 表示平滑缓冲区在严格模式下运行,不允许缓冲区欠流。

http://www.kler.cn/a/313262.html

相关文章:

  • DAY112代码审计PHP开发框架POP链利用Yii反序列化POP利用链
  • 学习记录:js算法(九十二):克隆图
  • 大数据新视界 -- 大数据大厂之 Impala 性能飞跃:动态分区调整的策略与方法(上)(21 / 30)
  • PostgreSQL分区表:基础语法与运维实践
  • MySQL与Oracle对比及区别
  • 如何使用ffmpeg命令行进行录屏
  • LeetCode[中等] 3. 无重复字符的最长子串
  • Java项目实战II基于Java+Spring Boot+MySQL的大型商场应急预案管理系统(源码+数据库+文档)
  • 【原创】java+springboot+mysql科研成果管理系统设计与实现
  • Vue.js 与后端配合:打造强大的现代 Web 应用
  • YoloV9改进策略:BackBone改进|EfficientFormerV2在YoloV9中的创新应用,精度与效率的完美平衡
  • fmql之ubuntu联网
  • 【 ACM独立出版,见刊后1个月检索!!!】第二届通信网络与机器学习国际学术会议(CNML 2024,10月25-27)
  • JS在线加密解密工具
  • 应用性能优化实践(三)减少丢帧卡顿
  • 无线麦克风哪个好,麦克风哪个品牌音质最好,领夹麦克风推荐
  • 可视化工具箱-Visualization Toolkit(VTK)
  • go语言中的数组指针和指针数组的区别详解
  • 【车载开发系列】APQP基本概念
  • IDEA2023.1添加java虚拟机启动参数,打开断言
  • 对接阿里asr和Azure asr
  • KMP算法的实现
  • How can I integrate OpenAI Whisper model into a Kotlin app?
  • 解决 iOS App Tracking Transparency 权限问题
  • windows下,用docker部署xinference,为什么老是提示localhost无法访问?
  • 图说几何学2300年重大错误:附着在直线z上的直线段必是z的一部分