H264参考帧列表管理

P/SP/B帧的参考帧列表的初始化

参考H.264标准文档的8.2.4.2章节,暂不研究场编码。在初始化P/SP帧或B帧的参考帧列表过程中,DPB中至少要存在一个有效的、即被标记为“用于短期或长期参考”的参考帧。

P/SP Slice 参考帧列表初始化

P/SP Slice参考帧列表初始化在[1]的8.2.4.2.1章节定义,仅有前向参考,只有List0。初始化依据如下原则:

  • 短期参考帧在前,长期参考帧在后
  • 短期参考帧按照PicNum由大到小排序,即短期参考帧按照距离当前帧由近至远的顺序排序。
  • 长期参考帧按照PicNum由小到大顺序,即长期参考帧按照距离按当前帧由远至近的顺序排序。

如短期参考帧的PicNum分别为300,302,303;长期参考帧的PicNum为0和3,在refList0分别为:

RefList0 [0] = 303

RefList0 [1] = 302

RefList0 [2] = 300

RefList0 [3] = 0

RefList0 [4] = 3

B Slice参考帧列表初始化

B Slice存在两个参考帧列表,RefList[0]和RefList[1]。协议中并没有规定List0中存放的一定是前向参考帧,List1中存放的一定是后向参考帧。但是习惯上一般List0存放的是前向参考帧,List1中存放的是后向参考帧。在[1]8.2.4.2.3章节有介绍,初始化按照如下原则:

  • RefList[0]和P/SP Slice的RefList[0]完全一样,这里不在赘述、
  • RefList[1]是短期参考帧在前,长期参考帧在后,且短期参考帧按照picNum的升序排列,长期参考帧按照picNum的升序排列。

为何RefList[1]个人猜测是因为RefList[1]一般存放的是后向参考帧,所以对短期参考帧来说,仍然是按照距离当前帧由进到远排序,长期参考帧是按照由近到远排序。这样也是为了便于找到在参考帧列表中的短期参考帧和长期参考帧的界限。

RefList0RefList1队列长度分别为num_ref_idx_l0_active_minus1 + 1和num_ref_idx_l1_active_minus1 + 1。短期参考帧是按降序排列,长期参考帧是按升序排列,且按照先STR后LTR的顺序。

如果参考队列中的元素个数大于参考队列的长度,则删除下标为num_ref_idx_l0_active_minus1后的元素;如果参考队列中的元素个数小于参考队列的长度,多余的元素标记为非参考帧。

如果RefList0和RefList1完全一样,且里面有大于1个元素,则需要把RefList1中的RefList1[0]RefList1[1]交换位置,这么做的目的是防止RefList0和RefList1完全一致。

Modification process for reference list

[1]8.2.4.3章节中是对参考帧队列的重排序,当ref_pic_list_modification_flag_l0为1时表示需要对RefList0进行重排序;当ref_pic_list_modification_flag_l1为1时表示需要对RefList1进行重排序。

解析码流中的modification_of_pic_nums_idc字段来执行相应的命令,modification_of_pic_nums_idc所代表的含义如图1所示,参考帧列表重排序分为两种情况,短期参考帧重排序和长期参考帧重排序。

图1

短期参考帧重排序

短期参考帧重排序见[1]的8.2.4.3.1,7.4.3.1,7.3.3.1章节。重新排序其实原理就是从RefIdxLX=0开始,每个位置放置期望的参考帧(其实本质是把其它位置的参考帧移到这个地方),所以我们希望知道到底是把参考列表中的哪个参考帧移到当前位置。

图2 ~ 图4说明了如何获取当前需要移动的参考帧的过程,当前需要移动的参考帧即为picNumLX,picNumLXPred的初始值为currentPicNum。

如果modification_of_pic_num_idc为0,对RefList0进行重排序操作,根据下式计算picNumLXNoWrap

图2

如果modification_of_pic_num_idc为1,对RefList1进行重排序操作,根据下式计算picNumLXNoWrap

图3

图4

每一个command的执行伪代码如图5所示,本质上就是移位和赋值操作。

图5

picNumLX的值将会带入图2的picNumLXPred执行下一个command命令,从图5可以看出,refIdxLX每执行一次命令就加1,用于下次命令操作。

