Chinaunix首页 | 论坛 | 博客
  • 博客访问: 318697
  • 博文数量: 71
  • 博客积分: 1450
  • 博客等级: 上尉
  • 技术积分: 762
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-14 13:31
文章分类

全部博文(71)

文章存档

2014年(3)

2013年(8)

2011年(9)

2010年(38)

2009年(13)

我的朋友

分类: LINUX

2009-11-09 12:10:24

  1. static void ccvt_420p_rgb565(int width, int height, const unsigned char *src, __u16 *dst)  
  2. {  
  3. int line, col, linewidth;  
  4. int y, u, v, yy, vr, ug, vg, ub;  
  5. int r, g, b;  
  6. const unsigned char *py, *pu, *pv;  
  7.   
  8. linewidth = width >> 1;  
  9. py = src;  
  10. pu = py + (width * height);  
  11. pv = pu + (width * height) / 4;  
  12.   
  13. y = *py++;  
  14. yy = y << 8;  
  15. u = *pu - 128;  
  16. ug =   88 * u;  
  17. ub = 454 * u;  
  18. v = *pv - 128;  
  19. vg = 183 * v;  
  20. vr = 359 * v;  
  21.   
  22. for (line = 0; line < height; line++) {  
  23.    for (col = 0; col < width; col++) {  
  24.     r = (yy +      vr) >> 8;  
  25.     g = (yy - ug - vg) >> 8;  
  26.     b = (yy + ub     ) >> 8;  
  27.   
  28.     if (r < 0)   r = 0;  
  29.     if (r > 255) r = 255;  
  30.     if (g < 0)   g = 0;  
  31.     if (g > 255) g = 255;  
  32.     if (b < 0)   b = 0;  
  33.     if (b > 255) b = 255;  
  34.    *dst++ = (((__u16)r>>3)<<11) | (((__u16)g>>2)<<5) | (((__u16)b>>3)<<0);  
  35.     
  36.     y = *py++;  
  37.     yy = y << 8;  
  38.     if (col & 1) {  
  39.      pu++;  
  40.      pv++;  
  41.   
  42.      u = *pu - 128;  
  43.      ug =   88 * u;  
  44.      ub = 454 * u;  
  45.      v = *pv - 128;  
  46.      vg = 183 * v;  
  47.      vr = 359 * v;  
  48.     }  
  49.    } /* ..for col */  
  50.    if ((line & 1) == 0) { // even line: rewind  
  51.     pu -= linewidth;  
  52.     pv -= linewidth;  
  53.    }  
  54. /* ..for line */  

yuv422->rgb565
  1. #define YCbCrtoR(Y,Cb,Cr) (1000*Y + 1371*(Cr-128))/1000  
  2. #define YCbCrtoG(Y,Cb,Cr) (1000*Y - 336*(Cb-128) - 698*(Cr-128))/1000  
  3. #define YCbCrtoB(Y,Cb,Cr) (1000*Y + 1732*(Cb-128))/1000  
  4. #define min(x1, x2)   (((x1)<(x2))?(x1):(x2))  
  5.   
  6. __u32 Conv_YCbCr_Rgb(__u8 y0, __u8 y1, __u8 cb0, __u8 cr0)  
  7. {  
  8. // bit order is  
  9. // YCbCr = [Cr0 Y1 Cb0 Y0], RGB=[R1,G1,B1,R0,G0,B0].  
  10.   
  11. int r0, g0, b0, r1, g1, b1;  
  12. __u16 rgb0, rgb1;  
  13. __u32 rgb;  
  14.   
  15. #if 1 // 4 frames/s @192MHz, 12MHz ; 6 frames/s @450MHz, 12MHz  
  16. r0 = YCbCrtoR(y0, cb0, cr0);  
  17. g0 = YCbCrtoG(y0, cb0, cr0);  
  18. b0 = YCbCrtoB(y0, cb0, cr0);  
  19. r1 = YCbCrtoR(y1, cb0, cr0);  
  20. g1 = YCbCrtoG(y1, cb0, cr0);  
  21. b1 = YCbCrtoB(y1, cb0, cr0);  
  22. #endif  
  23.   
  24. if (r0>255 ) r0 = 255;  
  25. if (r0<0) r0 = 0;  
  26. if (g0>255 ) g0 = 255;  
  27. if (g0<0) g0 = 0;  
  28. if (b0>255 ) b0 = 255;  
  29. if (b0<0) b0 = 0;  
  30.   
  31. if (r1>255 ) r1 = 255;  
  32. if (r1<0) r1 = 0;  
  33. if (g1>255 ) g1 = 255;  
  34. if (g1<0) g1 = 0;  
  35. if (b1>255 ) b1 = 255;  
  36. if (b1<0) b1 = 0;  
  37.   
  38. // 5:6:5 16bit format  
  39. rgb0 = (((__u16)r0>>3)<<11) | (((__u16)g0>>2)<<5) | (((__u16)b0>>3)<<0); //RGB565.  
  40. rgb1 = (((__u16)r1>>3)<<11) | (((__u16)g1>>2)<<5) | (((__u16)b1>>3)<<0); //RGB565.  
  41.   
  42. rgb = (rgb1<<16) | rgb0;  
  43.   
  44. return(rgb);  


http://labs.movenda.com/blog/?p=87
阅读(1588) | 评论(0) | 转发(0) |
0

上一篇:alpha blend for rgb565

下一篇:arm汇编资料

给主人留下些什么吧!~~