AV1:帧间预测(一)参考帧管理

​AV1中帧类型


在H.26X系列标准中,根据帧允许的预测模式可以将帧分为I帧、P帧和B帧,根据帧在码流中前后的参考关系又可以分为IRAP、RADL等。AV1也类似地将帧分为4种类型,在码流中用frame_type来标识帧类型。

KEY_FRAME:相当于IDR帧;

INTER_FRAME:相当于265中的P/B帧;

INTRA_ONLY_FRAME:相当于265中的I帧;

SWITCH_FRAME(S-FRAME):当码流在不同分辨率间切换时可以插入S-FRAME来代替部分IDR帧,S-FRAME可以参考不同分辨率的帧;

AV1中帧的显示顺序


由于后向参考的存在使得帧的编码顺序和显示顺序可能不同,在H265中为了按正确的顺序播放视频,使用POC来控制解码后帧的显示。而AV1中没有POC,为了按正确顺序播放帧AV1采用show_frame / showable_frame / show_existing_frame机制来完成这一功能。这三个语法元素都写在frame_header中。

show_frame:当前帧解码完后是否立刻输出。对于解码顺序在播放顺序前的帧该值为0。

showable_frame:这个标志只在show_frame=0时有意义,它是指当前帧是否可以显示。AV1有一个ARNR技术,它会对GPB帧进行一些时域滤波产生ARF帧,ARF帧只用作参考而不显示。

show_existing_frame:输出图像是否已经在DPB中。这个语法元素是为了显示那些延迟输出的图像。

frame_to_show_map_idx:当show_existing_frame=1时输出对应帧。

参考帧管理

AV1中解码后的帧放入DFB(Decoded Frame Buffer)中,其作用类似于265中的DPB。DFB最多只能放8帧,其中7帧可以作为参考帧。AV1为这7个参考帧分别命名,

参考帧名称

含义

LAST_FRAME

POC小于当前帧的图像中最近的帧

LAST2_FRAME

POC小于当前帧的图像中第二接近的帧

LAST3_FRAME

POC小于当前帧的图像中第三接近的帧

GOLDEN_FRAME

POC小于当前帧的I帧或者GPB帧,类似于长期参考帧

BWDREF_FRAME

POC大于当前帧的图像中最接近当前帧的

ALTREF2_FRAME

POC大于当前帧的图像中第二接近当前帧的

ALTREF_FRAME

POC大于当前帧的图像中离当前帧最远的图像

注意,上面参考帧和当前帧的位置关系只是建议不是必须的,例如ALFREF_FRAME的POC可以小于当前帧。

AV1中参考帧管理涉及两个方面,一个是DFB管理,一个是当前帧如何在DFB中找到自己的参考帧。

DFB管理


更新类型Update Type

update type不是编码标准的一部分,它是编码器为了进行码率控制和参考帧管理而引入的,包括KF_UPDATE, LF_UPDATE, GF_UPDATE, ARF_UPDATE, OVERLAY_UPDATE,  INTNL_OVERLAY_UPDATE, INTNL_ARF_UPDATE等7种。frame_update_type在编码前由帧类型和其在GOP中的位置决定。

更新类型

备注

KF_UPDATE

IDR

LF_UPDATE

不被其他帧参考的B帧

ARF_UPDATE

GPB

INTNL_ARF_UPDATE

层级高于GPB帧,低于普通B帧的帧

INTNL_OVERLAY_UPDATE

参考GPB,同时被其他B帧参考的图像的延迟输出帧

OVERYLAY_UPDATE

GPB的延迟输出帧

GF_UPDATE

DFB更新过程

AV1通过语法元素refresh_frame_flags 来管理DFB状态。refresh_frame_flags 是一个8比特数据,每一位对应DFB中的一个位置,某位置1表示当前帧解码后替换DFB中的该帧。

DFB具体更新过程为:

1、每帧图像编码前根据帧类型和其在GOP中的位置决定更新类型frame_update_type。

