热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SCC(四):Palettemode

SCC(四):Palettemode调色板模式(palettemode)对于只含有少数几种颜色的块非常高效。相比于传统的对块进行预测变换处理,调色板模式只需要对每个像素传输其颜色索

SCC(四):Palette mode

调色板模式(palette mode)对于只含有少数几种颜色的块非常高效。相比于传统的对块进行预测变换处理,调色板模式只需要对每个像素传输其颜色索引。

调色板是一个包含CU中颜色值的表,对于CU中每个像素在码流中传输其在表中的索引。解码器使用这个索引和这个调色表来重建CU。


调色表中每个条目包含三个分量(RGB或YCbCr)。对于4:2:0或4:2:2颜色格式,如果当前位置像素没有色度分量,就只使用第一个分量重建像素。在调色表中有一个特殊索引escape index用于那些在表中没有对应值的像素。在这种情况下,码流中除了要传输该像素的索引escape index,还要传输该像素的量化值。

下图是一个palette size = 4的调色板示例:

调色板编码

在编码端需要生成调色板。使用调色板模式编码时,其编码分为两部分:调色表的编码和CU中每个像素索引的编码。

通常,相邻的使用调色板模式的块的调色表有很多相同项。为了减少冗余,当前待编码调色表由之前已编码调试表预测得到,而当前调色表新的项显示传输。对于预测调色表每项都有一个标志位表示该项是否在当前调色表中。这些标志位使用行程编码,行程使用零阶指数哥伦布编码。传输完预测表之后,再传输新添项的数量和对应的值。如下图所示。

对于每个slice或tile或CTU行(当使用波前时)的第一个CTU,预测表使用PPS中传输的初始化项或0来初始化。当CU使用调色板模式编码完后,预测调色板按下面步骤更新:首先,当前调色板的所有项都添加进预测表。然后,加入前面调色板中未在当前调色板中出现的项。这个过程持续到前面调色板中所有未使用项都加入了或者调色板达到最大尺寸。

对于索引的编码,首先编码标志位palette_escape_cal_present_flag表示当前CU中是否存在escape index。编码CU调色索引有两种扫描顺序:水平扫描和垂直扫描。

上图是两种扫描顺序示意图。下面以水平扫描为例讲解,如果是垂直扫描编码前(或解码后)CU索引要进行转置操作。标志位palette_transpose_flag表示扫描方向。

屏幕内容经常包含平坦区域,这些区域的像素值非常接近,像素的调色索引使用行程编码效率非常高。此外,平坦区域连续行或连续列的索引可能都相同,为了利用这个性质每个像素有两种编码模式COPY_INDEX_MODE和COPY_ABOVE_INDEX,在码流中用palette_run_type_flag表示。

COPY_INDEX_MODE模式首先编码一个索引(截断二元码),然后后面跟一个行程长度表示等于该索引的像素数量。

COPY_ABOVE_INDEX模式中从上一行复制索引,然后后面跟一个行程长度表示等于该索引的像素数量。该模式仅需要传输行程长度不需要传输索引值。

COPY_INDEX_MODE和COPY_ABOVE_INDEX的行程长度都可能跨过多行。

下图是一个4x4块编码示例(4x4块方便展示,实际运行使用调色板模式最小的块为8x8):

调色板生成

对每个CU使用改进的k-means clustering算法生成调色表(有损)。首先,调色表初始化为空。然后,对CU中的每个像素计算离其最近的调色表项(用SAD度量)。如果SAD小于某个阈值则将该像素加到该表项对应的cluster,否则将该像素加入调色表作为一个新项。当处理完CU中所有像素后,使用每个cluster的中心更新调色表项。由于调色板有尺寸限制(SPS中指定),如果调色表中项的数量超过最大限制,则去掉像素数量少的cluster对应的项,这些项对应像素的索引变为escape index。

一旦调色板和CU中每个像素在调色板中的索引确定后,使用RDO技术确定palette_run_type_flag和行程值。

感兴趣的请关注微信公众号Video Coding


推荐阅读
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 作为一名专业的Web前端工程师,掌握HTML和CSS的命名规范是至关重要的。良好的命名习惯不仅有助于提高代码的可读性和维护性,还能促进团队协作。本文将详细介绍Web前端开发中常用的HTML和CSS命名规范,并提供实用的建议。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本文介绍了如何在 C# 和 XNA 框架中实现一个自定义的 3x3 矩阵类(MMatrix33),旨在深入理解矩阵运算及其应用场景。该类参考了 AS3 Starling 和其他相关资源,以确保算法的准确性和高效性。 ... [详细]
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • 本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ... [详细]
  • 获取计算机硬盘序列号的方法与实现
    本文介绍了如何通过编程方法获取计算机硬盘的唯一标识符(序列号),并提供了详细的代码示例和解释。此外,还涵盖了如何使用这些信息进行身份验证或注册保护。 ... [详细]
  • 探索1000以内的完美数:因数和等于自身
    本文探讨了如何在1000以内找到所有完美数,即一个数的因数(不包括自身)之和等于该数本身。例如,6是一个完美数,因为1 + 2 + 3 = 6。通过编程实现这一过程,可以更好地理解完美数的特性。 ... [详细]
  • 使用GDI的一些AIP函数我们可以轻易的绘制出简 ... [详细]
  • 本文探讨了MariaDB在当前数据库市场中的地位和挑战,分析其可能面临的困境,并提出了对未来发展的几点看法。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 在 Flutter 开发过程中,开发者经常会遇到 Widget 构造函数中的可选参数 Key。对于初学者来说,理解 Key 的作用和使用场景可能是一个挑战。本文将详细探讨 Key 的概念及其应用场景,并通过实例帮助你更好地掌握这一重要工具。 ... [详细]
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
  • 本文详细介绍如何在Linux系统中配置SSH密钥对,以实现从一台主机到另一台主机的无密码登录。内容涵盖密钥对生成、公钥分发及权限设置等关键步骤。 ... [详细]
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
author-avatar
小石头
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有