diff options
author | Georg Holzmann <grholzi@users.sourceforge.net> | 2005-06-18 06:29:30 +0000 |
---|---|---|
committer | Georg Holzmann <grholzi@users.sourceforge.net> | 2005-06-18 06:29:30 +0000 |
commit | e755b13e6076689142f24f24c7bfc45d0df41e91 (patch) | |
tree | a687d01f95eae50c9562ba6f18396ad4b846f0a2 | |
parent | a8e7bc2c20f3d404ebc039f573843d8801c30eaa (diff) |
added YUV and Gray support
svn path=/trunk/externals/gem2pdp/; revision=3204
-rwxr-xr-x | pix_2pdp.cpp | 116 |
1 files changed, 80 insertions, 36 deletions
diff --git a/pix_2pdp.cpp b/pix_2pdp.cpp index 2fb8903..34d0a12 100755 --- a/pix_2pdp.cpp +++ b/pix_2pdp.cpp @@ -44,51 +44,95 @@ void pix_2pdp::bangMess() { t_int psize, px, py; short int *pY, *pU, *pV; - unsigned char r,g,b; + unsigned char g1,g2,g3,g4; t_int helper; if(gem_image) { - if(gem_format == GL_RGBA) - { - // make pdp packet - psize = gem_xsize * gem_ysize; - m_packet0 = pdp_packet_new_image_YCrCb( gem_xsize, gem_ysize); - m_header = pdp_packet_header(m_packet0); - m_data = (short int *)pdp_packet_data(m_packet0); + // make pdp packet + psize = gem_xsize * gem_ysize; + m_packet0 = pdp_packet_new_image_YCrCb( gem_xsize, gem_ysize); + m_header = pdp_packet_header(m_packet0); + m_data = (short int *)pdp_packet_data(m_packet0); - pY = m_data; - pV = m_data+psize; - pU = m_data+psize+(psize>>2); - - for ( py=0; py<gem_ysize; py++) - { - for ( px=0; px<gem_xsize; px++) + pY = m_data; + pV = m_data+psize; + pU = m_data+psize+(psize>>2); + + switch(gem_format) + { + // RGB + case GL_RGB: + case GL_RGBA: + for ( py=0; py<gem_ysize; py++) { - // the way to access the pixels: (C=chRed, chBlue, ...) - // image[Y * xsize * csize + X * csize + C] - helper = py*gem_xsize*gem_csize + px*gem_csize; - r=gem_image[helper+chRed]; - g=gem_image[helper+chGreen]; - b=gem_image[helper+chBlue]; - - *(pY) = yuv_RGBtoY( (r<<16) + (g<<8) + b ) << 7; - *(pV) = ( yuv_RGBtoV( (r<<16) + (g<<8) + b ) - 128 ) << 8; - *(pU) = ( yuv_RGBtoU( (r<<16) + (g<<8) + b ) - 128 ) << 8; - pY++; - if ( (px%2==0) && (py%2==0) ) + for ( px=0; px<gem_xsize; px++) { - pV++; pU++; + // the way to access the pixels: (C=chRed, chBlue, ...) + // image[Y * xsize * csize + X * csize + C] + helper = py*gem_xsize*gem_csize + px*gem_csize; + g1=gem_image[helper+chRed]; // R + g2=gem_image[helper+chGreen]; // G + g3=gem_image[helper+chBlue]; // B + + *(pY) = yuv_RGBtoY( (g1<<16) + (g2<<8) + g3 ) << 7; + *(pV) = ( yuv_RGBtoV( (g1<<16) + (g2<<8) + g3 ) - 128 ) << 8; + *(pU) = ( yuv_RGBtoU( (g1<<16) + (g2<<8) + g3 ) - 128 ) << 8; + pY++; + if ( (px%2==0) && (py%2==0) ) + pV++; pU++; } } - } - - pdp_packet_pass_if_valid(m_pdpoutlet, &m_packet0); - - } - else - { - post( "pix_2pdp: Sorry, Gem-input RGB only for now!" ); + pdp_packet_pass_if_valid(m_pdpoutlet, &m_packet0); + break; + + // YUV + case GL_YUV422_GEM: + for ( py=0; py<gem_ysize; py++) + { + for ( px=0; px<gem_xsize; px++) + { + helper = py*gem_xsize*gem_csize + px*gem_csize; + g1=gem_image[helper+chU]; // U + g2=gem_image[helper+chY0]; // Y0 + g3=gem_image[helper+chV]; // V + g4=gem_image[helper+chY1]; // Y1 + + if(px%2==0) + *pY = g2 << 7; + else + *pY = g4 << 7; + pY++; + + *pU = (g1-128) << 8; + *pV = (g3-128) << 8; + if ( (px%2==0) && (py%2==0) ) + pV++; pU++; + } + } + pdp_packet_pass_if_valid(m_pdpoutlet, &m_packet0); + break; + + // grey + case GL_LUMINANCE: + for ( py=0; py<gem_ysize; py++) + { + for ( px=0; px<gem_xsize; px++) + { + *pY = gem_image[py*gem_xsize*gem_csize + px*gem_csize] << 7; + pY++; + if ( (px%2==0) && (py%2==0) ) + { + *pV++=128; + *pU++=128; + } + } + } + pdp_packet_pass_if_valid(m_pdpoutlet, &m_packet0); + break; + + default: + post( "pix_2pdp: Sorry, wrong input type!" ); } } } |