HEVC的參考队列解码
參考队列是指在进行帧间解码时。P或者B slice所參考的已解码的。位于解码图像缓存中(DPB, decoded picture buffer)中的图像队列,类似h264中的reflist0和reflist1。涉及到整个DPB的管理和參考帧的选择。
本文中讨论的都是slice为P,B的情况,slice为I类型时,没有參考帧。
1. 短期參考图像參数集
首先介绍一下短期參考图像參数集(Short-term reference picture set ), 简称short-term RPS,储存着有关short term參考帧选择的信息。
short-term RPS可能会出如今SPS或者slice header中。
否则(short_term_ref_pic_set(stRpsIdx )出如今SPS中)。short_term_ref_pic_set( stRpsIdx) 结构代表short-termRPS的一个候选值。在SPS中最多有64个short term RPS。
当解码到一个slice的时候。该使用哪个short term RPS呢?有两种情况:
情况1:參数short_term_ref_pic_set_sps_flag(位于slice header中)为0时。这样的情况下,码流中会有一个參数short_term_ref_pic_set_idx。这个參数给出当前slice该选择的short term RPS的序号。在SPS中有0~64个short term RPS以供检索。
情况2:short_term_ref_pic_set_sps_flag为1时,slice header中会有一个short term RPS的结构。供整个picture使用。
short term RPS的解析也有两种情况:
情况1.參数inter_ref_pic_set_prediction_flag为1。RPS的内容从还有一个RPS预測得来。
情况2.inter_ref_pic_set_prediction_flag为0,直接解析得到。
short term RPS的解析过程不在这里具体说明,具体可见HEVC标准。
经过解析后。我们可以得到一系列的entry和两个值NumNegativePics和NumPositivePics,分别给出poc小于和大于当前slice的poc的參考帧的数量,每个entry包括两个值:
1.UsedByCurrPic:表示是否被当前帧使用
2.DeltaPoc:与当前帧的POC的差值
如图所看到的:
![]()
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
图中,NumNegativePics=5,NumPositivePics = 4。
分析到这里先放一放。我们来看还有一组參数。
2.长期參考图像參数集
假设码流採用了long term 參考时。
在SPS中存储着num_long_term_ref_pics_sps(设为n0)个entry。每一个entry也包括两项UsedByCurrPic和DeltaPoc。
slice header中的參数num_long_term_sps(设为n1)给出从sps中採用的long term entry的个数,參数num_long_term_pics(设为n2)给出包括在slice
header中的long term entry的个数。slice header中还包括n1个的lt_idx_sps,依据这些lt_idx_sps给出的序号,从SPS的n0个long term entry中选择n1个和slice header中的n2个组成long term entry的序列。
如图:n1 = 3, n2 = 2;
![]()
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
3.參考图像列表修正
參考图像列表修正结构(Reference picture list modification)位于sliceheader中。
參数ref_pic_list_modification_flag_l0:若其值为1表示參考图像列表0通过list_entry_l0[i]被显式指定,默认值为0。
參数list_entry_l0[i]:给出RefPicListTemp0中用以替代当前值的索引。
參数ref_pic_list_modification_flag_l1:若其值为1表示參考图像列表0通过list_entry_l1[i]被显式指定,默认值为0。
參数list_entry_l1[i]:给出RefPicListTemp1中用以替代当前值的索引。
4.RPS解码过程和RefList的构建
遍历short term RPS的全部entry。利用deltapoc计算得到參考帧的poc,并将used = 1且poc小于当前slice的放入PocStCurrBefore组。
将used = 1且poc大于当前slice的放入PocStCurrAfter组。
将used = 0的放入PocStFoll组。
遍历long term RPS的全部entry,利用deltapoc计算得到參考帧的poc。并将used = 1的放入PocLtCurr组,将used = 0的放入PocLtFoll组。
整个过程如图所看到的:
图中给每个entry都加入了标号。依据deltaPoc计算得出的poc记做Pn(P1,P2,.... P14)。这样就得到了PocStCurrBefore。PocStCurrAfter,PocStFoll,PocLtCurr和PocLtFoll共5组poc。
DPB中的图像会被标记为used for short-term reference(短期參考),used for long-term reference(长期參考)或者unused for reference(不被參考),且仅仅能为当中的一种状态。
然后进行例如以下步骤:
1.
遍历PocLtCurr组中的POC,假设DPB中某帧图像的poc和组中的某个poc同样。则这帧图像属于RefPicSetLtCurr组。
遍历PocLtFoll组中的POC,假设DPB中某帧图像的poc和组中的某个poc同样,则这帧图像属于RefPicSetLtFoll组。
2.
RefPicSetLtCurr和RefPicSetLtFoll组中的图像都被标记为used for long-term reference。
3.
遍历PocStCurrBefore组中的POC,假设DPB中某帧图像的poc和组中的某个poc同样,则这帧图像属于RefPicSetStCurrBefore组。
遍历PocStCurrAfter组中的POC。假设DPB中某帧图像的poc和组中的某个poc同样。则这帧图像属于RefPicSeStCurrAfter组。
遍历PocStFoll组中的POC。假设DPB中某帧图像的poc和组中的某个poc同样,则这帧图像属于RefPicSetStFoll组。
4.
凡是不在RefPicSetStCurrBefore, RefPicSetStCurrAfter, RefPicSetStFoll, RefPicSetLtCurr和RefPicSetLtFoll这5个组中的图像即被标记为unused for reference。(也就是说,RefPicSetStCurrBefore。RefPicSetStCurrAfter和RefPicSetStFoll组中的图像标记为了used
for short-term reference)如图,如果DPB中共同拥有6帧图像。其POC各自是P1, P2, P6, P10, P11和P15。则依据以上步骤。得到图中结果,P15被标记为unused for reference。
![]()
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
对于P slice来说。仅仅有前向參考列表RefPicList0,对于B slice来说。有RefPicList0和后向參考列表RefPicList1.
RefPicListTemp0依照顺序RefPicSetStCurrBefore,RefPicSetStCurrAfter和RefPicSetLtCurr组成。
RefPicListTemp1依照顺序RefPicSetStCurrAfter。RefPicSetStCurrBefore和RefPicSetLtCurr组成。
依照Reference picture list modification中的内容,能够得到终于的參考list,RefPicList0和RefPicList1。
如图所看到的:
依据以上步骤,能够得到RefPicListTemp0中图像的POC为P1,P6和P10,RefPicListTemp1中的图像为P6。P1和P10。
ref_pic_list_modification_flag_l0为0。则RefPicList0全然和RefPicListTemp0同样。
ref_pic_list_modification_flag_l1为1,则RefPicList1须要依据list_entry_l1改动顺序得到。
有了RefPicList0和RefPicList1就能够进行运动向量的解码,预測和计算了,运动补偿也要用到。
HEVC的參考队列解码的更多相关文章
- 基于TI Davinci架构的多核/双核开发高速扫盲(以OMAP L138为例),dm8168多核开发參考以及达芬奇系列资料user guide整理
基于TI Davinci架构的双核嵌入式应用处理器OMAPL138开发入门 原文转自http://blog.csdn.net/wangpengqi/article/details/8115614 感谢 ...
- 我经常使用的DOS命令參考
我经常使用的DOS命令參考 这个C:\>叫做提示符.这个闪动的横线叫做光标. 这样就表示电脑已经准备好,在等待我们给它下命令了.我们如今所须要做的,就是对电脑发出命令.给电脑什么 ...
- WPS2012交叉引用技巧,word比wps这点强更新參考文献
WPS2012交叉引用技巧,word比wps这点强更新參考文献 到时生成仅仅有有一条线,好像WPS不能够,word能够,假设谁知道能够补充.^_^ 1.写论文,參考文献的改动非 ...
- (十)unity4.6学习Ugui中文文档-------參考-UGUI Canvas Components
大家好,我是孙广东. 转载请注明出处:http://write.blog.csdn.net/postedit/38922399 更全的内容请看我的游戏蛮牛地址:http://www.unit ...
- ANTLR4权威參考手冊(一)
写在前面的话: 此文档是对伟大的Terence Parr的著作<the definitive antlr4 reference>的翻译本.致敬!欢迎转载,请注明原地址,请尊重劳动成果.翻译 ...
- 《C++语言基础》实践參考——数组作数据成员
返回:贺老师课程教学链接 [项目5 - 数组作数据成员]阅读教材P255例8.4.注意到类中的数据成员能够是数组.设计一个工资类(Salary),当中类的数据成员例如以下: class Salary ...
- 学习笔记之TCP/IP协议分层与OSI參考模型
1.协议的分层 ISO在制定标准化OSI之前,对网络体系结构相关的问题进行了充分的讨论, 终于提出了作为通信协议设计指标的OSI參考模型.这一模型将通信协议中必要 的功能分成了7层.通过这些 ...
- Windows8.1和Ubuntu14.04双系统卸载Ubuntu參考教程[图]
我之前编写并公布了<Windows8.1安装Ubuntu14.04双系统參考教程及双硬盘注意事项>这篇教程,而本文提供的卸载Ubuntu方法适用于这篇教程,其它方法安装的Ubuntu可适当 ...
- Hadoop 2.6.0分布式部署參考手冊
Hadoop 2.6.0分布式部署參考手冊 关于本參考手冊的word文档.能够到例如以下地址下载:http://download.csdn.net/detail/u012875880/8291493 ...
随机推荐
- webdriver高级应用- 操作日期控件
1. 通过点击的方式操作日期控件 #encoding=utf-8 from selenium import webdriver import unittest, time, traceback fro ...
- day01_12.字符串
1.字符转义 在字符串中,出现一些比较特殊的字符,容易引起歧义 我们需要转义这些引起歧义的字符串 <?php $a = 'ab\\c'; //转义字符2个 \' \\ $b = 'ab\'c'; ...
- python学习--python 连接SQLServer数据库(两种方法)
1. python 学习.安装教程参照: http://www.runoob.com/python/python-tutorial.html 2. 集成开发环境 JetBrains PyCharm C ...
- [java开发篇][dom4j模块] 遍历xml文件
http://blog.csdn.net/chenleixing/article/details/44353491 在android studio 导入dom4j库(build-gradle(Moud ...
- 2016湖南省赛----G - Parenthesis (括号匹配)
2016湖南省赛----G - Parenthesis (括号匹配) Bobo has a balanced parenthesis sequence P=p 1 p 2…p n of lengt ...
- 设计模式(二 & 三)工厂模式:概述
工厂 从 coding 的角度来说,在需要创建对象的时候,直接在方法内部使用 new 关键字来创建,是非常方便的. 然而从全局的角度考虑,这样会使对象变得难以管理和控制,代码会变得非常脆弱,缺乏弹性. ...
- 【Luogu】P4208最小生成树计数(状压乱搞)
题目链接 最小生成树有两个性质,两个性质都知道的话这题就变成码农题了. 1.无论最小生成树长什么样,所有权值的边的数量是不变的.比如我有棵最小生成树有两条权值为2的边四条权值为1的边,那这个图的所有最 ...
- Codeforces 899D Shovel Sale
题目大意 给定正整数 $n$($2\le n\le 10^9$). 考虑无序整数对 $(x, y)$($1\le x,y\le n, x\ne y$). 求满足 「$x+y$ 结尾连续的 9 最多」的 ...
- Java面试题之多线程同步和互斥有几种实现方法,都是什么?
线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另外一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒. 线程互斥是指对于共享的进程系统资源,每个线程访问时的排他 ...
- net4:Panel动态添加控件及隐藏,Table动态创建表格
原文发布时间为:2008-07-29 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...