AV1到达开始和约束时间
在AV1的解码器模型中,比特流到达平滑缓冲区的速率只有两种,以恒定速度BitRate到达缓冲区,或者以速率0到达缓冲区,其中BitRate的峰值比特率,BitRate= MaxBitrate * BitrateProfileFactor,其中MaxBitrate和BitrateProfileFactor 由Profile来确定。参数BitRate的具体设置方式请参考AV1标准文档A.3节。AV1解码器模型使用变量FirstBitArrival[i] 表示DFG i的第一个比特到达平滑缓冲区的时间,使用变量LastBitArrival[i]表示DFG i最后一个比特到平滑缓冲区的时间使用变量ScheduledRemoval[i]表示计划把DFG i从平滑缓冲区删除的时间。
对于DFG i,其第一个比特必须在最迟的截止时间之前到达平滑缓冲区。这样才能抱枕高DFG i,中的比特能够在DFG i所对应的帧预定解码时间之前呗完整接收。FirstBitArrival[i]的计算方式如下。
FirstBitArrival[i] = max(LastBitArrival[i-1], LastestArrivalTime[i])
其中,LatestArrivalTime[i] 是指DFG i的第一个比特必须到达平滑缓冲区的最晚时间,以确保在预定的移除时间ScheduledRemoval[i]来到时,整个DFG 处于完整可用状态,默认情况下,这个时间是以秒为单位,当接收到一组新的解码模型参数时,这个时间是以解码模型参数定义的解码时钟周期DecCT为单位的。因此,LatestArrivalTime[i]的计算方式如下。
LatestArrivalTime[i] = ScheduledRemoval[i] - (encoder_buffer_delay + decoder_buffer_delay) / 90000
其中,语法元素decoder_buffer_delay指定了第一个比特到达平滑缓冲区时刻和第一个编码帧数据从平滑缓冲区呗移除时刻之间的时间间隔,语法元素encoder_buffer_delay指定了解码帧的第一个比特到达平滑缓冲区的时间。
DFG i最后一个比特到达缓冲区的时间LastBitArrival[i]的计算方式如下
LastBitArrival[i] = FirstBitArrival[i] + CodedBits[i] / BitRate
其中,CodedBits表示编码DFG i所花费的比特总数。
2 移除时间
每个DFG都会有一个从平滑缓冲区预计移除时间ScheduledRemoval[i]和从平滑缓冲区实际移除时间Removal[i],解码器模型在DFG i从平滑缓冲区移除的那一刻开始解码一个视频帧,所以,实际移除时间Removal[i]也可以视为一个视频帧的解码时刻。AV1有两种不同的模式来确定ScheduledRemoval[i],分别是解码调度模式Decoding Schedule Mode 和资源可用性模式
(1)解码调度模式
在解码调度模式下,编码器使用语法元素buffer_removal_time[i]来编码传输DFG i从平滑缓冲区预计移除时间,假设ScheduledRemovalTiming[i]是DFG i从平滑缓冲区预计移除时间,buffer_removal_time[i]与ScheduledRemovalTiming[i]之间的关系如下。
ScheduledRemovalTiming[0] = decoder_buffer_delay / 90000
ScheduledRemovalTiming[i] = ScheduledRemovalTiming[0] + buffer_removal_time[i] * DecCT
其中,decoder_buffer_delay 是第一个DFG从平滑缓冲区移除的时间,因此,buffer_removal_time[i]可以视为DFG i从平滑缓冲区预计移除时间,ScheduledRemovalTiming[i] 相对于ScheduledRemovalTiming[0]的时间偏移量,
buffer_removal_time[i] = (ScheduledRemovalTiming[i] - ScheduledRemovalTiming[0]) / DecCT
在解码调度模式下,实际移除时间Removal[i]和预计移除时间,ScheduledRemoval[i] 可能是不同的。解码调度模式有两种模式来确定实际移除时间Removal[i] 具体来讲。
当操作点的low_delay_mode_flag设置为0时,解码器按照严格到达模式进行操作,这种模式下,DFG会在预计移除时间ScheduledRemoval[i]准时从平滑缓冲区中移除。
Removal[i] = ScheduledRemovalTiming[i]
当操作点low_delay_mode_flag 设置为1时,解码器将进入低延迟模式low Delay Mode。在此模式下,DFG数据可能无法在预定的移除时间ScheduledRemovalTiming[i]之前完全到达平滑缓冲区,也就是说,最后一个比特的到达时间LastBitArrival[i]会晚于预计移除时间,即ScheduledRemovalTiming[i]小于LastBitArriall[i] ,因此DFG i的移除操作将被延后,直到整个DFG数据完全加载到平滑缓冲区之后的下一个解码时钟周期,解码器才开始把DFG i从平滑缓冲区移除,因此,实际移除时间Removal[i]计算如下。
Removal[i] = ceil(LastBitArrival[i] / DecCT) * DecCT
如果整个DFG在预定移除时间ScheduledRemovalTiming[i] 之前已经在平滑缓冲区中可用,即ScheduledRemvalTiming[i] 大于LastBitArrival[i] 那么DFG将在预定移除时间ScheduledRemovalTiming[i] 从平滑缓冲区移除,即
Removal[i] = ScheduledRemovalTiming[i]
解码调度模式灵活定义了何时从平滑缓冲区中移除DFG,何时开始解码帧,何时现实帧,使用恒定的帧率之外,解码调度模式还可以通过显示编码传输解码帧的呈现时间来支持变化的帧率。AV1 标准文档E3.2 节描述了解码调度模式的参数设置方法,为了使用解码调度模式,编码器需要在比特流中传输以下参数。
timing_info_present_flag = 1, decdoer_model_info_present_flag = 1, decoder_model_present_for_this_op = 1 除了上述参数之外,编码器还需要传输decoder_buffer_delay, encoder_buffer_delay 以及解码器时钟周期相关的语法元素num_units_in_decoding_tick,另外,比妈妈气还需要为每帧传输ScheduledRemoval,和呈现时间相关的语法元素buffer_removal_time和frame_presentation_time。