HEVC:Z-scan和Raster扫描方式的转换

参考链接:
https://blog.csdn.net/hevc_cjl/article/details/8183144
https://blog.csdn.net/tianzhaixing2013/article/details/8694105
https://blog.csdn.net/u010854339/article/details/8994985

最近在HEVC的代码中,学习了实现Zscan和Raster两种扫描方式的转换方法。根据以上三个参考链接,整理资料如下:

背景补充:
HEVC中,CU采用递归的四叉树划分结构,Zscan扫描可以很好地适应该种编码结构,有利于CU的寻址。
光栅扫描,也叫逐行扫描,形象直观,容易计算X、Y坐标,有利于像素点的寻址。
在不同的应用中,为方便计算,需要采用不同的扫描方式,故有相互转换之需求。

HM代码中的 initZscanToRaster()initRasterToZscan() 函数(附个人注释):

Void initZscanToRaster (Int iMaxDepth, Int iDepth, UInt uiStartVal, UInt*& rpuiCurrIdx)
{
	Int iStride = 1 << ( iMaxDepth - 1);  // CU的尺寸,例如CU16x16对应的iStride为16.
	
	if ( iDepth == iMaxDepth )
	{
		rpuiCurrIdx[0] = uiStartVal;
		rpuiCurrIdx++;  // Zscan的值递增1,0~(iStride*iStride-1)
	}
	else
	{
		Int iStep = iStride >> iDepth;  // iDepth取值范围为1~(iMaxDepth-1)
		initZscanToRaster ( iMaxDepth, iDepth+1, uiStartVal, rpuiCurrIdx);  // 四行递归调用,因为Zscan由2x2的Z字形扫描嵌套构成。
		initZscanToRaster ( iMaxDepth, iDepth+1, uiStartVal+iStep, rpuiCurrIdx);
		initZscanToRaster ( iMaxDepth, iDepth+1, uiStartVal+iStep*iStride, rpuiCurrIdx);
		initZscanToRaster ( iMaxDepth, iDepth+1, uiStartVal+iStep*iStride+iStep, rpuiCurrIdx);
	}
}
Void initRasterToZscan (UInt uiMaxCUWidth, Uint uiMaxCUHeight, UInt uiMaxDepth)
{
	UInt uiMinCUWidth = uiMaxCUWidth >> (uiMaxDepth - 1);
	UInt uiMinCUHeight = uiMaxCUHeight >> (uiMaxDepth - 1);
	
	UInt uiNumPartInWidth = (UInt)uiMaxCUWidth / uiMinCUWidth;
	UInt uiNumPartInHeight = (UInt)uiMaxCUHeight / uiMinCUHeight;
	
	for (UInt i = 0; i < uiNumPartInWidth*uiNumPartInHeight; i++)
	{
		g_auiRasterToZscan[ g_auiZscanToRaster[i] ] = i;	// Zscan到Raster扫描的对应关系中,Zscan的值是加1递增的,故反向对应即可。
	}
}

16x16的Zscan见下图:

注:8x8Zscan和4x4Zscan可在16x16Zscan中找到,此处略。

16x16的光栅扫描见下图:

8x8的光栅扫描见下图:

4x4的光栅扫描见下图:

ZscanToRaster16x16 的对应关系示例:

g_auiZscanToRaster[0] = 0;
g_auiZscanToRaster[1] = 1;
g_auiZscanToRaster[2] = 16;
g_auiZscanToRaster[3] = 17;

g_auiRasterToZscan[0] = 0;
g_auiRasterToZscan[1] = 1;
g_auiRasterToZscan[16] = 2;
g_auiRasterToZscan[17] = 3;

ZscanToRaster8x8 的对应关系示例:

g_auiZscanToRaster[0] = 0;
g_auiZscanToRaster[1] = 1;
g_auiZscanToRaster[2] = 8;
g_auiZscanToRaster[3] = 9;

g_auiRasterToZscan[0] = 0;
g_auiRasterToZscan[1] = 1;
g_auiRasterToZscan[8] = 2;
g_auiRasterToZscan[9] = 3;

ZscanToRaster4x4 的对应关系示例:

g_auiZscanToRaster[0] = 0;
g_auiZscanToRaster[1] = 1;
g_auiZscanToRaster[2] = 4;
g_auiZscanToRaster[3] = 5;

g_auiRasterToZscan[0] = 0;
g_auiRasterToZscan[1] = 1;
g_auiRasterToZscan[4] = 2;
g_auiRasterToZscan[5] = 3;
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
H.265/HEVC(High Efficiency Video Coding)是视频编码的新标准,也是H.264/AVC(Advanced Video Coding)的后继者。H.265/HEVC的目标是提供比H.264/AVC更高的压缩性能,即可以在相同的视频质量下减小文件大小,或者在相同的文件大小下保持更高的视频质量。 H.265/HEVC通过引入一系列新的技术和算法来实现高效率的视频编码。其中一项重要的改进是采用更高级的块划分和运动估计算法,以利用视频序列中的时空相关性。此外,H.265/HEVC还引入了新的预测模式、变换和量化方法,以更好地利用视频序列中的统计特性。通过这些改进,H.265/HEVC可以达到更高的编码效率,减小文件大小。 H.265/HEVC还支持更高的分辨率和更高的帧率。相比于H.264/AVC,H.265/HEVC可以编码更大尺寸的视频,以适应高清视频和超高清视频的需求。此外,H.265/HEVC还支持更高的帧率,可以编码更流畅的视频。 H.265/HEVC还有一些其他的扩展特性。例如,它可以支持更多的色彩空间和位深度,以提供更丰富和准确的颜色表现。它还支持有损和无损视频编码,以满足不同应用场景的需求。 总的来说,H.265/HEVC是一种具有高压缩性能和更好视频质量的视频编码标准。它在视频通信、视频点播和储存等领域有着广泛的应用前景,可以为用户提供更好的观看体验,并帮助节省带宽和存储空间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值