HEVC逆扫描之三:TU逆扫描过程

注:HM代码版本为HM-16.2+SCM-3.0rc1/

对应TDecSbac::parseCoeffNxN()函数解析。暂时先忽略掉几个模式:pcCU->getCUTransquantBypass(uiAbsPartIdx)、pcCU->getSlice()->getPPS()->getUseTransformSkip()、pcCU->isRDPCMEnabled(uiAbsPartIdx),这些判断假定全部为假。

忽略掉以上几个模式之后,程序流程图如下:

图8  逆扫描流程图

关于流程图说明以下几个问题。

1.  获取的编码参数

获取的编码参数如下表所示。

表2  获取的编码参数


参数


备注


像素点扫描表


若块尺寸为8x8,那么g_scanOrder中尺寸为:log2BlockWidth=3,log2BlockHeight=3


CG扫描表


若块尺寸为8x8,那么g_scanOrder中尺寸为:log2WidthInGroups=1,log2HeightInGroups=1


扫描方式


扫描方式是按照与编码端相同的方式推断出来的


CG尺寸


包括宽度和高度,意为当前TU包含几个CG


firstSignificanceMapContext


与熵解码相关,这里暂不作讨论

2.  获取最后一个非零系数的位置

获取最后一个非零系数的位置是熵解码的过程,是编码端写进码流里的,这里暂不做讨论。

3.  为什么要通过像素点扫描表找到最后一个非零系数的位置?

通过熵解码得到的最后一个非零系数的位置是编码端传过来的,在编码端它表征的是在扫描之前最后一个非零量化系数的位置,这个位置我猜测是与扫描顺序相反的顺序找到的,具体查找过程推测如下。

首先,这个位置的查找过程是跟扫描方式相关的,而且是以4x4为单位进行查找的。以对角扫描方式、查找16x16亮度块为例,CG的光栅扫描顺序如下图。


0


1


2


3


4


5


6


7


8


9


10


11


12


13


14


15

图9  CG的光栅扫描顺序

CG的对角扫描顺序如下图所示。


0


4


1


8


5


2


12


9


6


3


13


10


7


14


11


15

图10  CG的对角扫描顺序

那么最后一个非零系数的查找过程是按照与对角扫描顺序相反的过程进行查找的:首先查找位置为15的CG的4x4=16个系数是否全为0,如果全为0,那么继续按照11->14->7->…->1->4->0的顺序依次进行查找。如果找到某一个CG发现该CG内包含非零系数,那么再在此CG内同样按照与对角扫描顺序相反的顺序进行查找。

编码端通过以上方式找到的位置是光栅扫描位置,所以对应到解码端需要将该位置映射到对应的扫描方式的位置。

以8x8亮度块为例,如下图所示,绿色系数值表示系数为0,红色表示最后一个非零系数值,黑色系数表示系数是否为0未知。首先在右下角的4x4像素点内发现全部为0,那么继续在右上角的4x4内查找发现包含非零系数值;实际上在该4x4内查找时也是按照与扫描顺序相反的顺序进行查找的,发现该4x4内绿色部分系数全为0,最后一个非零位置为5,因此将该位置发送到解码端。所以,实际上该4x4内只包含三个非零系数。


0


1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24


25


26


27


28


29


30


31


32


33


34


35


36


37


38


39


40


41


42


43


44


45


46


47


48


49


50


51


52


53


54


55


56


57


58


59


60


61


62


63

图11  最后一个非零系数位置示例

解码端收到最后一个非零系数的位置为5之后,在像素点扫描表中找到该位置对应的索引值为34,如下图所示。


0


8


1


16


9


2


24


17


10


3


25


18


11


26


19


27


32


40


33


48


41


34


56


49


42


35


57


50


43


58


51


59


4


12


5


20


13


6


28


21


14


7


29


22


15


30


23


31


36


44


37


52


45


38


60


53


46


39


61


54


47


62


55


63

图12  像素点扫描表中最后一个非零系数示例

4.  如何通过以上位置推断出有效CG的最大索引?

有了最后一个非零系数在像素点扫描表中的映射位置,将该位置的一维索引值除以16即可得到。

5.  有效CG之间的逆扫描顺序是怎样的?

有效CG之间的逆扫描顺序也是按照与扫描顺序相反的顺序进行解码的。

以8x8亮度块、对角扫描方式为例,假如编码端传过来的最后一个非零系数的位置为5,那么通过像素点扫描表的映射找到的位置为34,那么有效CG的最大索引为34/16=2,按照下图所示的CG扫描表,解码器按照1->2->0的顺序对三个4x4块进行解码。


0


2


1


3

图13  8x8 CG扫描表

6.  CG内部的逆扫描过程

且听下文分解。

时间: 2024-11-09 21:02:09

HEVC逆扫描之三:TU逆扫描过程的相关文章

Nmap扫描教程之基础扫描详解

Nmap扫描教程之基础扫描详解 Nmap扫描基础扫描 当用户对Nmap工具了解后,即可使用该工具实施扫描.通过上一章的介绍,用户可知Nmap工具可以分别对主机.端口.版本.操作系统等实施扫描.但是,在实施这些扫描工作之前,需要先简单了解下Nmap工具的使用,以方便后面实施扫描.所以,本章将通过使用Nmap工具实施基础的扫描,来帮助用户了解该工具. Nmap扫描扫描概述 在实施基本的扫描之前,需要先了解一些Nmap网络扫描的基本知识,及需要考虑的一些法律边界问题.本节将对网络基本扫描进行一个简单介

