AVS2解码图像管理

article/2025/8/28 10:42:06

前言

对于解码器来说,解码得到的重建图像可能需要参与参考帧选择过程和输出排序过程。硬件解码器大概率不会将解码图像的相关操作硬件化,从而将此部分内容保留在软件端实现。
驱动工程师需要明确解码图像的管理逻辑,才能开发出硬件解码器的驱动程序。
AVS2的解码图像管理与H264、H265、AV1等编码标准有相似之处,也有不同之处。AVS2依然有输出排序、参考队列构建、图像的标记与输出、图像缓存区的移入移出等操作,但具体实现方式略有不同。

图像类型

与H264一样,AVS2的解码图像可以是一帧,也可以是一场。除了传统的I、P、B图像外,另外还新增了F、G、GB、S图像。F图像在此文章中介绍的过程中与P帧并无差别,可以看成是P图像;G和GB图像与I图像有所差别,会影响图像的标记与输出过程和缓存区的移入移出过程,因此需要注意。S图像的参考帧只有一帧,要么G图像要么GB图像,S图像的参考队列构建也与其他图像不同。

参考模式

AVS2有三种典型的参考模式:GOP=4有两种,GOP=8有一种。与H264不同的是B帧也可以被参考,具体参考模式如下图:
参考模式
此图是从官网截图来的,详情请看:AVS2官网
图中的参考关系不包含场景图像,可以看到每个B帧的参考帧的个数都是两个,但参考关系不相同,这直接导致图像标记与输出过程和参考队列构建的差异。

显示顺序号和解码顺序号

一个解码图像同时拥有显示顺序号和解码顺序号,AVS2中叫解码顺序索引(DOI)和显示顺序索引(POI)。这两个顺序号的关系由两个重要变量维系:

  • 图像输出延时(PictureOutputDelay,简写POD)。
  • 输出重排延时(OutputReorderDelay,简写ORD)。

为了传输节省bit,码流只传DOI,POI由COI、POD和ORD计算而来。计算公式:POI=DOI+POD-ORD,下图是一个实际片源的前0-8帧的DOI、POD、ORD、POI的值:
图像DOI
POI会直接影响解码图像的标记过程与输出过程。

图像标记值

图像的标记值可以控制缓存队列的移入和移出过程,也可以控制图像输出过程。
对于输出过程,图像起码要有一个“未输出”标志,表示我已经解码完成,等待显示,还要一个“已输出”标志,表示已经被显示。
对于参考队列构建过程,这个图像会被其他图像参考,就要有一个“被参考”标志,我们需要从这些被标记为“被参考”的图像中构建参考队列,当这个图像不需要被参考了,就需要一个“不被参考”标志来标识。

图像缓存区移入图像

AVS2将图像缓存区分为两部分:参考图像缓存区和场景图像缓存区,上面介绍的G和GB帧就会被放入场景图像缓存区中,这两个缓存区的图像都是参考图像队列构建的来源。
先不讨论场景图像,图像移入缓存区要解决两个问题:

  • 要被后面图像参考的图像需要缓存起来,由于一个GOP中根据参考关系解码顺序是严格控制的,所以可以等效为被参考的图像需要缓存起来,如DOI=0的图像,虽然要立刻显示,但是由于被参考,还是需要缓存起来。
  • 不被参考的图像如果在某参考图像后显示,也要缓存起来,因为你无法保证图像显示的速度,所以你只能缓存起来保证显示顺序。如上图,如果刚好已经显示到了DOI=3的这帧,那么解码到DOI=5的这帧时,是不用缓存的,可以立刻拿去显示,但如果此时正在显示DOI=4这帧,你必须将它缓存起来。

解决第一问题,使用变量RefByOthers可以搞定;解决第二个问题,POD可以搞定。
操作如下:

  • 如果 RefByOthers等于 1 或 POD大于 0,则将其移入参考图像缓冲区。因为RefByOthers不等于1并且POD等于0的情况,表示这个帧刚好是输出过程和解码过程同步的帧,需要立刻输出,如DOI=4的帧,在它之前解码的帧都需要在这帧之后输出,输出过程再快也需要等待这帧解码出来,而一旦解码到这个帧,显示过程就应该立刻输出。
  • 如果 RefByOthers等于 1,则将其标记为“被参考”图像。
  • 如果 POD大于 0,则将其标记为“未输出”图像。

