Chinaunix首页 | 论坛 | 博客
  • 博客访问: 643096
  • 博文数量: 151
  • 博客积分: 3498
  • 博客等级: 中校
  • 技术积分: 1570
  • 用 户 组: 普通用户
  • 注册时间: 2005-02-28 18:10
文章分类

全部博文(151)

文章存档

2014年(12)

2013年(17)

2012年(17)

2011年(5)

2010年(12)

2009年(2)

2007年(26)

2006年(22)

2005年(38)

分类: LINUX

2007-08-18 18:37:01

  看了YUV420的采样和存取格式,感觉不是很难理解,所以又做了一个YUV422的SEQUENCE FILE的测试,然后这个测试就发现了一下几点:
1)必须要知道是PACK的还是PLANE的方式存。
2)转换的公式是什么样的。

首先,从上下载了mobile的测试文件。因为这些文件都是一幅图片,所以写了一个程序把它写到一个文件里了。
然后,看他的README文件是这样说它的存取格式的:
+-----------+
+ YUV +
+-----------+
Images in YUV format is planed-oriented, with all data for Y channel
comes first, followed by U and V data.

==========+============+=============+==========================================
Sequence Frames Resolution Remark
==========+============+=============+==========================================
mobile
color 94 720x576 ITU 601/PAL
Interlaced, first field starts
on first line
4:2:2, 50 fields/sec
----------+------------+-------------+------------------------------------------


所以我在YUV420->RGB上修改了CONVERT 函数,实现这种格式的读取:

// convert yuv422(planed) into rgb mode for further dispaly operations
void CYuvTstDlg::convert_yuv422_rgb(unsigned char * src, unsigned char * dst,
int width, int height, int flipUV, int ColSpace)
{
unsigned char *Y, *U, *V ;
int y1, y2, u, v ;
int v1, v2, u1, u2 ;
unsigned char *pty1, *pty2 ;
int i, j ;
unsigned char *RGB1, *RGB2 ;
int r, g, b ;

//Initialization
Y = src;
V = Y + width * height;
U = Y + width * height + width * height / 2;

pty1 = Y;
RGB1 = dst;
for (j = 0; j < height; j++) {
for (i = 0; i < width; i += 2) {
if (flipUV) {
u = (*V++) - 128;
v = (*U++) - 128;
} else {
v = (*V++) - 128;
u = (*U++) - 128;
}

switch (ColSpace) {
case 0:
{
// M$ color space
v1 = ((v << 10) + (v << 9) + (v << 6) + (v << 5)) >> 10; // 1.593
u1 = ((u << 8) + (u << 7) + (u << 4)) >> 10; // 0.390
v2 = ((v << 9) + (v << 4)) >> 10; // 0.515
u2 = ((u << 11) + (u << 4)) >> 10; // 2.015
}
break;
// PAL specific
case 1:
{
v1 = ((v << 10) + (v << 7) + (v << 4)) >> 10; // 1.1406
u1 = ((u << 8) + (u << 7) + (u << 4) + (u << 3)) >> 10; // 0.3984
v2 = ((v << 9) + (v << 6) + (v << 4) + (v << 1)) >> 10; // 0.5800
u2 = ((u << 11) + (u << 5)) >> 10; // 2.0312
}
break;
// V4l2
case 2:
{
v1 = ((v << 10) + (v << 8) + (v << 7) + (v << 5)) >> 10; // 1.406
u1 = ((u << 8) + (u << 6) + (u << 5)) >> 10; // 0.343
v2 = ((v << 9) + (v << 7) + (v << 6) + (v << 5)) >> 10; // 0.718
u2 = ((u << 10) + (u << 9) + (u << 8) + (u << 4) + (u << 3)) >> 10; // 1.773
}
break;
case 3:
{
v1 = u1 = v2 = u2 = 0;
}
break;
default:
break;
} // end switch
//up-left

y1 = (*pty1++);
if (y1 > 0) {
r = y1 + (v1);
g = y1 - (u1) - (v2);
b = y1 + (u2);

r = CLIP (r);
g = CLIP (g);
b = CLIP (b);
} else {
r = g = b = 0;
}
/* *RGB1++ = r; */
/* *RGB1++ = g; */
/* *RGB1++ = b; */
*RGB1++ = b;
*RGB1++ = g;
*RGB1++ = r;

//up-right
y1 = (*pty1++);
if (y1 > 0) {
r = y1 + (v1);
g = y1 - (u1) - (v2);
b = y1 + (u2);

r = CLIP (r);
g = CLIP (g);
b = CLIP (b);
} else {
r = g = b = 0;
}
*RGB1++ = b;
*RGB1++ = g;
*RGB1++ = r;

/* *RGB1++ = r; */
/* *RGB1++ = g; */
/* *RGB1++ = b; */


}
//RGB1 += 3 * width;
//pty1 += width;
}
}

然后转换的效果还不错,就是机器性能不行,显示不太流畅。


然而,对于PACK格式的,下面这个附件里有很完整的函数实现,但是,就是它的CONVER FORMULA不知道是不是正确的。
文件:vpImageConvert.rar
大小:3KB
下载:下载



阅读(5262) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~