漏洞扫描原理——将主机扫描、端口扫描以及OS扫描、脆弱点扫描都统一放到了一起

漏洞扫描原理及程序 1 引言 网络扫描,是基于Internet的.探测远端网络或主机信息的一种技术,也是保证系统和网络安全必不可少的一种手段.主机扫描,是指对计算机主机或者其它网络设备进行安全性检测,以找出安全隐患和系统漏洞.总体而言,网络扫描和主机扫描都可归入漏洞扫描一类.漏洞扫描本质上是一把双刃剑:黑客利用它来寻找对网络或系统发起攻击的途径,而系统管理员则利用它来有效防范黑客入侵.通过漏洞扫描,扫描者能够发现远端网络或主机的配置信息. TCP/UDP端口的分配.提供的网络服务.服务器的具体信

C语言整数按照二进制逆序,输出逆序后的整数值

问题来源,今天早上和一舍友吃早餐的时候谈到的一个问题,将一个整数按照二进制逆序,然后输出逆序后的数值. 我们知道数值在内存中都是以二进制的形式存放的,假如我们是32位机,每8位为一个字节,int型在32位机上是占4个字节,即32位. 如   2  = 0000 0000 0000 0000 0000 0000 00000 0010(32位) 逆 ^2  = 0100 0000 0000 0000 0000 0000 00000 0000  (这里用^表示逆转) 那么这个操作要如何执行呢?首先补充

传递给数据库 'master' 中的日志扫描操作的日志扫描号无效

错误:连接数据库的时候提示:SQL Server 检测到基于一致性的逻辑 I/O 错误 校验和不正确 C:\Documents and Settings\Administrator>"C:\Program Files\Microsoft SQL Server\100\Setup Bootstrap\Release\setup.exe" /q /ACTION=REBUILDDATABASE /INSTANCENAME=MSSQLSERVER /SQLSYSADMINACCOUNTS

SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析

原文:SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析 在SQL SERVER的查询语句中使用OR是否会导致不走索引查找(Index Seek)或索引失效(堆表走全表扫描 (Table Scan).聚集索引表走聚集索引扫描(Clustered Index Seek))呢?是否所有情况都是如此?又该如何优化呢? 下面我们通过一些简单的例子来分析理解这些现象.下面的实验环境为SQL SERVER 2008,如果在不同版本有所区别,欢迎指正. 堆表单索引 首先我们构建我们测试需要实验环境,

条码扫描二维码扫描—ZXing android 改进版本

看了Vurtexゞ. 文章<[Android实例] 条码扫描二维码扫描——ZXing android 源码简化 (附:支持中文) >的基础上对代码进行了修改 1.增加了将代码嵌套入自己工程后传值的办法(初学,如果有更好的方法也希望告诉我,先谢谢了) 2.扫码界面进行了处理(初步实现了现有某些软件的样子,至于长的像谁就不说了) //画四个角的代码<br>paint.setColor(frameColor); canvas.drawRect(15 + frame.left, 15 +

iOS 原生二维码扫描(可限制扫描区域)

写这篇文章的主要原因不是展示如何使用 AVFoundation   来进行二维码扫描,更主要的是限制扫描二维码的范围.(因为默认的是全屏扫描) 项目遇到扫描二维码的功能需求,这里我放弃了使用三方库,而采用了苹果原生的扫描. 原生的好处就是扫描特别快效率特别高,但是遇到一个问题就是不知道怎么去限制扫描范围. 还是先简单说一下怎么使用来进行二维码扫描吧. 首先是要用到的几个类 @property (strong,nonatomic)AVCaptureDevice * device; @propert

传递给数据库 &#39;model&#39; 中的日志扫描操作的日志扫描号无效

原因分析: 对于在Windows 8 Modern风格(注:即原Metro风格)的开始菜单界面,可以通过对磁贴进行固定或取消操作.如果仅仅对某个磁贴如“桌面”进行取消,那仍然可以进入所有应用中选中然后再重新固定即可.具体请阅读操作步骤. 解决方案: 1. 在开始菜单界面的空白处,点击鼠标右键.然后底部将会弹出“所有应用”的提示,鼠标左键单击; 2. 在所有应用列表中,找到“桌面”图标并在上面单击鼠标“右键”,然后再点击左下角的“固定到开始屏幕”; 3. 此操作后将重新在开始屏幕固定“桌面”磁贴;

苹果原生二维码扫描功能——可限制扫描区域

使用原生的好处就是扫描特别快效率特别高,使用  AVFoundation 来进行二维码扫描,更主要的是限制扫描二维码的范围.(默认的是全屏扫描) 首先是要用到的几个类 @property ( strong , nonatomic ) AVCaptureDevice * device; @property ( strong , nonatomic ) AVCaptureDeviceInput * input; @property ( strong , nonatomic ) AVCaptureMe

【转】 iOS 原生二维码扫描(可限制扫描区域)

在用 AVFoundation 完成扫码后,遇到2个问题: 1,如何限制扫描范围? 2.条形码如何扫描? 一位朋友的文章帮助了我,特地转来,可以帮到有需要的朋友. 原文:http://www.2cto.com/kf/201411/356046.html 写这篇文章的主要原因不是展示如何使用 AVFoundation 来进行二维码扫描,更主要的是限制扫描二维码的范围.(因为默认的是全屏扫描) 项目遇到扫描二维码的功能需求,这里我放弃了使用三方库,而采用了苹果原生的扫描. 原生的好处就是扫描特别快效