现在我们考虑场景图像的情况:

  • 如果是S帧,也要用上面的普通操作来判断,虽然不需要被参考,但也要考虑输出顺序是不是在某参考帧之后的问题。
  • 如果是GB帧,则直接移入场景图像缓存区。
  • 如果是G帧,则先移入场景图像缓存区,再进行上面普通的判断过程。

参考队列的构建

其实很简单,给每帧图像附带一个数组,这个数组包含了所需要的参考图像索引值即可,并告附上这个数组的大小,即参考帧个数PicRefNum。如DOI=2的帧,它参考的图像是DOI=0和DOI=1这两帧,这样这个数组就可以是RefArray[PicRefNum]={0,1}。但是这是绝对索引,很耗bit。于是我们就使用相对索引,0=2-2,1=2-1,进而RefArray[PicRefNum]= {2,1}。这个数组里的值我们叫DeltaDoiOfRefPic(DDORP)。
这样我们在上图中加上图像的RefArray和PicRefNum:
RefArray
上面说过每个B帧的参考帧都是它前后最近的帧,而且参考关系以GOP为单位,你会发现AVS2的这个设计又可以节省一部分bit,你只需要传送一个二维数组RCSArray[RcsNum][PicRefNum],这个数组包含了上面讲到的RefArray,这样你就可以根据这个RCSArray的一维索引值找到这个RefArray。下一个GOP的RefArray与前面的是一样的,所以我们只需要在一段序列的序列头传一个RCSArray数组,每个图像的图像头传一个RCSArray的一维索引RCSIndex即可,相当节省bit。这里的RCS也就是标准中的ReferenceConfigurationSet。
这样我们就得到一个RCS表和修改后的0-8帧的相关数据。

  • RCS:RCS
    其中RemoveNum和RemoveArray用于移出图像缓存区,后面介绍。

  • 优化后0-8帧图像相关数据:0-8帧数据
    fault表示该图像不需要RCS,-1表示他的RCS的数据不再RCS数组中,在图像头中获取。这提供了图像可以动态修改它的参考关系的机制。

  • 考虑场景图像的情况:
    如果当前帧是S帧,其参考图像只有1帧,即场景图像缓存区的图像作为参考帧。
    如果当前帧是P或F帧,且场景图像使能的情况下,则将参考图像队列 RefPicNum-1 位置的图像替换为场景图像缓冲区中的图像。

标记过程

前面讲到参考图像移入图像缓存区时,已经有参考图像标记“被参考”和"未输出"的过程,这里要讲到的是图像不被参考时标记为“不被参考“的过程。
和参考队列构建过程一样的推理,要标记为“不被参考”的图像相对索引被保存在RCS中,所以只需要根据RCSIndex找到对应的RemoveArray和RemoveNum,使用DOI-RemoveArra[i]即可得到要标记的图像索引,其中0<=i<RemoveNum。

图像输出过程

在参考图像缓存区找到POI最小的“未输出“的图像,或者 POD=0(之前说个这个帧是同步帧,不需要缓存并立刻输出)的图像并输出,然后将其标记为”已输出”。

图像缓存区移出图像

在参考图像缓存区找到“不被参考“且”已输出”图像,移出参考图像缓存区。
如果当前帧是G或GB图像,则移出场景图像缓存区的图像。

总结

AVS2的参考帧管理还是很巧妙的,和H265的参考帧管理差不多,比H264的滑动窗标记和MMCO标记过程简单很多,降低代码复杂度,也节省了bit,确实不错。
但是!!!最近看了AV1的参考帧管理,那叫一个巧妙,预知后事如何,请听下回分解。


http://chatgpt.dhexx.cn/article/91rvQqYo.shtml

