ECM8.0——CCCM相关代码

news2024/10/7 10:18:56

ECM8.0——CCCM相关代码

  • 概览
  • predIntraCCCM
  • xCccmCalcModels
  • xCccmApplyModel
  • xCccmCreateLumaRef
  • xCccmGetLumaRefBuf
  • xCccmGetLumaPuBuf
  • xCccmCalcRefAver
  • xCccmCalcRefArea

概览

在这里插入图片描述

函数名称函数作用
predIntraCCCM总体代码,根据CCCM技术预测输出
xCccmCalcModels计算CCCM滤波器系数
xCccmApplyModel应用滤波器执行CCCM过程
xCccmCreateLumaRef生成当前块的亮度参考样点
xCccmGetLumaRefBuf这段代码是用于获取一个降采样的luma buffer(Ref区域)
xCccmGetLumaPuBuf这段代码是用于获取一个降采样的luma buffer (PU区域)
xCccmCalcRefAver计算参考像素中的平均值
xCccmCalcRefArea计算给定色度块的参考区域

predIntraCCCM

在这里插入图片描述

函数接受以下参数:predictionunit &pu,pelbuf &predcb,pelbuf &predcr和int intradir。该函数包括以下步骤:

  1. 如果intradir为lm_chroma_idx、mdlm_l_idx或mdlm_t_idx,则执行单一模式下的xcccmcalcmodels和xcccmapplymodel函数。
  2. 否则,执行多模式下的xcccmcalcrefaver和xcccmcalcmodels和xcccmapplymodel函数。

xCccmCalcModels

在这里插入图片描述

这段代码是视频编码中的帧内预测模块部分,主要用于处理色度信息的矫正。具体来说,它的作用是计算出基于当前像素点和其周围像素点的一组线性变换系数,以矫正参考图像与当前图像之间的色度差异。

在这里插入图片描述

这段代码就是用来生产卷积滤波器,如下面这张图这样。

在这里插入图片描述
在这里插入图片描述
这段代码是一个实现色彩协方差矩阵(cccm)的函数。该函数计算输入图像样本的自相关矩阵和交叉相关向量,并使用ldl分解方法求解滤波器系数。如果定义了jvet_ab0174_cccm_div_free,则将从统计数据中删除色度偏移以更新交叉相关性。最后,将参数调整为所选动态范围并将其存储在给定的cccmmodel结构体中。如下面这张图所示:
在这里插入图片描述

xCccmApplyModel

使用xCccmCalcModels计算得到的滤波器参数来进行估计。
在这里插入图片描述

这段代码是实现图像帧内预测中cccm模型的应用。cccm模型是一种基于样本相似性的预测方法,其通过对当前像素周围的相邻像素进行采样并应用预设的模型来预测当前像素的值。

函数接受一个predictionunit类型的参数pu,表示待预测的图像块。compid表示颜色分量id,cccmmodel表示cccm模型,modelid和modelthr用于控制采样的样本范围,pipred为输出参数,表示预测结果。

在函数内部,首先获取当前颜色分量的clprng(裁剪范围),然后获取参考图像块的亮度信息reflumablk,并利用循环遍历各个像素。

在遍历过程中,根据modelid和modelthr的设定,选择是否跳过某些像素。然后针对当前像素,将其周围的6个邻近像素及其自身的像素值作为输入,应用cccm模型计算出预测值,并将预测值限制在裁剪范围内,存储在pipred指向的输出缓冲区中。

xCccmCreateLumaRef

这段代码是一种视频编码方式中的图像帧内预测方法,用于生成当前块的亮度参考样点,以便后续进行亮度残差计算。具体实现步骤如下:

  1. 通过传入的PredictionUnit和CompArea信息计算出当前块需要参考的区域范围。
    在这里插入图片描述

  2. 通过调用xCccmGetLumaRefBuf函数获取参考亮度缓冲区域,并计算出该区域的宽高、参考块的大小和位置等信息。根据参考块的大小和当前块的边界信息,对参考亮度缓冲区域进行初始化操作。
    在这里插入图片描述

  3. 对当前块需要参考的区域范围内的每个采样点进行逐一遍历,根据像素位置计算出其在参考帧中的位置,并从参考帧中获取相应的亮度值,写入到参考亮度缓冲区域中。
    在这里插入图片描述

  4. 对标记有Padding的位置进行填充,以保证后续处理的正确性。
    在这里插入图片描述
    这段代码的作用是在参考亮度缓冲区域的右侧填充一列数据,以保证该区域宽度与当前块的宽度相同。

