YUV420P,Y,U,V三个分量都是平面格式,分为I420和YV12。在I420格式(即:YUV);但YV12则是相反(即:YVU)。
YUV420SP, Y分量平面格式,UV打包格式, 即NV12。 NV12与NV21类似,U 和 V 交错排列,不同在于UV顺序。
I420: YYYYYYYY UU VV =>YUV420P
YV12: YYYYYYYY VV UU =>YUV420P
NV12: YYYYYYYY UVUV =>YUV420SP
NV21: YYYYYYYY VUVU =>YUV420SP
Nv21 yuv格式如下:
YYYYYYYY
YYYYYYYY
YYYYYYYY
YYYYYYYY
VUVU
VUVU
VUVU
VUVU
I420格式如下:
YYYYYYYY
YYYYYYYY
YYYYYYYY
YYYYYYYY
UUUU
UUUU
VVVV
VVVV
Yuv420SP(NV12)格式如下:
YYYYYYYY
YYYYYYYY
YYYYYYYY
YYYYYYYY
UVUV
UVUV
UVUV
UVUV
Nv21 转 YUV420P
/* @param data Nv21数据
* @param dstData I420(YUV420)数据
* @param w 宽度
* @param h 长度
*/
public static void Nv21ToI420(byte[] data, byte[] dstData, int w, int h) {
int size = w * h;
// Y 数组前size个字节放置Y的数据
System.arraycopy(data, 0, dstData, 0, size);
for (int i = 0; i < size / 4; i++) {
//U 数组从size开始到size + size/4的范围存放U数据
dstData[size + i] = data[size + i * 2 + 1];
//V 数组从size + size/4开始到size +size/2的范围存放V数据
dstData[size + size / 4 + i] = data[size + i * 2];
}
}
Nv21 转 YUV420SP(Nv12)
/ * 将Nv21数据转换为Yuv420SP数据
* @param data Nv21数据
* @param dstData Yuv420sp数据
* @param w 宽度
* @param h 高度
*/
public static void Nv21ToYuv420SP(byte[] data, byte[] dstData, int w, int h) {
int size = w * h;
// Y 数组前size个字节放置Y的数据
System.arraycopy(data, 0, dstData, 0, size);
for (int i = 0; i < size / 4; i++) {
//U,V 从size开始 源数组与目标数组奇偶数位置置换
dstData[size + i * 2] = data[size + i * 2 + 1]; //U
dstData[size + i * 2 + 1] = data[size + i * 2]; //V
}
}