aboutsummaryrefslogtreecommitdiff
path: root/pix_2pdp.cpp
diff options
context:
space:
mode:
authorGeorg Holzmann <grholzi@users.sourceforge.net>2005-06-17 13:45:22 +0000
committerGeorg Holzmann <grholzi@users.sourceforge.net>2005-06-17 13:45:22 +0000
commita8e7bc2c20f3d404ebc039f573843d8801c30eaa (patch)
tree9c6aed48ab1076a225092961ef0a148a711b1a78 /pix_2pdp.cpp
parent715d78993a78983fe730ab273895eb6257b65528 (diff)
added pix_2pdp
svn path=/trunk/externals/gem2pdp/; revision=3202
Diffstat (limited to 'pix_2pdp.cpp')
-rwxr-xr-xpix_2pdp.cpp106
1 files changed, 106 insertions, 0 deletions
diff --git a/pix_2pdp.cpp b/pix_2pdp.cpp
new file mode 100755
index 0000000..2fb8903
--- /dev/null
+++ b/pix_2pdp.cpp
@@ -0,0 +1,106 @@
+/*
+ * pix_2pdp : pix to pdp bridge
+ *
+ * Capture the contents of the Gem pix and transform it to a PDP Packet whenever a bang is received
+ *
+ * Based on code of gem2pdp by Yves Degoyon
+ * Many thanks to IOhannes M Zmölnig
+ *
+ * Copyright (c) 2005 Georg Holzmann <grh@mur.at>
+ *
+ */
+
+#include "pix_2pdp.h"
+#include "yuv.h"
+
+CPPEXTERN_NEW(pix_2pdp)
+
+pix_2pdp::pix_2pdp(void)
+{
+ gem_image = NULL;
+ m_pdpoutlet = outlet_new(this->x_obj, &s_anything);
+}
+
+pix_2pdp::~pix_2pdp()
+{
+ gem_image = NULL;
+ gem_xsize = 0;
+ gem_ysize = 0;
+ gem_csize = 0;
+}
+
+// Image processing
+void pix_2pdp::processImage(imageStruct &image)
+{
+ gem_image = image.data;
+ gem_xsize = image.xsize;
+ gem_ysize = image.ysize;
+ gem_csize = image.csize;
+ gem_format = image.format;
+}
+
+// pdp processing
+void pix_2pdp::bangMess()
+{
+ t_int psize, px, py;
+ short int *pY, *pU, *pV;
+ unsigned char r,g,b;
+ 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);
+
+ 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++)
+ {
+ // 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) )
+ {
+ pV++; pU++;
+ }
+ }
+ }
+
+ pdp_packet_pass_if_valid(m_pdpoutlet, &m_packet0);
+
+ }
+ else
+ {
+ post( "pix_2pdp: Sorry, Gem-input RGB only for now!" );
+ }
+ }
+}
+
+void pix_2pdp::obj_setupCallback(t_class *classPtr)
+{
+ post( "pix_2pdp : a bridge between a Gem pix and PDP/PiDiP, Georg Holzmann 2005 <grh@mur.at>" );
+ class_addmethod(classPtr, (t_method)&pix_2pdp::bangMessCallback,
+ gensym("bang"), A_NULL);
+}
+
+void pix_2pdp::bangMessCallback(void *data)
+{
+ GetMyClass(data)->bangMess();
+}