refLuma是一个二维数组,at函数的参数x和y分别表示所要求取元素的列索引和行索引。该函数根据列索引和行索引计算元素在原始一维数组中的索引位置,并返回该位置上的元素。

在这里,该函数通过循环遍历顶部参考区域中的所有行,在每一行的最右侧(列的索引为areaWidth)填充一个样本。填充样本的值等于参考区域中该行最右侧一个样本的值(refLuma.at(areaWidth - 1, y))。这样就完成了对参考区域右侧的填充,使得该区域宽度等于当前块的宽度,从而方便后续的处理。

在这里插入图片描述
这段代码的作用是在当前块的右侧填充一列数据,以规避当该块的宽度小于参考区域宽度时,这一列数据缺失的问题。

refLuma是一个二维数组,at函数的参数x和y分别表示所要求取元素的列索引和行索引。该函数根据列索引和行索引计算元素在原始一维数组中的索引位置,并返回该位置上的元素。

在这里,该函数通过循环遍历从参考区域底部到当前块上边界之间的所有行(即从refSizeY到puBorderY-1),在当前块的最右侧(PU边界的x坐标,即puBorderX)填充一个样本。填充样本的值等于当前块最右侧一列的左侧相邻一个像素的值(refLuma.at(puBorderX - 1, y))。同时,当该块的宽度等于参考区域宽度时,这一步其实是不需要的。该步的目的是为了使得当前块的宽度与参考区域的宽度相同,从而方便后续的处理。

  1. 在Dualtree编码模式下,利用相邻块的亮度值填充当前块的亮度参考样点,扩大块间预测的可利用范围。
    在这里插入图片描述

这段代码是用于双树滤波的,它将 luma(亮度)值从当前PU右边和下面的区域采样,并用于双树滤波中。如果当前PU处于图像的CTU(Coding Tree Unit)/图像边界上,则不能采样右侧和下侧的luma值。在代码中,通过一系列的if语句和for循环,获取了采样所需的位置信息,并调用xCccmGetLumaVal函数,获取对应位置的luma值,并填充到refLuma中。

在这里插入图片描述

xCccmGetLumaRefBuf

在这里插入图片描述

这段代码是用于获取一个降采样的luma buffer,该buffer包含了PU和PU上方和左侧的参考区域。在获取这个luma buffer之前,函数会先通过一些参数计算出参考区域的位置和大小。如果pu.cccmNoSubFlag为true(即不进行亚采样),则使用chromaScaleX和chromaScaleY计算参考区域的位置和大小。在计算出参考区域信息后,函数将返回一个降采样后的luma buffer,该buffer是参考区域包括填充的2D滤波器所需的大小,并将指针指向参考区域左上角。

xCccmGetLumaPuBuf

在这里插入图片描述

这段代码是用于获取一个降采样的luma buffer,该buffer包含了PU的像素值以及PU上方和左侧的参考区域的像素值。在获取这个luma buffer之前,函数会根据pu的不同参数计算出参考区域的位置和大小,并计算出PU和参考区域的大小。然后,函数将返回一个降采样后的luma buffer,该buffer是PU及其上方和左侧参考区域所需的大小,并将指针指向PU的左上角。

