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

news2024/10/6 8:24:55

​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.coloradmin.cn/o/1836775.html

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

相关文章

软件设计不是CRUD(22):在流式数据处理系统中进行业务抽象落地——设计思考

(接上文《软件设计不是CRUD(21):在流式数据处理系统中进行业务抽象落地——需求分析》) 那么思考到这里我们就能做一些关于设计思路的总结: 每一个独立的数据处理流,就是数据采集系统中的一个功能。这个功能具备一个静态的控制逻辑(当然控制逻辑也可以是动态的,本文不…

适配不同数据库厂商方案

背景 在对国产化数据有要求的时候,我们会做对 达梦、海量等数据库的配置。 有些SQL 以前没有写成标准SQL; 那么适配的时候怎么办呢?改成标准SQL。 如果不好改呢?比如SQL比较复杂等,需要判断 当前是哪个厂商的数据库…

MS1004激光测距用高精度时间测量(TDC)电路

品简述 MS1004 是一款高精度时间测量 (TDC) 电路,对比 MS1002 具 有更高的精度和更小的封装,适合于高精度小封装的应用领域。 MS1004 具有双通道、多脉冲的采样能力、高速 SPI 通讯、 多种测量模式,适合于激光雷达和激光测距。 主…

使用 swiper 轮播 echarts 图表,地图点击失效

问题 使用 swiper 轮播 echarts 图表&#xff0c;地图点击失效&#xff0c;伪代码如下 <Swiper><SwiperSlide>...</SwiperSlide>// 轮播中有地图<SwiperSlide><EchartsMap/></SwiperSlide><SwiperSlide>...</SwiperSlide> &…

洁盟超声波清洗机怎么样?2024爆款机型声波清洗机测评、一篇看懂

随着现在近视率的逐年上升&#xff0c;戴眼镜的人群越来越多&#xff01;当然他们也在面临着一个眼镜清洗的问题&#xff01;因为长期佩戴眼镜&#xff0c;镜框还有镜片上面都是会积累灰尘、油污、污垢以及细菌&#xff0c;脏脏的不仅令眼镜不美观&#xff0c;同时在长期的佩戴…

go 语言爬虫库goQuery 的详细使用(知乎日报详情页解析示例)

上一篇《uniapp小程序开发 | 从零实现一款影视类app 》实现了影视小程序的前端和后台接口&#xff0c;虽然包含了大多数小程序应有的知识&#xff0c;但基本还只是涉及网络接口和vue页面的设计。这里介绍下零一个有趣的练手项目&#xff0c;知乎日报。涉及详情页面的html解析&a…

MYSQL无法启动的修复过程

记录一次MySQ无法启动的修复过程。 1. 错误表现 今天在用python操作数据库时可能有些错误&#xff08;具体来说就是我尝试创建了一个已经存在的database&#xff09;&#xff0c;结果我发现MySQL中的那个database不存在了&#xff0c;我重启了一下电脑&#xff0c;结果mysql…

移植案例与原理 - build lite配置目录全梳理

命令行工具hb(HarmonyOS|OpenHarmony Build 编译构建系统的缩写)都很熟悉了。这是一个基于gn和ninja的构建系统&#xff0c;以支持OpenHarmony组件化开发为目标&#xff0c;提供以下基本功能&#xff1a; 支持按组件拼装产品并编译。 独立构建芯片解决方案厂商源码。 独立构建…

【AI基础】租用云GPU之autoDL部署大模型ollama+llama3

在这个显卡昂贵的年代&#xff0c;很多想要尝试一下AI的人可能都止步于第一步。这个时候我们可以租用在线的GPU资源来使用AI。autoDL就是这样的一个云平台。 一、创建服务器 1.1 注册账号 官网&#xff1a;https://www.autodl.com/ | 租GPU就上AutoDL 帮助文档&#xff1a;…

6月18日(周二)A股行总结:A股震荡收涨,车路云概念全日强势,10年、30年国债期货齐创新高

车路云概念股发力上涨&#xff0c;中海达、华铭智能等多股20CM涨停。半导体板块走强&#xff0c;中芯国际港股上涨近&#xff13;% 。白酒板块下跌&#xff0c;贵州茅台跌1.3% 。30年期及10年期国债期货主力合约均创上市以来新高。 周二&#xff0c;A股全日窄幅震荡 沪指收涨0…

项目3:从0开始的RPC框架(扩展版)-2

六. 自定义协议 1. 需求分析 在目前的RPC框架中&#xff0c;采用Vert.x的HttpServer作为服务提供者的Web服务器&#xff0c;底层使用HTTP协议进行网络传输。但HTTP协议只是RPC框架网络传输的一种可选方式&#xff0c;还有其它更好的选择。 RPC框架注重性能&#xff0c;但HTT…

SpringBoot配置第三方专业缓存框架j2cache

j2cache的使用 这不是一个缓存 这是一个缓存框架 J2Cache, 也称为Java Cache或JSR-107&#xff0c;是一个用于缓存管理的标准API&#xff0c;它允许开发者在Java应用程序中实现分布式、基于内存的缓存。J2Cache主要通过javax.cache.Cache接口提供功能&#xff0c;用于存储和…

利用C#和Snap7工具模拟S7通信(包含DB地址讲解)

之前写过一篇用KepServerEx做模拟S7的通信数据&#xff0c;参考链接&#xff1a; 通过C#和KepServer完成模拟S7协议通信_c# 与kepserver-CSDN博客 但KepServerEx是收费的&#xff0c;而且模拟的DB块超过64就不行了&#xff0c;当然Snap7在本文中也是只能模拟DB1、DB2和DB3的数…

npm发布自己的插件包:新手教程

npm&#xff08;Node Package Manager&#xff09;是Node.js的包管理工具&#xff0c;广泛用于JavaScript项目中。本文将为你介绍如何从零开始发布一个npm插件包。 前提条件 在开始之前&#xff0c;你需要确保以下几点&#xff1a; 安装Node.js和npm&#xff1a;你可以在No…

python库离线安装方法(pyqt5离线安装方法)

在某些情况下&#xff0c;我们的计算机是无法联网的。 网上大部分方法&#xff1a; 这些方法都有个问题&#xff0c;就是库是需要依赖其它库的&#xff0c;你不知道它需要依赖什么库&#xff0c;就是提供了依赖库的列表也麻烦&#xff0c;依赖库也是有对应版本要求的&#xf…

NVIDIA新模型Nemotron-4:98%的训练数据是合成生成的,你敢信?

获取本文论文原文PDF&#xff0c;请公众号 AI论文解读 留言&#xff1a;论文解读 标题&#xff1a;Nemotron-4 340B Technical Report 模型概述&#xff1a;Nemotron-4 340B系列模型的基本构成 Nemotron-4 340B系列模型包括三个主要版本&#xff1a;Nemotron-4-340B-Base、…

zookeeper学习、配置文件参数详解

zookeeper学习、配置文件参数详解 zookeeper 配置文件参数详解tickTime 、session 的过期时间、maxSessionTimeout 三者之间的关系initLimit&#xff0c;syncLimit什么区别minSessionTimeout 默认值,**他的单位是ms** zookeeper 配置文件参数详解 ZooKeeper 是一个分布式协调服…

字节豆包大模型API吞吐、函数调用能力、长上下文能力测试总结

离开模型能力谈API价格都是耍流氓&#xff0c;豆包大模型作为API最便宜的模型之一&#xff0c;最近向个人开发者开放了&#xff0c;花了300元和一些时间对模型的API吞吐、函数调用能力、长上下文能力等进行了深度测试&#xff0c;看看它的能力究竟适合做 AI 应用开发吗&#xf…

Study--Oracle-03-数据库常规操作

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人。 一、oracle 版本及主要功能 二、数据安装完成后常用操作SQL 1、检查数据库监听状态 监听的常用命令 启动&#xff1a;[oracleoracle u01]$ lsnrctl stop 停止&am…

【车载音视频AI电脑】全国产海事船载视频监控系统解决方案

海事船载视频监控系统解决方案针对我国快速发展的内河航运、沿海航运和远洋航运中存在的航行安全和航运监管难题&#xff0c;为船舶运营方、政府监管部门提供一套集视频采集、存储、回放调阅为一体的视频监控系统&#xff0c;对中大型船舶运行中的内部重要部位情况和外部环境进…