使用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 2024-09-19 17:40  飘杨......  阅读(17)  评论(0编辑  收藏  举报