AV1编码资源可用性模式
资源可用性模式下,对于DFG i,解码器不再根据语法元素buffer_removal_time[i] 来确定DFG i从平滑缓冲区预计移除时间ScheduledRemoval[i],而是根据缓存池的可用状态来确定ScheduledRemoval[i].具体来讲,第一帧的ScheduledRemoval[0]时间由decoder_buffer_delay确定,对于DFG i当具有show_existing_frame 标志等于0的前一帧解码完成并且缓存池有空闲帧缓冲区时,解码器把这个时间设置为ScheduledRemoval[i]。
换句话说,在资源可用性模式下,如果缓冲池有可用的空闲插槽,则在前一帧解码完成后立即解码下一帧,否则,这个帧将在缓冲池有空闲插槽时才进行解码。 如果比特流低于解码器的最大级别限制,则帧将一个接一个的进行解码。直到他们填满所有可用的帧缓冲区,之后解码速度会放缓。下一帧的解码仅仅在已经解码缓冲区插槽空闲时才会发生。AV1标准文档E3.1节描述了资源可用性模式的参数设置方法,位了实用资源可用性模式,编码器需要在比特流中设置以下参数
timing_info_present_flag = 1,decoder_model_info_presetn_flag=0,qual_picture_interval = 1
其中,equal_picture_interval = 1表示实用恒定帧率,所以不需要在比特流中编码传输呈现时间在这种情况下,呈现时间是从帧率和Inital_display_delay_minus_1 推导出来的,解码时刻Removal[i]已经解码缓冲区可用时刻确定,不需要在比特流中对其进行传输。
在资源可用性模式下,解码器模型参数采用默认值,例如encoder_buffer_delay = 20000,decoder_buffer_delay = 70000和low_delay_mode_flag = 0,解码过程调用函数time_next_buffer_is_free来计算DFG i的Removal[i] 和ScheduledRemovalResouce[i], ScheduledRemoval[i] = ScheduledRemovalResource[i]
time_next_buffer_is_free(i, time)
{
if (i == 0) {
time = decoder_buffer_delay / 90000
}
foundBuffer = 0
//遍历缓冲池,检查是否可用的插槽
for (k = 0; k < BUFFER_FOOL_MAX_SIZE; k++) {
if (DecoderRefCount[k] == 0) {
if (PlayerRefCount[k] == 0) {
//缓冲池有可用的插槽,把当前时间设置为ScheduledRemovalResource[i]
ScheduledRemovalResource[i] = time
return time;
}
if (!foundBuffer || PresentationTimes[k] < bufFreeTime) {
//如果DecoderRefCount[k]为0,但是PlayerRefCount[k]
//不为0,则bufFreeTime 保存了缓冲池中存在的最小显示时间
bufFreeTime = PresentationTimes[k]
foundBuffer = 1
}
}
}
//把缓冲池中存在的最小显示时间设置为SCHeduledRemovalResource[i]
ScheduledRemovalResource[i] = bufFreeTime
return bufFreeTime
}
3 平滑缓冲区填充度
基于FirstBitArrial[i], LastBitArrival[i], ScheduledRemoval[i]以及Removal[i],解码器模型可以估计平滑缓冲区填充度Smooth buffer fullness. 图2-5所示为平滑缓冲区填充度随时间的变化,当第0帧的第一个比特到达缓冲区时,时钟开始计时。斜线的斜率对应于比特到平滑缓冲区的速度。Remval[i]表示DFG i从平滑缓冲区的实际移除时间,对应从平滑缓冲区中删除除第i帧的数据并且开始解码第i帧的时刻。这里注意,并不是所有时刻都会有新的比特达到缓冲区。可能会存在一个时间段,这段时间内,没有新的比特进入缓冲区。在图2-5中Removal[i]之后的一段时间内,就没有新比特进入缓冲区。这段时间对应着编码器没有比特发送的时间段,即编码器缓冲区为空的时间短。
平滑缓冲区比特数
Frame [0]比特数
Frame[0]比特数
在图2-5种,语法元素decoder_buffer_delay 制定了平滑缓冲区第一个特别到达缓冲区的时刻和第一个编码帧数据从缓冲区被移除的时刻之间的时间间隔,所以,解码开始时间,即Removal[0]由decoder_buffer_delay来决定。这里需要注意的是在decoder_buffer_delay所指定的时间段内,平滑缓冲区可能已经缓存了不止1个编码帧,在图2-5种decoder_buffer_delay 所指定的时间段内,DFG 0和DFG 1都已经到达平滑缓冲区。
2.5.4 视频帧解码时间
AV1解码过程把平滑缓冲区与解码器帧缓冲区之间的操作相互关联。具体来说,解码器模型将控制帧解码的开始时刻以及比特流从平滑缓冲区中移除的时刻,这一过程会迅速降低平滑缓冲区填充度。此外,解码器模型还负责计算解码过程的完成时间,将解码后的帧及时存入解码帧缓冲区中,还决定何时将帧输出到显示器,并将帧从解码器帧缓冲中移除。
AV1的第一特点是广泛使用ARF, ARF只用作帧间预测的参考帧,而不是用于显示的帧,此外,AV1主要档次中支持参考帧的缩放和可扩展编码。AV1解码模型要适应不同类型帧的解码过程所需要的时间。并支持不同分辨率的帧解码和显示速度,位了支持ARF和不同分辨率的帧,AV1解码器模型引入了以下功能。
解码时钟周期DecCT和显示时钟周期DispCT时不同的,他们使用相同的时间尺度,这些时钟是同步的,意味着解码过程和显示过程在处理视频帧时的时间基本时一致的。
解码一帧图像并非瞬间完成,所需要的时间会根据图像的分辨率以及其他因素而有所差异,这也意味着解码过程的持续时间可能会因帧的复杂度,编码参数,硬件性能等 因素而变化。
图2-6 所示为AV1中的解码过程和显示过程,展示了GOP长度为4帧的金字塔预测编码结构,其中矩形框表示视频帧,上面的数字表示改视频帧的显示顺序,带着肩头的曲线和直线表示参考关系,帧2的参考帧时帧0和ARF,帧1的参考帧时帧0的帧2.白色矩形表示ARF,ARF不会显示,通常,ARF时同一时间位置上帧的滤波版本,可以提高帧间预测的准确性。为了在ARF的时间位置显示一帧,编码器可以重新编码一个重叠帧,相比ARF,重叠帧添加了高频和纹理信息,在编码过程中,重叠帧可以使用ARF作为参考帧。
解码时间线 decoder_buffer_delay initial_display_delay
显示时间线 initial_presentation_delay Removal[0] ->DispCT
图2-6 AV1种的解码过程和显示过程
图2-6中的解码时间线和显示时间线使用了不听的时钟周期,因为视频帧在显示之前必须完成解码,所以AV1标准引入了语法元素initial_display_delay_minus_1, 用于明确缓冲池在首次帧显示前应缓存多少个已经解码完成的帧,这个设置确保了在首次帧展示之前,有足够的解码帧可供即使播放,从而保障视频播放的流畅性。
通过语法元素initial_display_delay_minus_1可调整显示过程相对于解码过程的时间偏差,如果不在比特流中指定initial_display_delay_minus_1,那么initial_display_delay_minus_1被设置为BUFFER_POOL_MAX_SIZE-1,其中buffer_pool_max_size = 10 即缓冲区所能存储的最大帧数。
图2-6可见,显示过程的整体显示延迟initial_presentation_delay 包含了decoder_buffer_delay 即第一个比特到达平滑缓冲区时刻与帧0开始解码时刻之间的时间间隔。
AV1标准文档E4.6 描述了如何计算一帧图像所需要的时间,其定义如下
time_to_decode_frame()
{
if (show_existing_frame == 1)
lumaSamples = 0
else if (frame_type == KEY_FRAME || frame_type == INTRA_ONLY )
#对于使用超分辨率模式的帧,UpscaleWidth 时超分辨率之后的帧宽度
//否则,UpscaleWidth时输入帧宽度FrameWidth
else
if (spatial_layer_dimensions_present_flag)
lumaSamples = (spatial_layer_max_width[spatial_id] + (spatial_layer_max_height[spatial_id]))
else
lumaSamples = (amx_frame_width_minus_1 + 1) * (max_frame_height_minus_1 + 1)
MaxDecodeRate是给定level所允许的最大解码速率,定义参考标准为文档A.3节
return lumaSamples + MaxDecodeRate
}