YUY2转RGB 的各种版本


//YUY2视频转化RGB格式 by hardy 2007-10-17
//http://www.fourcc.org/fccyvrgb.php
inline void YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
{

 //B = 1.164(Y - 16)         + 2.018(U - 128)
 //G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
 //R = 1.164(Y - 16) + 1.596(V - 128)
 BYTE *orgRGBbuff = RGBbuff;
 for(DWORD count=0;count<dwSize;count+=4)
 {
  //Y0 U0 Y1 V0
  float Y0 = *YUY2buff;
  float U = *(++YUY2buff);
  float Y1 = *(++YUY2buff);
  float V = *(++YUY2buff);
  ++YUY2buff;

  *(RGBbuff) =   (BYTE)(Y0 + (1.370705 * (V-128)));          
  *(++RGBbuff) = (BYTE)(Y0 - (0.698001 * (V-128)) - (0.337633 * (U-128)));  
  *(++RGBbuff) = (BYTE)(Y0 + (1.732446 * (U-128)));        

  *(++RGBbuff) = (BYTE)(Y1 + (1.370705 * (V-128)));          
  *(++RGBbuff) = (BYTE)(Y1 - (0.698001 * (V-128)) - (0.337633 * (U-128)));  
  *(++RGBbuff) = (BYTE)(Y1 + (1.732446 * (U-128)));        
  ++RGBbuff;
 }
}
inline void YUY2_RGB2(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
{

//R = Y + 1.14V
//G = Y - 0.39U - 0.58V
//B = Y + 2.03U

// R = Y + 1.403V'
//G = Y - 0.344U' - 0.714V'
//B = Y + 1.770U'
 BYTE *orgRGBbuff = RGBbuff;
 for(DWORD count=0;count<dwSize;count+=4)
 {
  //Y0 U0 Y1 V0
  float Y0 = *YUY2buff;
  float U = *(++YUY2buff);
  float Y1 = *(++YUY2buff);
  float V = *(++YUY2buff);
  ++YUY2buff;

  float R,G,B;
  
  R = (Y0 + 1.14f*V);
  G=(Y0 - 0.39f*U-0.58f*V);  
  B=(Y0 +2.03f*U);
  if(R<0) R =0;
  if(R>255) R=255;
  if(G<0) G =0;
  if(G>255) G=255;
  if(B<0) B =0;
  if(B>255) B=255;

  *(RGBbuff) =     (BYTE)B;         
  *(++RGBbuff) =  (BYTE)G;
  *(++RGBbuff) =  (BYTE)R;

  R = (Y1 + 1.14f*V);
  G=(Y1 - 0.39f*U-0.58f*V);  
  B=(Y1 +2.03f*U)   ;
  if(R<0) R =0;
  if(R>255) R=255;
  if(G<0) G =0;
  if(G>255) G=255;
  if(B<0) B =0;
  if(B>255) B=255;

  *(++RGBbuff) =     (BYTE)B;         
  *(++RGBbuff) =  (BYTE)G;
  *(++RGBbuff) =  (BYTE)R;
  ++RGBbuff;
 }
}

inline void YUY2_RGB4(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
{


// R = Y + 1.403V'
//G = Y - 0.344U' - 0.714V'
//B = Y + 1.770U'
 BYTE *orgRGBbuff = RGBbuff;
 for(DWORD count=0;count<dwSize;count+=4)
 {
  //Y0 U0 Y1 V0
  float Y0 = *YUY2buff;
  float U = *(++YUY2buff);
  float Y1 = *(++YUY2buff);
  float V = *(++YUY2buff);
  ++YUY2buff;

  float R,G,B;
  
  R = (Y0 + 1.403f*V);
  G=(Y0 - 0.344f*U-0.714f*V);  
  B=(Y0 +1.77f*U);
  if(R<0) R =0;
  if(R>255) R=255;
  if(G<0) G =0;
  if(G>255) G=255;
  if(B<0) B =0;
  if(B>255) B=255;

  *(RGBbuff) =     (BYTE)R;         
  *(++RGBbuff) =  (BYTE)G;
  *(++RGBbuff) =  (BYTE)B;
  R = (Y1 + 1.403f*V);
  G=(Y1 - 0.344f*U-0.714f*V);  
  B=(Y1 +1.77f*U);
  if(R<0) R =0;
  if(R>255) R=255;
  if(G<0) G =0;
  if(G>255) G=255;
  if(B<0) B =0;
  if(B>255) B=255;

  *(++RGBbuff) =     (BYTE)R;         
  *(++RGBbuff) =  (BYTE)G;
  *(++RGBbuff) =  (BYTE)B;
  ++RGBbuff;
 }
}

inline void YUY2_RGB3(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
{

 //B = 1.164(Y - 16)         + 2.018(U - 128)
 //G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
 //R = 1.164(Y - 16) + 1.596(V - 128)
 BYTE *orgRGBbuff = RGBbuff;
 for(DWORD count=0;count<dwSize;count+=4)
 {
  //Y0 U0 Y1 V0
  float Y0 = *YUY2buff;
  float U = *(++YUY2buff);
  float Y1 = *(++YUY2buff);
  float V = *(++YUY2buff);
  ++YUY2buff;

  *(RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));          
  *(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));  
  *(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));        

  *(++RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));          
  *(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));  
  *(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));         
  ++RGBbuff;
  
 }
}
// http://msdn2.microsoft.com/en-us/library/ms893078.aspx
void VC4000Graber::YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
{
//
//C = Y - 16
//D = U - 128
//E = V - 128
//R = clip(( 298 * C           + 409 * E + 128) >> 8)
//G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)
//B = clip(( 298 * C + 516 * D           + 128) >> 8)
 BYTE *orgRGBbuff = RGBbuff;
 for(DWORD count=0;count<dwSize;count+=4)
 {
  //Y0 U0 Y1 V0
  BYTE Y0 = *YUY2buff;
  BYTE U = *(++YUY2buff);
  BYTE Y1 = *(++YUY2buff);
  BYTE V = *(++YUY2buff);
  ++YUY2buff;

  LONG Y,C,D,E;
  BYTE R,G,B;
  
  Y = Y0;
  C = Y-16;
  D = U-128;
  E = V-128;
  R = clip255(( 298 * C           + 409 * E + 128) >> 8);
  G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);
  B = clip255(( 298 * C + 516 * D           + 128) >> 8);

  *(RGBbuff) =   B;          
  *(++RGBbuff) = G;  
  *(++RGBbuff) = R;        

  Y = Y1;
  C = Y-16;
  D = U-128;
  E = V-128;
  R = clip255(( 298 * C           + 409 * E + 128) >> 8);
  G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);
  B = clip255(( 298 * C + 516 * D           + 128) >> 8);
  *(++RGBbuff) =   B;          
  *(++RGBbuff) = G;  
  *(++RGBbuff) = R;        
  ++RGBbuff;
  
 }
}