重排序的句法如下图所示([1] 7.3.3.1

图6

长期参考帧重排序

长期参考帧的重排序见[1]的8.2.4.3.2,7.4.3.1,7.3.3.1章节,长期参考帧重排序和短期参考帧的重排序过程极其相似,这是每一条command的执行的操作稍有差别,每条command执行的伪代码如下图所示,这里不再赘述,后面用例子说明参考帧重排序过程。

图7

An example of reference list sort

假设参考帧队列中的元素如下,前三个为短期参考帧,后两个为长期参考帧,当前帧号为158,参考帧队列如下图所示。

图8

假设只对RefList0排序,command命令依次为:

  • modification_of_pic nums_idc = 0, abs_diff_pic num_minus_1 = 4
  • modification_of_pic nums_idc = 1, abs_diff_pic num_minus_1 = 1
  • modification_of_pic nums_idc = 2, long_term_pic_num = 3
  • modification_of_pic nums_idc = 3

下面我们来分析重排序命令的执行过程:

  • modification_of_pic nums_idc = 0, abs_diff_pic num_minus_1 = 4

picNumL0NoWrap = 158 - (4 + 1) = 153

picNumL0 = 153,初始的RefIdxLX = 0。

根据图5,短期参考帧重排序后为153 157 155 1 3 3,因为参考帧个数为5,所有只有一个entry无效。

  • modification_of_pic nums_idc = 1, abs_diff_pic num_minus_1 = 1

RefIdxLX = 1,picNumLXPred = 153

picNumL0NoWrap = 153 + (1 + 1) = 155

根据图5,短期参考帧重排序后为153 155 157 1 3 3

  • modification_of_pic nums_idc = 2, long_term_pic_num = 3

RefIdxLX = 2,参考图7,长期参考帧重排序后为153 155 3 157 1 3

  • modification_of_pic nums_idc = 3

更新参考帧列表结束,最终的参考帧列表为153 155 3 157 1 3

marking process for reference list

参考帧列表的标记在[1]7.3.3.3, 8.2.5章节中介绍参考帧列表的标记主要的作用是对参考帧的状态做变化,如当前参考帧列表的某个参考帧是作为短期参考帧使用,我们在下一帧编码时需要把它标记为长期参考帧或者标记位“未作为参考帧”(unused for reference)。

和参考帧重排序操作一样,参考帧标记需要顺序解析码流中的相关mmco(memory management control operatiopn)命令,协议中定义的mmco命令如下:

图9

参考帧标记句法如下:

图10

对图10的句法结构进行分析:

no_output_of_prior_pics_flag :仅在当前图像是 IDR 图像时出现这个句法元素,指明是否要将前面已解码的图像全部输出。

long_term_reference_flag: 仅在当前图像是 IDR 图像时出现这一句法元素。这个 句法元素指明是否使用长期参考这个机制。如果取值为 1,表明使用长期参考,并且每个 IDR 图像被解码后自动成为长期参考帧,否则(取值为 0),IDR 图像被解码后自动成为短期参考帧。

adaptive_ref_pic_marking_mode_flag:指明标记(marking)操作的模式。当为0时,使用滑窗机制,先进先出,这种模式下无法对长期参考帧操作。当为1时,为自适应模式,句法结构中可以灵活地对短期参考帧和长期参考帧进行操作。

图11

下面解读下mmco的各控制指令:

0: 解析mmco指令结束

1: 把DPB中的一个STR标记为unused reference,此操作带有一个参数difference_of_pic_nums_minus1,由此参数可 以推算出需要设置为unused reference的pic_num.

picNumX=CurrPicNum - (difference\_of\_pic\_nums\_minus1 + 1)

2: 把DPB中的一个LTR标记为unused reference,带有一个参数long_term_pic_num,此参数即为DPB中的LTR的索引编 号,long_term_pic_num的范围是0 - reference_num。

3: 把DPB中的一个STR标记为LTR并且给长期参考帧赋long_term_frame_idx,所以执行此命令需要找到需要标记为 LTR的STR,所以此命令有两个参数difference_of_pic_nums_minus1long_term_frame_idx。通过第一个参数 找到参考帧列表中对应的STR,然后将其标记为LTR,并设置long_term_frame_idx。long_term_frame_idxlong_term_pic_num不是一回事,两个值可以设置为一样。

4:标记maximum long-term frame index,并且把大于此值的所有LTR标记为unused reference。其作用就是使当前部 分的长期参考帧置为“unused for reference”。如果max_long_term_frame_idx_plus1设置为0则所有的长期 参考帧都无效。

5: 把DPB中所有的参考图像都设置为unused reference,并且把max_long_term_frame_idx设置为 "no long-term frame indices"(即相当于把max_long_term_frame_idx_plus1设置为0)。

6: 把当前的picture设置为LTR,并且分配long-term frame index。

Reference

《T-REC-H.264-202108》 [1]

<<THE H.264 ADVANCED VIDEO COMPRESSION STANDARD>> [2]

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

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

相关文章

《算法岗面试宝典》正式发布

大家好&#xff0c;历时半年完善&#xff0c;《算法岗面试宝典》 终于可以跟大家见面了。 最近 ChatGPT 爆火&#xff0c;推动了技术圈对大模型算法场景落地的热情&#xff0c;就业市场招聘人数越来越多&#xff0c;算法岗一跃成为竞争难度第一的岗位。 岗位方向 从细分方向…

汽车总线之----CAN总线

Introduction 早期的车辆网络是点对点的模式&#xff0c;臃肿繁杂且效率低下 现在是以总线的模式&#xff0c;很明显线路简洁清爽了很多。 高速CAN可以支持1M/s的速率&#xff0c;低速CAN可以支持125k/s的速率 CAN节点的内部结构图(Structure of CAN-Bus and electronic C…

*C++:list

一.list简介 1. list 是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list 的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素…

redisson 延迟队列实现任务过期监听

一、需求&#xff1a; 任务超过一个小时以后&#xff0c;如果还为待执行状态&#xff0c;则自动转为结束状态。 二、实现: 创建延迟队列的监听任务RedisDelayedQueueListener&#xff0c;消费延迟队列&#xff1b;创建新增延迟队列的类&#xff0c;用于创建延迟队列&#xf…

ACM MM24 | Hi3D: 3D生成领域再突破!新视角生成和高分辨率生成双SOTA(复旦智象等)

文章链接&#xff1a;https://arxiv.org/pdf/2409.07452 Github 链接&#xff1a;https://github.com/yanghb22-fdu/Hi3D-Official 亮点直击 本文提出了高分辨率图像到3D模型&#xff08;Hi3D&#xff09;&#xff0c;这是一种基于视频扩散的新范式&#xff0c;将单个图像重新定…

Codeforces Round 974 (Div. 3) G. Milky Days

题目 题解 #include<bits/stdc.h> using namespace std; #define int long long #define ll long long #define ld long double #define pb push_back #define fi first #define se second #define pii pair<int, int> #define lson p << 1 #define rson p …

Mapper核心配置文件

文章目录 environment 数据库环境typeAlias 起别名 environment 数据库环境 typeAlias 起别名

PMBOK® 第六版 估算活动持续时间

目录 读后感—PMBOK第六版 目录 在项目管理中&#xff0c;尤其是在软件开发这样的复杂项目中&#xff0c;工作内容是多种多样的。从需求分析、设计、编码到测试和部署&#xff0c;每个阶段都有其独特的挑战和不确定性。 没有人能独自完成所有估算工作并做到绝对精准。估算涉及…

股指期货交割方式是什么?

说起股指期货&#xff0c;这可是个高大上的金融玩意儿。咱们平时买卖股票&#xff0c;那是看准了哪只股就下手&#xff0c;赚了就卖&#xff0c;赔了就扛&#xff0c;挺直接的。但股指期货呢&#xff0c;它玩的是未来的预期&#xff0c;就像是你跟人打赌明天天气好不好&#xf…

开源推理库介绍:ZML,Distributed Llama,EXO | LeetTalk Daily

“LeetTalk Daily”&#xff0c;每日科技前沿&#xff0c;由LeetTools AI精心筛选&#xff0c;为您带来最新鲜、最具洞察力的科技新闻。 开源推理库的出现为机器学习模型的部署、监控和扩展提供了强大的支持。我们介绍三个重要的开源推理库&#xff1a;ZML、Distributed Llama …

机器人速度雅可比矩阵求解(2自由度平面关节机器人)

关节速度和末端速度空间的映射需要计算雅可比矩阵的逆矩阵,在博途PLC里如何计算一个方阵的逆矩阵,大家可以参考下面这篇文章: 博途PLC矩阵求逆 矩阵求逆 博图SCL_博图矩阵运算-CSDN博客文章浏览阅读839次。本文介绍如何用C语言实现矩阵求逆的过程,详细解析了相关代码,适…

Spring实战——入门讲解

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 Spring介绍 Spring实战的入门讲解主要涵盖了Spring框架的基本概念、核心功能以及应用场景。以下是关于Spring实战入门的具体介绍&#xff1a; Spring框架概述&#xff1a;Spring是一个轻量级的Java开发框架…

【有啥问啥】探索累计推理(Cumulative Reasoning, CR)——大型语言模型中的复杂推理新框架

探索累计推理&#xff08;Cumulative Reasoning, CR&#xff09;——大型语言模型中的复杂推理新框架 引言 随着人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;大型语言模型&#xff08;LLMs&#xff09;在自然语言处理上的表现令人瞩目。然而&#xff0c;LLMs在…

【HTTPS】—— HTTPS协议原理详解

目录 &#xff08;一&#xff09;Https是什么 1.1 什么是加密 1.2 为什么要加密 1.3 常见的加密方式 1.4 数据摘要 && 数据指纹 &#xff08;二&#xff09;Https工作过程研究 方案一&#xff1a;只使用对称秘钥 方案二&#xff1a;只使用非对称秘钥 方案三&a…

14年数据结构

第一题 解析&#xff1a; 求时间复杂度就是看程序执行了多少次。 假设最外层执行了k次&#xff0c;我们看终止条件是kn&#xff0c;则&#xff1a; 有, 内层是一个j1到jn的循环&#xff0c;显然执行了n次。 总的时间复杂度是内层外层 答案选C。 第二题 解析&#xff1a; 一步一…

如何用ChatGPT制作一款手机游戏应用

有没有想过自己做一款手机游戏&#xff0c;并生成apk手机应用呢&#xff1f;有了人工智能&#xff0c;这一切就成为可能。今天&#xff0c;我们就使用ChatGPT来创建一个简单的井字棋游戏&#xff08;Tic-Tac-Toe&#xff09;&#xff0c;其实这个过程非常轻松且高效。 通过Cha…

【Linux】常用指令【更详细,带实操】

Linux全套讲解系列&#xff0c;参考视频-B站韩顺平&#xff0c;本文的讲解更为详细 目录 一、文件目录指令 1、cd【change directory】指令 ​ 2、mkdir【make dir..】指令​ 3、cp【copy】指令 ​ 4、rm【remove】指令 5、mv【move】指令 6、cat指令和more指令 7、less和…

【Python】Maya:为人类打造的 Python 日期时间库

不知道少了什么&#xff0c;总感觉没有以前快乐。 在编程中处理日期和时间总是一个挑战&#xff0c;尤其是当涉及到时间和时区的转换时。Maya 是一个由 Kenneth Reitz 开发的 Python 库&#xff0c;旨在简化日期时间的处理&#xff0c;使其对人类开发者更加友好。本文将介绍 M…

【二等奖论文】2024年华为杯研究生数学建模F题成品论文(后续会更新)

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片&#xff0c;那是获取资料的入口&#xff01; 点击链接获取【2024华为杯研赛资料汇总】&#xff1a; https://qm.qq.com/q/alQjz21npu https://qm.qq.com/q/alQjz21npu X射线脉冲星光子到达时间建模 摘要 脉冲星是…

2024年最新前端工程师 TypeScript 基础知识点详细教程(更新中)

1. TypeScript 概述 TypeScript 是由微软开发的、基于 JavaScript 的一种强类型编程语言。它是在 JavaScript 的基础上添加了静态类型检查、面向对象编程等功能的超集&#xff0c;最终会被编译为纯 JavaScript 代码。由于其扩展了 JavaScript 的功能&#xff0c;TypeScript 特…