yuv 笔记
做Android camera时遇到这些知识,记个笔记。
http://zh.wikipedia.org/zh-cn/YUV
http://www.fourcc.org/yuv.php
http://ticktick.blog.51cto.com/823160/555791
YUV用于表示一种颜色空间,Y表示明亮度,U表示色度,V表示浓度。
根据数据的存储不同,YUV分为两类:
1. 紧凑格式 (packed formats): 将Y、U、V值混合在一起存储,与RGB存放方式类似。
2. 平面格式 (planar formats): 将Y、U、V三个分量分别存放在不同矩阵中。
RGB格式里分为RGB565/666/888等,同样,YUV下也有许多的具体格式实现。这些不同的实现都采用
YUV的表示方法,但不同的是Y、U、V三个分量在水平和垂直两个方向的采样间隔不同。这里描述几个
常用的格式。
* Packed YUV Formats
====================
1. UYVY (Y422/UYNV)
这是最常用的 YUV 4:2:2 格式。U、V分量在水平方向采样间隔为2个周期。
每个像素占16-bit,数据排列为: U0Y0V0Y1,U2Y2V2Y3,U4Y4V4Y5
2. YUYV (YUY2/YUNV/V422)
另一个 YUV 4:2:2 的常用格式。与UYVY类似,但分量数据的布局不同:
Y0U0Y1V0,Y2U2Y3V2,Y4U4Y5V4
4. Y41P
YUV 4:1:1, U、V分量在水平方向采样间隔为4个周期。每个像素占12-bit。
U0Y0V0Y1,U4Y2V4Y3,Y4Y5Y6Y7
* Planar YUV Formats
====================
0. NV12 和 NV21
YUV 4:2:0的紧凑格式,U、V在水平和垂直方向的采样间隔都是2个周期。
U和V分量交错存储。
1. YV12 / YV21
YUV 4:2:0, 与NV12/NV21不同,U和V依次存储
3. YVU9
...
void CameraHal::convertNV12toNV21(uint8_t *inputBuffer, uint8_t *outputBuffer, int width, int height) { /* Color space conversion from NV12 to NV21 */ // NV12 to NV21 int Ysize = 0, UVsize = 0; uint8_t *Yin, *Uin, *Vin, *Yout, *Uout, *Vout; Ysize = width * height; UVsize = width * height >> 2; Yin = inputBuffer; Uin = Yin + Ysize; Vin = Uin + 1; Yout = outputBuffer; Vout = Yout + Ysize; Uout = Vout + 1; memcpy(Yout, Yin, Ysize); for(int k = 0; k < UVsize; k++) { *Uout = *Uin; *Vout = *Vin; Uout += 2; Vout += 2; Uin += 2; Vin += 2; } }