随笔 - 632  文章 - 17  评论 - 54  阅读 - 93万

使用memcpy进行分段copy

一、概述

  使用场景:在音视频开发中,用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;
复制代码

  测试结果:

 

 

  

posted on   飘杨......  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

点击右上角即可分享
微信分享提示