1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
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();
}
|