2、DPB中的帧根据和当前帧的位置关系等被分为三类:arf_stack、lst_stack、gld_stack。每类包含对应类型的参考帧。

1、当前帧编码完后检查DFB是否填满,若未填满则将当前帧加入DFB。若DFB已填满则根据每类帧的数量和类型选择最老的一帧替换掉。并根据该帧在DFB中的位置计算refresh_frame_flags 。

参考列表构建:

DFB构建完毕后当前帧需要使用DFB中的帧构建自己的参考列表,av1规定参考列表只能包含7帧。

  1. DPB中的帧被分为三类:arf_stack、lst_stack、gld_stack。

  2. 确定后向的参考帧,将arf_stack中的POC最大的帧作为ALTREF_FRAME(这一帧一般是当前GOP的GPB);如果alt_stack中还有其他帧,则第0帧作为BWDREF_FRAME,第1帧作为ALTREF2_FRAME。若alf_stack中只有1帧则将其作为BWDREF_FRAME。

  3. 确定前向的参考帧,将lst_stack中的第0帧作为LAST_FRAME,第1帧作为LAST2_FRAME,如果lst_stack中还有帧则将第2帧作为LAST3_FRAME。

  4. 确定GOLDEN_FRAME,将golden_stack中的第0帧作为GOLDEN_FRAME,若golden_stack中还有帧且BWDREF_FRAME或者ALTREF_FRAME或者LAST3_FRAME未被指定,则用第1帧填充。

  5. 从后向前检查所有帧类型是否都已经被指定,如果还有一些帧还没有被指定,那么它分别在arf_ref、last_ref和golden_ref队列中寻找仍然没有被分配的帧,并将它指定为所需要的帧类型。

  6. 如果有些参考帧类型仍然没有被指定,那就将golden_ref中的第0帧指定为该类型的参考帧。

  7. 填充之后所有类型的参考帧都是可用的。编码器会记录下所有类型的参考帧在DPB中的位置,并把结果写入码流。这样解码器拿到DFB之后立刻就可以组合出参考帧队列。

  8. 这些参考帧类型有可能会有重复。在实际编码时需要进行去重,避免重复搜索。

参考列表如何在码流中传输?构建完参考列表后需要在码流中写入每个参考帧对应在DFB中的位置,相关语法元素为ref_frame_idx

i:0-6,0表示LAST_FRAME,1表示LAST2_FRAME,2表示LAST3_FRAME,3表示GOLDEN_FRAME,4表示BWDREF_FRAME,5表示ALTREF2_FRAME,6表示ALTREF_FRAME。那ref_frame_idx[LAST_FRAME]=5 就表示DPB 下标为5的位置上存在的帧(ref_frame_map[5])就是当前帧的LAST_FRAME。

ref_frame_idx的值有2种传输方式,当frame_refs_short_signaling=0的时候,所有的参考值都是显示传递的,也就是直接通过码流读取到的,当frame_refs_short_signaling=1的时候,只有last_frame_idx和gold_fame_idx是显示传递的,其他参考值则是通过计算得到的。

 ARF参考帧和overlay帧


ARF(Alternate Reference Frame)帧是一类特殊参考帧,它会被编码并在DFB中存储用于其他帧的帧间预测参考,但是不会在解码端显示。它对应的showable_frame语法元素值为0。

ARF帧往往是对原始帧们进行时域滤波处理,以降低原始帧里的噪声而得到的帧,用它作为参考帧可以提高视频编码的性能。

上图是含有ARF的AV1编码结构,这里的GOP大小4,灰色框表示的是需要显示的帧,ARF不需要显示用白色表示。

从上图可以看出,每一帧在显示之前需要完成解码,且ARF帧的解码顺序很靠前。这是因为通常ARF帧是时域滤波处理得到的,而时域滤波处理一般只对低layer的帧进行,这也意味着,在一个GOP里面并不是谁都可以成为ARF帧。

