详细介绍:AV1编码资源可用性模式

资源可用性模式下对于DFGi解码器不再根据语法元素buffer_removal_time[i]来确定DFGi平滑缓冲区预计移除时间ScheduledRemoval[i],而是根据缓存可用状态来确定ScheduledRemoval[i].具体来讲第一帧ScheduledRemoval[0]时间decoder_buffer_delay确定对于DFGi当具有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=70000low_delay_mode_flag=0,解码过程调用函数time_next_buffer_is_free计算DFGiRemoval[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

returntime;

}

if(!foundBuffer || PresentationTimes[k] < bufFreeTime){

//如果DecoderRefCount[k]0但是PlayerRefCount[k]

//不为0bufFreeTime保存了缓冲池存在最小显示时间

bufFreeTime= PresentationTimes[k]

foundBuffer=1

}

}

}

//缓冲存在最小显示时间设置SCHeduledRemovalResource[i]

ScheduledRemovalResource[i]=bufFreeTime

returnbufFreeTime

}

3平滑缓冲区填充

基于FirstBitArrial[i],LastBitArrival[i],ScheduledRemoval[i]以及Removal[i],解码器模型可以估计平滑缓冲区填充度Smoothbufferfullness.2-5所示平滑缓冲区填充时间变化0第一个比特到达缓冲区时钟开始计时斜线斜率对应比特平滑缓冲区速度Remval[i]表示DFGi平滑缓冲区实际移除时间对应平滑缓冲区删除i数据并且开始解码i时刻这里注意并不是所有时刻都会新的比特达到缓冲区可能存在一个时间这段时间没有比特进入缓冲区2-5Removal[i]之后一段时间内就没有比特进入缓冲区这段时间对应着编码器没有比特发送时间段编码器缓冲区为空时间

平滑缓冲区比特数

Frame[0]比特数

Frame[0]比特数

2-5语法元素decoder_buffer_delay制定了平滑缓冲区第一个特别到达缓冲区时刻第一个编码帧数据缓冲区移除时刻之间时间间隔所以解码开始时间Removal[0]decoder_buffer_delay决定这里需要注意decoder_buffer_delay所指时间平滑缓冲区可能已经缓存不止1编码2-5decoder_buffer_delay所指定时间段DFG0DFG1都已经到达平滑缓冲区

2.5.4视频解码时间

AV1解码过程平滑缓冲区解码器缓冲区之间操作相互关联具体来说解码器模型控制解码开始时刻以及比特流平滑缓冲区移除时刻这一过程迅速降低平滑缓冲区填充度此外解码器模型负责计算解码过程完成时间解码及时存入解码帧缓冲还决定何时输出显示器并将解码器缓冲移除

AV1第一特点广泛使用ARF,ARF只用作帧间预测参考帧而不是用于显示此外AV1主要档次支持参考帧缩放可扩展编码AV1解码模型适应不同类型解码过程所需要时间支持不同分辨率解码显示速度位了支持ARF不同分辨率AV1解码器模型引入了以下功能

解码时钟周期DecCT显示时钟周期DispCT时不同他们使用相同时间尺度这些时钟同步意味着解码过程显示过程处理视频时间基本一致的。

解码图像并非瞬间完成所需要时间根据图像分辨率以及其他因素有所差异这也意味着解码过程持续时间可能会复杂度编码参数硬件性能因素变化

2-6所示AV1解码过程显示过程展示了GOP长度4金字塔预测编码结构其中矩形表示视频上面数字表示视频显示顺序带着肩头曲线直线表示参考关系2参考帧0ARF1参考帧02.白色矩形表示ARFARF不会显示通常ARF同一时间位置上滤波版本可以提高帧间预测准确性为了ARF时间位置显示一帧编码器可以重新编码一个重叠相比ARF重叠添加高频纹理信息编码过程重叠帧可以使用ARF作为参考帧

解码时间线decoder_buffer_delayinitial_display_delay

显示时间线initial_presentation_delayRemoval[0]->DispCT

2-6AV1解码过程显示过程

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

elseif(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

returnlumaSamples+MaxDecodeRate

}

posted @ 2025-09-01 13:17  yfceshi  阅读(16)  评论(0)    收藏  举报