相关文章

AVS2技术概述

转自公众号“智媒之音”&#xff1a;https://mp.weixin.qq.com/s?__bizMzI5Nzc4OTkxOQ&mid2247483715&idx1&snbb28272fd9b2baad9d4cccbe7c8ddcea&chksmecaef1f3dbd978e56764beb9d8ac69c753f3635716e9c449362f34f3c9e738870b1ffa00df4e#rd AVS2采用了传统的混…

【金三银四】设计模式面试题(2021最新版)

目录 前言 1.什么是设计模式 2.为什么要学习设计模式 3.设计模式分类 4.设计模式的六大原则 5.单例模式 5.1 什么是单例 5.2 哪些地方用到了单例模式 5.3 单例优缺点 5.4 单例模式使用注意事项&#xff1a; 5.5 单例防止反射漏洞攻击 5.6 如何选择单例创建方式 5.…

【Java架构师面试题】设计模式面试专题(共35题含答案)

设计模式&#xff08;DesignPattern&#xff09;是前辈们对代码开发经验的总结&#xff0c;是解决特定问题的一系列套路。它不是语法规定&#xff0c;而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。 本篇为设计模式面试专题&#xff0c;总共收…

一文整理总结常见Java后端面试题系列——设计模式篇(2022最新版)

关于作者 &#x1f436; 程序猿周周 ⌨️ 短视频小厂BUG攻城狮 &#x1f93a; 如果文章对你有帮助&#xff0c;记得关注、点赞、收藏&#xff0c;一键三连哦&#xff0c;你的支持将成为我最大的动力 本文是《后端面试小册子》系列的第 1️⃣2️⃣ 篇文章&#xff0c;该系列将整…

C++面试题之设计模式及设计原则

六大设计原则 1&#xff09;单一职责原则 类的职责单一&#xff0c;对外提供一个功能&#xff0c;函数也支持&#xff1b; 2&#xff09;里氏替换原则 任何抽象类的出现都可以用他的实现类进行替换。 3&#xff09;依赖倒置原则 依赖于抽象&#xff0c;不要依赖具体实现&#…

23种设计模式(常见面试题)

23种设计模式&#xff08;常见面试题&#xff09; 1.什么是设计模式&#xff1f; 答&#xff1a; 设计模式&#xff08;Design Pattern&#xff09;是前辈们对代码开发经验的总结&#xff0c;是解决特定问题的一系列套路。是一套用来提高代码可复用性、可维护性、可读性、稳健…

设计模式面试题(总结最全面的面试题!!!)

文章目录 设计模式什么是设计模式为什么要学习设计模式设计模式分类设计模式的六大原则开放封闭原则&#xff08;Open Close Principle&#xff09;里氏代换原则&#xff08;Liskov Substitution Principle&#xff09;依赖倒转原则&#xff08;Dependence Inversion Principle…

【2022最新Java面试宝典】—— 设计模式面试题(14道含答案)

目录 1.什么是设计模式2.为什么要学习设计模式3.设计模式分类4.设计模式的六大原则5.单例模式1.什么是单例2.那些地方用到了单例模式3.单例优缺点4.单例模式使用注意事项&#xff1a;5.单例防止反射漏洞攻击6.如何选择单例创建方式7.单例创建方式 6.工厂模式1.什么是工厂模式2.…

java高频面试题-设计模式

1 你所知道的设计模式有哪些&#xff1f; Java 中一般认为有 23 种设计模式&#xff0c;我们不需要所有的都会&#xff0c;但是其中常用的几种设计模式应该去掌握。下面列出了所有的设计模式。需要掌握的设计模式我单独列出来了&#xff0c;当然能掌握的越多越好。 总体来说设…

Java常见设计模式面试题及答案

文章目录 1.设计模式是什么&#xff1f;你是否在代码中使用过&#xff1f;2. JDK 中常用的设计模式有哪些&#xff1f;3.单例模式是什么&#xff1f;请用 Java 写出线程安全的单例模式4.在 Java 中&#xff0c;什么叫观察者模式&#xff08;observer design pattern&#xff09…

