c语言区分i420,nv21,nv12
时间: 2023-07-27 14:30:21 浏览: 112
I420、NV21和NV12都是YUV420格式,它们的存储方式是不同的。以图像宽度为w,高度为h为例,它们的存储方式如下:
- I420:YYYYYYYY UU VV,其中Y、U、V分别表示亮度、色度。
- NV21:YYYYYYYY VUVU,其中Y、V、U分别表示亮度、色度。
- NV12:YYYYYYYY UVUV,其中Y、U、V分别表示亮度、色度。
下面是一个C语言函数,用于判断输入的数据是否为I420、NV21或NV12格式:
```c
enum YUVFormat {
YUV_I420,
YUV_NV21,
YUV_NV12,
YUV_UNKNOWN,
};
enum YUVFormat getYUVFormat(const unsigned char* data, int width, int height) {
const unsigned char* uv_data = data + width * height;
const unsigned char* u_data = uv_data + 1;
const unsigned char* v_data = uv_data + 2;
// Check if it's I420
if (u_data[width * height / 4] == uv_data[0] && v_data[width * height / 4] == uv_data[width * height / 4 + 1]) {
for (int i = 0; i < width * height / 4; i++) {
if (u_data[i] != uv_data[i * 2 + 1] || v_data[i] != uv_data[i * 2 + 2]) {
return YUV_UNKNOWN;
}
}
return YUV_I420;
}
// Check if it's NV21
if (uv_data[1] == u_data[1] && uv_data[0] == v_data[1]) {
for (int i = 2; i < width * height / 2; i += 2) {
if (uv_data[i] != uv_data[i + 1]) {
return YUV_UNKNOWN;
}
}
return YUV_NV21;
}
// Check if it's NV12
if (uv_data[1] == v_data[1] && uv_data[0] == u_data[1]) {
for (int i = 2; i < width * height / 2; i += 2) {
if (uv_data[i] != uv_data[i + 1]) {
return YUV_UNKNOWN;
}
}
return YUV_NV12;
}
return YUV_UNKNOWN;
}
```
这个函数接受一个unsigned char类型的指针data,以及图片的宽度和高度,通过比较U和V通道的数据来确定图片的格式是否为I420,或者通过比较U和V通道的数据以及UV通道的数据来确定图片的格式是否为NV21或NV12。函数返回值为一个枚举类型,分别表示I420、NV21、NV12和未知格式。
阅读全文