首页 > 其他分享 >使用memcpy进行分段copy

使用memcpy进行分段copy

时间:2024-09-19 17:48:56浏览次数:7  
标签:分段 YUV GPU copy memcpy 分量

一、概述

  使用场景:在音视频开发中,用YUV数据+OpenGL进行画面渲染。经常会将Y分量、U分量、V分量分开。分别上传到GPU,由GPU转换为RGB进行最终展示。

       使用这种方式的原因是基于GPU计算效率高为前提的。

  在这个过程中经常会用到一个c函数memcpy。将yuv数据分别copy到不同的内存中用于和不同的纹理绑定。

  一张图片的数据量太大,这里近模拟一下YUV数据。能说明问题,能看得懂就行。重点看一下注释的内容即可。

二、代码示例

char data[] = { 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','U','U','U','U','U','V','V','V','V','V' };
qDebug() << "原始数据:";
for (int i = 0;i < 20;i++) {
    qDebug() << "data->i=" << data[i];
}
int y_length = 10;
int u_length = 5;
int v_length = 5;
char* y_data = new  char[10];
char* u_data = new  char[5];
char* v_data = new  char[5];
//把内存中的char初始化为0
memset(y_data, '0', 10);
memset(u_data, '0', 5);
memset(v_data, '0', 5);
qDebug() << "copy前的数据:";
for (int i = 0;i < 10;i++) {
    qDebug() << "y_data->i=" << y_data[i];
}
for (int i = 0;i < 5;i++) {
    qDebug() << "u_data->i=" << u_data[i];
}
for (int i = 0;i < 5;i++) {
    qDebug() << "v_data->i=" << v_data[i];
}
//这块是重点
//将data中的y_length长度的数据copy到y_data,从第0个位置开始copy
memcpy(y_data, data, y_length);
//从data中copy u_length长度的数据到u_data中。从y_length位置开始copy
memcpy(u_data, data + y_length, u_length);
//从data中copy v_length长度的数据到v_data中,从y_length+u_length位置开始copy
memcpy(v_data, data + y_length + u_length, v_length);
qDebug() << "copy后的数据:";
for (int i = 0;i < 10;i++) {
    qDebug() << "y_data->i=" << y_data[i];
}
for (int i = 0;i < 5;i++) {
    qDebug() << "u_data->i=" << u_data[i];
}
for (int i = 0;i < 5;i++) {
    qDebug() << "v_data->i=" << v_data[i];
}
delete y_data;
delete u_data;
delete v_data;

  测试结果:

 

 

  

标签:分段,YUV,GPU,copy,memcpy,分量
From: https://www.cnblogs.com/tony-yang-flutter/p/18421052

相关文章

  • 使用WM_COPYDATA实现进程间通信
    发送端LRESULTcopyData;//copyDataResulthasvaluereturnedbyotherappCWnd*pOtherWnd=CWnd::FindWindow(NULL,_T("窗体名"));CStringstrData;strData.Format(L"%.1lf",tickdata);if(pOtherWnd){ COPYDATASTRUCTcpd;//上面提到的结构体 cpd.......
  • Monetization of Copywriting
    Copywritingisthepracticeofwritingpersuasivecontentwiththegoalofconvincinganaudiencetotakeaparticularaction.Thiscaninvolvecraftingads,productdescriptions,websitecontent,emailcampaigns,socialmediaposts,andmore.Theprimary......
  • 什么是内存分页和分段
    内存分页和分段是操作系统用于管理内存的一种技术,旨在提高内存的使用效率和安全性。它们各自有不同的结构和目的。1.内存分页(Paging)概述内存分页是一种将物理内存划分为固定大小的块(称为页,通常为4KB)和将逻辑地址空间划分为相同大小的块(称为页表)的机制。分页允许不连续的物理内......
  • ssh密钥批量分发 ssh-copy-id shell脚本
    所有linux主机之间(包含本主机)root用户实现密钥ssh认证,禁用密码认证。1.shrm-rf~/.ssh/{known_hosts,id_rsa*}ssh-keygen-trsa-N''-f~/.ssh/id_rsayum-yinstallexpecttclforiin{1..3}do expect<<[email protected].$iexpect"ye......
  • Datawhale X 李宏毅苹果书 AI夏令营-深度学习入门班-task2-分段线性曲线
    引入上一篇文章中我们了解了机器学习中最基本的模型线性模型(Linearmodels),由于其过于简单(只能调整其斜率w与截距b)无法反映真实数据中多数折线或曲线情况这种限制称为模型偏差(modelbias)。下文介绍:如何构建更复杂,误差更小的函数解决问题。注:此处的bias与线性模型中的b不同。......
  • 美团面试:10Wtps,Kafka为啥那快?kafka 零复制 Zero-copy 如何实现?
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • appsettins.json 复制到输出文件夹 CopyToOutpuDirectory 配置文件 csproj
    复制配置文件到输出文件夹<ItemGroup><NoneUpdate="appsettings.json"><CopyToOutputDirectory>Always</CopyToOutputDirectory></None><NoneUpdate="nlog.config"CopyToOutputDirectory="Always&qu......
  • BeanUtils.copyProperties方法
    BeanUtils.copyProperties方法通常是通过反射(Reflection)实现的。这个方法是ApacheCommonsBeanUtils库中的一个核心功能,它允许开发者在运行时动态地访问和操作对象的属性和方法。通过使用反射,BeanUtils.copyProperties能够检查对象的类定义,找出可用的getter和setter......
  • Adobe InCopy(IC)文字处理软件win/mac软件下载安装 系统要求和使用教程
    目录一、AdobeIC软件介绍1.1软件概述1.2软件特点1.3适用范围二、系统要求2.1Windows系统要求2.2macOS系统要求三、安装步骤3.1Windows系统安装步骤3.2macOS系统安装步骤四、使用教程4.1基本操作4.2高级功能4.3注意事项一、AdobeIC软件介绍1.1软......
  • Win32基于Refs实现 Copy On Write
    Refs相对Ntfs来说,有一个很重要的技术BlockClone。块克隆指令文件系统代表应用程序复制一段文件字节,目标文件可能与源文件相同,也可能不同。不幸的是,传统的复制操作成本高昂,因为它们会触发对底层物理数据的昂贵读写操作。然而,在ReFS中,块克隆执行的是低成本元数据操作,而不是读取......