最近需要将摄像头采集到的YUYV数据转换为YUV420,在网上找了很多算法,发现写的比较复杂,因此自己写了两个,仅供参考:
void YUV422To420P(char *yuv422, char *yuv420,int i32Height ,int i32Width )
{
if( yuv422 == nullptr || yuv420 == nullptr )
{
return;
}
char *y = nullptr;
char *u = nullptr;
char *v = nullptr;
int i = 0, j = 0,z = 0,GetUvFlag = 0;
char* start = yuv422;
y = yuv420;
u = y + i32Height * i32Width;
v = u + i32Height * i32Width / 4;
for (int row = 0; row < i32Width * i32Height * 2; )
{
y[i++] = start[row];
y[i++] = start[row+2];
if(GetUvFlag%2 == 0)
{
u[j++] = start[row+1];//u
v[z++] = start[row+3];//v
}
row+=4;
if(row%(i32Width*2) == 0)
{
GetUvFlag++;
}
}
}
void YUV422TO420SP(char *yuv422, char *yuv420,int i32Height ,int i32Width )
{
if( yuv422 == nullptr || yuv420 == nullptr )
{
return;
}
char *y = yuv420;
char *uv = yuv420+ i32Width * i32Height ;
char *start = yuv422;
int i = 0, j = 0, GetUvFlag = 0;
for (int row = 0; row < i32Width * i32Height * 2; )
{
y[i++] = start[row];
y[i++] = start[row+2];
//只取偶数行
if(GetUvFlag%2 == 0)
{
uv[j] = start[row+1];//u
uv[j+1] = start[row+3];//v
j+=2;
}
row+=4;
if(row%(i32Width*2) == 0)
{
GetUvFlag++;
}
}
}