xCccmGetLumaRefBuf 和 xCccmGetLumaPuBuf 区别:

  1. 这两个函数都是在帧内预测中使用的,目的是获得参考像素值。它们之间的区别在于xCccmGetLumaRefBuf返回的是参考区域的像素值,而xCccmGetLumaPuBuf返回的是当前处理的预测单元块的像素值。
  2. 具体来说,xCccmGetLumaRefBuf用于获取参考像素的区域,这个区域通常是在当前处理的块周围的一个更大的块中。该函数返回一个PelBuf,其中包含对应于该参考区域的实际像素值,可以被用作预测时的输入。
  3. 另一方面,xCccmGetLumaPuBuf用于获取预测单元块本身的像素值。该函数返回一个PelBuf,其中包含了当前处理的预测单元块的实际像素值。这些像素值可以被用作块内/块外预测模式的输入。
  4. 总之,xCccmGetLumaRefBuf返回的是参考区域的像素值,xCccmGetLumaPuBuf返回的是当前处理的预测单元块的像素值,二者功能和用途略有不同。

xCccmCalcRefAver

在这里插入图片描述

这段代码是用于计算参考像素中的平均值,以便在帧内预测过程中进行使用。具体来说,它计算了参考像素中所有可用样本 (Top和Left) 的加权平均值。

首先,xCccmGetLumaRefBuf函数被调用,返回包含参考像素实际值的PelBuf。然后,对于该PelBuf中的每个样本,都将其添加到sumSamples中,同时将numSamples加1。最后,将所有样本的加权平均值计算为sumSamples/numSamples,并以整数形式返回该值。

注意,如果没有可用的样本,则返回默认值512。

xCccmCalcRefArea

在这里插入图片描述

这段代码是用于计算给定色度块的参考区域。具体来说,它确定了参考区域的大小和位置,以便在帧内预测过程中使用。

首先,函数获取了关于当前色度块的一些信息,如色度类型、块的大小、最小CU大小等。然后,它计算出一些值,如可用单元格的数量和参考线的数量,这些值将被用于确定参考区域的大小。最后,使用这些计算出的值,函数计算并返回了参考块的位置和大小。

需要注意的是,参考块的大小和位置取决于可用的相邻块。如果可用的相邻块不足,则参考块会相应地缩小。

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

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

相关文章

Idea+maven+spring-cloud项目搭建系列--14 整合请求参数校验

前言:当我们在进行web 项目的开发时,对于前端传入的参数,都需要进行一些非空必填等的验证,然后在进行业务逻辑的处理,如果写一堆的if 判断很不优雅,那么有没有好的方式来帮忙处理,本文通过hiber…

光电隔离转换器 直流信号放大器 导轨安装DIN11 IPO OC系列

概述: 导轨安装DIN11 IPO OC系列模拟信号隔离放大器是一种将输入信号隔离放大、转换成按比例输出的直流信号混合集成厚模电路。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等需要直流信号隔离测控的行业。此系列产品内部采用了线性光电隔离技术相…

DSP中定点与浮点运算

一、定点数及其定标 在定点DSP芯片中,采用的是定点数据数值运算,其操作数一般采用整形数来表示。一个整形数的最大表示范围由DSP芯片给定字长决定。字长越长,表示的范围越大,精度越高。 举例16位字长 每个16数位用1个符号位表示正…

九龙证券|这一刻,资本市场进入全新时代!

2023年4月10日,第一批10家主板注册制企业上市鸣锣敲钟,奏响了触及本钱商场灵魂深处革新的序曲。 动能切换中的我国对于高效资源配置的渴望,与革新进行时的本钱商场对于全面注册制的探究,一起凝集成一股连绵有力之暖流,…

学习安全攻防技能30讲-开篇|别说你没有被安全困扰过

文章目录学习安全攻防技能30讲-开篇|别说你没有被安全困扰过研读开篇安全重要吗?安全难学吗?学习安全攻防技能30讲-开篇|别说你没有被安全困扰过 研读开篇 文中说到一个竞赛叫CTF,这个之前从来没有听过的,作为开发人员涨知识了。…

Java封装