BYTE VC4000Graber::clip255(LONG v)
{
 if(v<0) v=0;
 else if(v>255) v=255;
 return (BYTE)v;
}


 

已标记关键词 清除标记
相关推荐
程序员的必经之路! 【限时优惠】 现在下单,还享四重好礼: 1、教学课件免费下载 2、课程案例代码免费下载 3、专属VIP学员群免费答疑 4、下单还送800元编程大礼包 【超实用课程内容】  根据《2019-2020年中国开发者调查报告》显示,超83%的开发者都在使用MySQL数据库。使用量大同时,掌握MySQL早已是运维、DBA的必备技能,甚至部分IT开发岗位也要求对数据库使用和原理有深入的了解和掌握。 学习编程,你可能会犹豫选择 C++ 还是 Java;入门数据科学,你可能会纠结于选择 Python 还是 R;但无论如何, MySQL 都是 IT 从业人员不可或缺的技能!   套餐中一共包含2门MySQL数据库必学的核心课程(共98课时)   课程1:《MySQL数据库从入门到实战应用》   课程2:《高性能MySQL实战课》   【哪些人适合学习这门课程?】  1)平时只接触了语言基础,并未学习任何数据库知识的人;  2)对MySQL掌握程度薄弱的人,课程可以让你更好发挥MySQL最佳性能; 3)想修炼更好的MySQL内功,工作中遇到高并发场景可以游刃有余; 4)被面试官打破沙锅问到底的问题问到怀疑人生的应聘者。 【课程主要讲哪些内容?】 课程一:《MySQL数据库从入门到实战应用》 主要从基础篇,SQL语言篇、MySQL进阶篇三个角度展开讲解,帮助大家更加高效的管理MySQL数据库。 课程二:《高性能MySQL实战课》主要从高可用篇、MySQL8.0新特性篇,性能优化篇,面试篇四个角度展开讲解,帮助大家发挥MySQL的最佳性能的优化方法,掌握如何处理海量业务数据和高并发请求 【你能收获到什么?】  1.基础再提高,针对MySQL核心知识点学透,用对; 2.能力再提高,日常工作中的代码换新貌,不怕问题; 3.面试再加分,巴不得面试官打破沙锅问到底,竞争力MAX。 【课程如何观看?】  1、登录CSDN学院 APP 在我的课程中进行学习; 2、移动端:CSDN 学院APP(注意不是CSDN APP哦)  本课程为录播课,课程永久有效观看时长 【资料开放】 课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化。  下载方式:电脑登录课程观看页面,点击右侧课件,可进行课程资料的打包下载。
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页