因为ARF帧解码后不显示,这会导致编码器送入的帧会比播放端的帧多,这时就需要overlay帧和ARF帧配合使用,这个Overlay它会以(相同帧号的)ARF作为参考帧进行预测编码得到压缩码流,当在解码端解码以后,可以显示它的画面,而且它自身不会被用来作参考帧。

感兴趣的请关注微信公众号Video Coding

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/29729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTB Editorial

Editorial User Nmap ┌──(kali㉿kali)-[~/…/machine/SeasonV/linux/Editorial] └─$ nmap -A 10.129.24.67 -T 4 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-16 21:54 EDT Nmap scan report for 10.129.2…

C#使用轻量级深度学习模型进行车牌颜色识别和车牌号识别

看到这个文章时候请注意这个不涉及到车牌检测,这个仅仅是车牌颜色和车牌号识别,如果想涉及到车牌检测可以参考这个博客:[C#]winform部署yolov7CRNN实现车牌颜色识别车牌号检测识别_c# yolo 车牌识别-CSDN博客 【训练源码】 https://github.…

DBeaver windows下载、安装与连接数据库

下载 官网下载地址:https://dbeaver.io/download/ 安装 1、双击安装 2、下一步…… 选择所有用户 3、组件选择 配置连接数据库 下载驱动

【记录44】【案例】echarts地图

效果&#xff1a;直接上效果图 环境&#xff1a;vue、echarts4.1.0 源码 // 创建容器 <template><div id"center"></div> </template>//设置容器大小&#xff0c;#center { width: 100%; height: 60vh; }这里需注意&#xff1a;笔者在echar…

Git的下载安装及可视化工具小乌龟

一、 Git 的下载 第1步&#xff1a;下载Git&#xff0c;下载地址&#xff1a;Git for Windows 这个就需要去 Git 官网下载对应系统的软件了&#xff0c;下载地址为 git-scm.com或者gitforwindows.org&#xff0c;或者阿里镜像&#xff08;感谢评论区的星悸迷航同学&#…

亚马逊收购 MX Player

不知道你在安卓手机上用什么视频播放器&#xff0c;个人看最强大的就是MX Player&#xff08;支持快进、倍速、睡眠定时、自定义解码器、AB段重复等&#xff0c;学英语十分强大&#xff09;。 MX Player 最初是韩国的视频播放软件和OTT服务平台&#xff0c;于2011年推出&#…

什么是云恶意软件攻击,如何进行有效的防护

一切都在向云转移。云端数据越多&#xff0c;恶意攻击者攻击云平台的兴趣就越大。 攻击者使用恶意软件窃取数据并破坏服务。虽然恶意软件在云端可能不像在个人电脑上那么普遍&#xff0c;但大行其道的云恶意软件令人担忧。此外&#xff0c;组织不像您预料的那样意识到这点。 …

鸿蒙开发网络管理:【@ohos.request (上传下载)】

上传下载 说明&#xff1a; 本模块首批接口从API version 6开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import request from ohos.request;限制与约束 默认支持https&#xff0c;如果要支持http&#xff0c;需要在config.json里…

所以spring mvc异常处理工作原理是啥

文章目录 spring mvc异常处理&#xff08;源码分析&#xff09;概述原理&#xff08;源码角度&#xff09;模拟debug前期提要分析4个map4个map的初始化为什么需要基于mappedMethods缓存 总结一下 spring mvc异常处理&#xff08;源码分析&#xff09; 概述 spring mvc有下面三…

力扣每日一题 6/18 字符串/模拟

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 2288.价格减免 【中等】 题目&#xff1a; 句子 是由若干个单词组成的字符…

‘引爆增长·赋能十堰’第一届学习峰会在十堰东方汉宫国际酒店成功举办

‘引爆增长赋能十堰’第一届学习峰会在十堰东方汉宫国际酒店成功举办 2024年6月 17 至18 日&#xff0c;为期两天的“引爆增长赋能十堰”第一届学习交流峰会在湖北十堰东方汉宫国际酒店一号盛大举行&#xff0c;学习峰会现场&#xff0c;来自十堰地区及邻边地市的上百位实体企业…

netty服务端与客户端的启动流程

如图所示&#xff0c;右侧是服务端Server&#xff0c;左侧是客户端Client 要点说明&#xff1a; 1.在Server中&#xff0c;在NioEventLoopGroup()中&#xff0c;会有1个selector和线程在不断循环&#xff0c;等待是否有accept事件&#xff0c;在accept事件发生后&#xff0c;才…

四款让人大开眼界的高质量软件,个个实力超群,使用起来爱不释手

电脑里的Windows软件&#xff0c;简直多得数不清&#xff0c;啥都有。 像那个电子表格、写文章的、玩游戏聊天的、还有修图的&#xff0c;这些都太常见了&#xff0c;它们确实给咱们生活带来方便&#xff0c;但有时候也会让那些不太懂电脑的小伙伴们头疼不已。 讲真&#xff0…

重学java 73.设计模式

本想送你一本沉思录&#xff0c;可该迷途知返的人是我 —— 24.6.18 设计模式 设计模式(Design pattern)&#xff0c;是一套被反复使用、经过分类编目的、代码设计经验的总结&#xff0c;使用设计模式是为了可重用代码、保证代码可靠性、程序的重用性,稳定性。 1995 年&#x…

全网最全 Kimi 使用手册,看完 Kimi 效率提升 80%

在当前AI文字大模型领域&#xff0c;ChatGPT4.0无疑是最强大。然而&#xff0c;最近最火爆的大模型非国产Kimi莫属。 相较于其它大模型&#xff0c;Kimi 最大的优势在于&#xff0c;超长文本输入&#xff0c;支持200万汉字&#xff0c;是全球范围内罕见的超长文本处理工具&…

在Linux系统中安装凸语言

凸语言在2023国产编程语言蓝皮书中的介绍如下&#xff1a; 凸语言gitee页面&#xff1a;凸语言: tu-lang 是一种动态类型编译型的通用编程语言, 已实现自举 (gitee.com) 使用git克隆源码&#xff1a; git clone https://github.com/tu-lang/tu.git 安装凸语言环境&#xff1a…

qt使用信号槽时,一直提示无法解析的外部符号

今天写了个信号槽时&#xff0c;粗心大意在发信号的类的头文件中忘记加上Q_OBJECT&#xff0c;导致一直出现无法解析的外部符号&#xff0c; 信号没有在类声明中使用 Q_OBJECT 宏。这个宏是必需的&#xff0c;因为它告诉 Qt 的元对象编译器&#xff08;moc&#xff09;需要处理…

文件系统崩溃一致性、方法、原理与局限

前言 先提几个问题&#xff1a;什么是文件系统崩溃一致性&#xff1f;为什么会出现文件系统崩溃一致性问题&#xff1f;有哪些方法可以解这个问题&#xff1f;它们各自又有哪些局限性&#xff1f; window系统电脑异常后会蓝屏、手机死机卡顿后我们会手动给它重启&#xff0c;大…

Kotlin 中,data class 和普通 class

data class 自动生成常用方法&#xff1a; data class 会自动生成 equals(), hashCode(), toString(), copy() 方法和 componentN() 函数。这些方法在数据类中非常有用&#xff0c;简化了代码。 主要用于存储数据&#xff1a; data class 主要用于存储数据&#xff0c;即它们通…

自动抓取服务器功耗

以下脚本为linux系统内通过ipmitool工具自动抓取服务器当前功耗&#xff0c;每隔5分钟抓取一次&#xff0c;累计抓取20次 脚本如下&#xff1a; #!/bin/bashcurrent_dirpwd node_list${current_dir}/nodelistbmc #BMC IP usernameAdministrator #BMC用…