Java封装\huge{Java封装}Java封装 JavaJavaJava的三大特征之一。 作用 告知如何设计对象的属性和方法,将对象完全独立起来。 ❗❗封装原则 对象代表什么,就要封装对应的数据,并且提供对应数据的行为。(尤其是后半句非常重要&a…

012:Mapbox GL显示弹窗Popup

第012个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中显示弹窗。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共70行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:https://xiaozhuan…

PHP医院安全(不良)事件管理系统源码,十多种不良事件类型,上百种报告内容数据表

医院不良事件上报系统源码,PHP医院安全(不良)事件管理系统源码 技术架构:前后端分离,仓储模式, 开发语言:PHP 开发工具:vscode 前端框架:vue2element 后端框架&…

2023年mathorcupB题城市轨道交通列车时刻表思路分析

B 题 城市轨道交通列车时刻表优化问题 列车时刻表优化问题是轨道交通领域行车组织方式的经典问题之一。 列车时刻表规定了列车在每个车站的到达和出发(或通过)时刻,其在实 际运用过程中,通常用列车运行图来表示。图 1 为某一运行图的示例,图…

文件操作【上篇】

文章目录🗃️1.为什么使用文件🗃️2.什么是文件📁2.1.程序文件📁2.2.数据文件📁2.3.文件名🗃️3.文件的打开和关闭📁3.1.文件指针📁3.2.文件的打开和关闭🗃️4.文件的顺序…

I-型糖尿病患者的福音,皮下燃料电池将多余的血糖转化为电能产生胰岛素

I-型糖尿病患者体内不产生胰岛素,患者必须从外部获得激素来调节血糖水平。当前,患者主要通过将胰岛素泵直接连接到身体以获得胰岛素。这些胰岛素泵以及其他医疗器械(如起搏器)需要可靠的能源供应,主要通过一次性或可充…

#mvn 打包ik分词器报错#

场景:在window上安装ik分词器,需要先mvn打包,结果报错 原因:由于jdk版本的问题导致 解决过程 1:打包流程 git clone https://github.com/medcl/elasticsearch-analysis-ik #git clone https://gitcode.net/mirrors/me…

线性分类算法:逻辑回归和Softmax回归

目录(一 )逻辑回归1.1 逻辑回归概述:1.2 逻辑回归的作用与Sigmoid 函数:1.2.1 Sigmoid 函数作用1.3 指数族分布1.4 逻辑回归的损失函数1.5逻辑回归如何求解得到最优解模型方法1.6 逻辑回归鸢尾花分类1.7 逻辑回归做多分类&#xf…

拉取gradle项目报错Could not find method compile() for arguments

拉取gradle项目, 依赖拉不下来, 报错如下: Could not find method compile() for arguments XXXXXX on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler. 找了很多篇文章都没有解决,后来在stack overflow上面找到了答案: Note t…

Linux中快速搭建RabbitMQ

目录一、简介1、关于RabbitMQ2、RabbitMQ主要端口介绍二、RabbitMQ安装1、安装依赖项socat2、下载Erlang和RabbitMQ(1) Erlang和RabbitMQ版本关系要求(2) 下载操作系统支持的Erlang和RabbitMQ版本(3) 安装Erlang和RabbitMQ三、启动和关闭1、启动服务2、查看状态3、停止服务4、设…

核心业务3:借款人借款申请

核心业务3:借款人借款申请 1.借款人借款申请业务流程图 2.借款项数据库绑定 ---------------------借款申请流程---------------------- 3.借款申请流程 4.前端代码逻辑 5.后端代码逻辑 ---------------------借款申请流程---------------------- 核心业务3&…

用SSH登陆Centos系统时,命令行最前面显示“的提示符[root@www myapp]”是什么意思?

用SSH登陆Centos系统时,命令行最前面显示“的提示符[rootwww myapp]”是什么意思? 在SSH登录到CentOS系统时,提示符 [rootwww myapp] 中的 www 表示当前登录的主机名(hostname),也就是指当前运行的CentOS系…

基于html+css的盒子展示2

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

蓝桥杯web备赛——Node.js

node.js之前只能说是略有了解,这次好好了解一下吧! 东西还是比较多的。 目前来看就了解比赛会用到的http模块就可以了,其他的暂且不做了解 const http require("http");//1.引入http模块const app http.createServer();//2.创建…

【网络安全】--xss漏洞

xss漏洞xss漏洞介绍危害防御方法xss测试语句xss攻击语句1. 反射性xss2.存储型xss3.DOM型xssxss漏洞介绍 定义:XSS 攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为 XSS&#xff0c…