两年多以前,写了一个生成UYVY格式的函数。记得那时我们部门4、5个人在“小黑屋”里开发新平台,我要在“踢啊”某个芯片上实现屏幕的显示,其格式是UYVY,由于无实际的图像,于是就动手自己写了一个。虽然我们大费周折实现视频的显示、菜单功能,但可惜未使用。
YUV444格式没有进行压缩,占用空间为with*height*3
,与RGB占用空间相同。在转换上也很方便,但很多编码器似乎不太支持该格式。或许和其占用空间有莫大的关联吧。
YUYV、YVYU、UYVY、VYUY,都是YUV422的打包格式——即在内存中,Y、U、V都是挨着排序的。它们的名称就表示了Y、U、V的顺序。像YUYV,就是Y、U、Y、V、Y、U、Y、V。在填充这些格式时,就显得很容易、简单了。
另外一种常见的格式是YUV420。从本文章开始,会集中写一下关于YUV的格式转换的文字,但又没有研究很多,像采样的具体过程也没有很了解。这里放一张上,可以直观了解YUV422、YUV420的样子。
回到主题上,本文代码是从两年前写的函数基本上修改得来的。填充的内容是不同的颜色条。先上代码,如下:
1 | void init_yuv_buf(YUV_TYPE type, unsigned char* buf, int width, int height) |
其中rainbow_yuv是由rainbow_rgb数组值转换而成的。因为我确定颜色是使用RGB空间的。使用的转换函数如下:
1 | int rgb2YCbCr(unsigned int rgbColor, int* Y, int* Cb, int* Cr) |
对于YUV444而言,Y、U、V占用的空间均为width*height,故在填充时,就分别指定3个分量的指针,然后依次填充即可。
对于YUYV、YVYU、UYVY、VYUY这四种格式,实际上是YUV422采集空间,2个Y对应1个U和1个U。Y、U、V3个分量连续存储,根据顺序,就得到4个格式了。从代码看到,就是根据不同的格式宏定义来调整3个分量。
总之,本文代码没什么技术含量,但对于我的学习,还是有帮助的,姑且写之,姑且用之。
李迟 2015.8.5 晚上