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

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 = 70000low_delay_mode_flag = 0,解码过程调用函数time_next_buffer_is_free计算DFG iRemoval[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]

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

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-5Removal[i]之后一段时间内就没有比特进入缓冲区这段时间对应着编码器没有比特发送时间段编码器缓冲区为空时间

平滑缓冲区比特数

Frame [0]比特数

Frame[0]比特数

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

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_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

}

http://www.dtcms.com/a/358715.html

相关文章:

  • DC-HRNet
  • SQL学习记录
  • 键查跑分、比配置的手机性能排行
  • ThingsBoard使用Vue3实现
  • nacos 2.5.1 心跳源码解析
  • MCP进阶指南:如何挑选最适合你的AI助手“装备“
  • 计算机毕业设计 java 在线学习系统 基于 Java 的在线教育平台 Java 开发的学习管理系统
  • Fourier 级数展开(案例:级数展开 AND 求和)
  • 仓颉编程语言青少年基础教程:程序基本结构和语言特点
  • Day31 进程间通信(IPC)多线程目录扫描
  • mysql(自写)
  • 谈物质的运动与运动的物质
  • 基于立创・庐山派 K230CanMV 开发板的视觉引导舵机追踪系统技术分析
  • kafka(自写)
  • 【MYSQL】GET_LOCK使用方法简单解析
  • C++_静态多态、运行多态和模板多态
  • 下一代 AI 交互革命:自然语言对话之外,“意念控制” 离商用还有多远?
  • AWD相关知识
  • Scikit-learn Python机器学习 - 数据集介绍
  • 矿物类型分类实战:从数据预处理到多模型对比
  • 幻觉与模仿:深入剖析当前大语言模型为何未能跨越“理解”与“推理”的鸿沟
  • TuringComplete游戏攻略(2.1算数运算)
  • 基础的汇编指令
  • 如何快速了解项目管理基础
  • 【机器学习入门】4.1 聚类简介——从“物以类聚”看懂无监督分组的核心逻辑
  • destoon8.0使用post插入keyword热搜到表
  • 深入理解shared_ptr与循环引用问题
  • 超越传统SEO:用生成引擎优化(GEO)驱动下一轮增长
  • 【蓝桥杯 2024 省 Python B】缴纳过路费
  • Markdown 文件编辑基础教程