



为了更加清晰地描述AV1比特流,AV1引入了时间单元(Temporal Unit,TU)的概念。如AV1标准文档7.5节所述,符合AV1规范的比特流由一个或多个编码视频序列组成。一个编码视频序列由一个或多个时间单元构成。而时间单元则是由一个时间分隔符OBU和所有在此之后并且在下一个时间分隔符OBU之前的OBU组成。这些OBU包含时间分隔符OBU、序列头OBU、元数据OBU、帧头OBU、切片组OBU以及填充OBU。其中,时间分隔符OBU用于指示时间单元的开始,序列头OBU和元数据OBU包含了与整个序列相关的信息,帧头OBU和切片组OBU包含了与单个帧相关的信息,填充OBU用于填充数据以满足特定的编码要求。
时间单元始终按照递增的显示顺序排列。如果不使用可扩展性编码,则时间单元恰好包含一个显示帧,即show_existing_frame等于1或show_frame等于1的帧。如果使用可扩展性编码,则一个时间单元可能包含来自不同扩展层(Scalable Layer)的所有显示帧,这些显示帧具有相同的显示时间。这里需要注意的是,时间单元必须包含显示帧,同时也可以包含语法元素show_frame等于0的视频帧。由于重叠帧的show_frame等于1,因此时间单元中的显示帧可以是重叠帧(Overlay Frame)。关于重叠帧的详细介绍,请参考第4章。因此,可以认为一个时间单元由一个显示帧和0个或多个非显示帧组成。
图2-3所示为比特流中时间单元划分示例。图2-3a展示了GOP长度等于4帧的金字塔预测编码结构,其中矩形框中的数字表示编码顺序,横坐标轴表示显示顺序。图2-3b展示了图2-3a的码流结构中的时间单元划分方式,其中TD表示时间分隔符,TU表示时间单元,SeqHdr表示序列头信息。在图2-3b中,标记“帧 x / y ”的矩形表示编码帧数据, x 是编码顺序, y 是显示顺序。“帧0/0”和“帧3/1”的语法元素show_frame等于1,表示解码之后立即输出。“帧0/0”使用TU0的时间分隔符所指示的时间戳,而“帧3/1”使用TU1的时间分隔符所指示的时间戳。“帧1/4”和“帧2/2”的语法元素show_frame等于0,表示解码之后不能立即输出。FrameHdr2是一个帧头信息,其中的show_existing_frame等于1并且frame_to_show_map_idx指向先前已经解码的“帧2/2”。这种操作表示,此时要输出“帧2/2”,它使用的是TU2的时间分隔符所指示的时间戳。
图2-3 比特流中时间单元划分示例
关于时间单元,有以下几点需要注意:
❍在一个时间单元内,帧头和与之相关的切片组OBU必须使用相同的obu_extension_flag值。也就是说,如果一个帧头包括可选的OBU扩展头信息,那么与之相关的所有切片组OBU也必须包括可选的OBU扩展头信息;如果一个帧头不包含可选的OBU扩展头信息,那么与之相关的所有切片组OBU也不能包含可选的OBU扩展头信息。
❍对于位于同一个时间单元之内的所有OBU扩展头,当这些OBU扩展头的spatial_id都相同时,它们的tempotal_id也必须相同。
❍并不是每个包含关键帧的时间单元都必须包含序列头,只是要求序列头在第一个关键帧之前已经发送。但是,没有序列头OBU的时间单元不被视为随机访问点(Random Access Point)。
基于时间单元的概念,每个新的编码视频序列都定义为从满足以下两个条件的每个时间单元开始:
❍第一个帧头OBU之前包含一个或多个序列头OBU。
❍第一个帧头信息中的语法元素frame_type=KEY_FRAME、show_frame=1、show_existing_frame=0和temporal_id=0。
如果不使用可扩展性编码,则所有视频帧都是操作点的一部分。此时,操作点必须满足以下约束条件:
❍第一个帧头信息中的语法元素frame_type=KEY_FRAME、show_frame=1。
❍每个时间单元恰好包含一个显示帧,即show_existing_frame=1或show_frame=1。
如果使用了可扩展性编码,此时会有多个操作点。每个操作点必须满足以下约束条件:
❍即将解码的第一个帧头信息必须包含语法元素frame_type和show_frame,并且frame_type=KEY_FRAME,show_frame=1。
❍在一个时间单元中,每个具有编码帧的层必须有一个显示帧,该显示帧是该层在时间单元中的最后一帧。