使用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;
测试结果: