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;
        }
    }


原文地址:https://www.cnblogs.com/sammei/p/3295596.html