JAVA常见设计模式面试题

一、单例模式 java中单例模式是一种常见的设计模式&#xff0c;单例模式的写法有好几种&#xff0c;这里主要介绍三种&#xff1a;懒汉式单例、饿汉式单例、双重检查锁定 1.单例模式有以下特点&#xff1a;   a、单例类只能有一个实例。   b、单例类必须自己创建自己的唯一…

设计模式面试题

设计模式 详解 设计模式 参考&#xff1a; https://www.jianshu.com/p/fc4b2e679a1e 单例模式 整个应用中保证只有一个类的实例存在 参考&#xff1a; https://mp.weixin.qq.com/s/dlVXW6aW4wLcLpey9NxPig 饿汉式单例类 懒汉式单例类 instance new SingletonClas…

设计模式面试题(设计模式速成版)

文章目录 说明名词解释UML基础面向对象编程中&#xff0c;都有哪些设计原则开闭原则里氏替换原则&#xff08;Liskov Substitution Principle&#xff09;依赖转置&#xff08;依赖倒置&#xff09;原则单一职责原则接口隔离原则迪米特法则合成复用原则 设计模式的分类创建型模…

【前端面试题】06—16道设计模式面试题(附答案)

设计模式不是针对某个框架的&#xff0c;而是针对某类问题或某类需求提出的&#xff0c;因此有广泛的适用性。 我们学习设计模式不仅要学习理论&#xff0c;还要学习如何解决实际工作中的问题&#xff0c;所以在面试中&#xff0c;设计模式通常是结合某类需求考察的。 1、什么是…

❤️设计模式肝完了,还挺全!腾讯和阿里的offer已拿!❤️

设计模式肝完了&#xff0c;还挺全&#xff01;腾讯和阿里的offer已拿&#xff01; 金九银十已经来了&#xff0c;挺近大厂最好的机会已经来了&#xff01;如果你是要找工作的&#xff0c;一定要抓住这个机会&#xff01; 前面已经整理了很多的面试资料&#xff1a; 1&#x…

「面试必背」设计模式面试题(收藏)

前言 设计模式在日常的工作中&#xff0c;是非常重要的一项技能&#xff0c;使用设计模式可以重构整体架构代码、提交代码复用性、扩展性、减少代码冗余问题。这是每个 Java 工程师必备的技能&#xff01;今日小编主要讲的是设计模式之一的策略模式&#xff0c;小编会通过案例…

textRank杂谈

转自&#xff1a;这些文章 1. PageRank算法概述 PageRank,即网页排名&#xff0c;又称网页级别、Google左侧排名或佩奇排名。 是Google创始人拉里佩奇和谢尔盖布林于1997年构建早期的搜索系统原型时提出的链接分析算法&#xff0c;自从Google在商业上获得空前的成功后&#xff…

人工智能自然语言处理—PageRank算法和TextRank算法详解

人工智能自然语言处理—PageRank算法和TextRank算法详解 一、PageRank算法 PageRank算法最初被用作互联网页面重要性的计算方法。它由佩奇和布林于1996年提出&#xff0c;并被用于谷歌搜索引擎的页面排名。事实上&#xff0c;PageRank可以在任何有向图上定义&#xff0c;然后…

TextRank算法学习及使用

文章目录 一、算法思想二、python代码实现三、TextRank算法使用1、textrank4zh模块的安装2、实例介绍 总结 参考资料&#xff1a; 文本关键词抽取、文本摘要生成是自然语言处理&#xff08;NLP&#xff09;的应用之一&#xff0c;一定会对我们的生活产生巨大影响。随着数字媒体…

自然语言处理NLP--TextRank算法

文本摘要方法 早在20世纪50年代&#xff0c;自动文本摘要已经吸引了人们的关注。在20世纪50年代后期&#xff0c;Hans Peter Luhn发表了一篇名为《The automatic creation of literature abstract》的研究论文&#xff0c;它利用词频和词组频率等特征从文本中提取重要句子&…