Stefan Schuermans commited on 2018-08-14 19:32:07
Showing 2 changed files, with 17 additions and 11 deletions.
... | ... |
@@ -279,18 +279,19 @@ bool Distri::on_packet(Glib::IOCondition condition) |
279 | 279 |
// check magic, 3 channels and maxval 0xFF |
280 | 280 |
if (buffer[ 0] == 0x23 && buffer[ 1] == 0x54 && |
281 | 281 |
buffer[ 2] == 0x26 && buffer[ 3] == 0x66 && |
282 |
- buffer[ 8] == 0x00 && buffer[ 9] == 0x03 && |
|
282 |
+ buffer[ 8] == 0x00 && (buffer[9] == 0x01 || buffer[9] == 0x03) && |
|
283 | 283 |
buffer[10] == 0x00 && buffer[11] == 0xFF) { |
284 |
- // get outputs (height) and pixels (width) |
|
284 |
+ // get outputs (height), pixels (width) and channels |
|
285 | 285 |
unsigned int outputs = (unsigned int)buffer[4] << 8 | |
286 | 286 |
(unsigned int)buffer[5]; |
287 | 287 |
unsigned int pixels = (unsigned int)buffer[6] << 8 | |
288 | 288 |
(unsigned int)buffer[7]; |
289 |
+ unsigned int channels = buffer[9]; |
|
289 | 290 |
// check data length |
290 |
- if (sz >= 12 + outputs * pixels * 3) { |
|
291 |
+ if (sz >= 12 + outputs * pixels * channels) { |
|
291 | 292 |
uint8_t const *data = buffer + 12; |
292 | 293 |
// process pixel data |
293 |
- procPixelData(outputs, pixels, data); |
|
294 |
+ procPixelData(outputs, pixels, channels, data); |
|
294 | 295 |
} |
295 | 296 |
} |
296 | 297 |
} |
... | ... |
@@ -305,10 +306,11 @@ bool Distri::on_packet(Glib::IOCondition condition) |
305 | 306 |
* @brief process pixel data |
306 | 307 |
* @param[in] outputs number of outputs in pixel data |
307 | 308 |
* @param[in] pixels number of pixels per output in pixel data |
309 |
+ * @param[in] channels number of channels in pixel data |
|
308 | 310 |
* @param[in] data pixel data |
309 | 311 |
*/ |
310 | 312 |
void Distri::procPixelData(unsigned long outputs, unsigned long pixels, |
311 |
- uint8_t const *data) |
|
313 |
+ unsigned int channels, uint8_t const *data) |
|
312 | 314 |
{ |
313 | 315 |
// get mappings |
314 | 316 |
Mapping const & mapRed = m_mappings[Mapping::Red ]; |
... | ... |
@@ -316,26 +318,29 @@ void Distri::procPixelData(unsigned long outputs, unsigned long pixels, |
316 | 318 |
Mapping const & mapBlue = m_mappings[Mapping::Blue ]; |
317 | 319 |
|
318 | 320 |
// traverse all outputs and pixels |
321 |
+ unsigned int ofs_r = 0; |
|
322 |
+ unsigned int ofs_g = channels >= 2 ? 1 : 0; |
|
323 |
+ unsigned int ofs_b = channels >= 3 ? 2 : 0; |
|
319 | 324 |
OutputMap::iterator out = m_outputMap.begin(); |
320 | 325 |
OutputMap::iterator outend = m_outputMap.end(); |
321 | 326 |
unsigned long o = 0; |
322 | 327 |
unsigned long oi = 0; |
323 |
- for (; out != outend; ++out, ++o, oi += pixels * 3) { |
|
328 |
+ for (; out != outend; ++out, ++o, oi += pixels * channels) { |
|
324 | 329 |
Output &output = out->second; |
325 | 330 |
std::vector<Pixel>::iterator pix = output.m_pixels.begin(); |
326 | 331 |
std::vector<Pixel>::iterator pixend = output.m_pixels.end(); |
327 | 332 |
unsigned long p = 0; |
328 | 333 |
unsigned long pi = oi; |
329 |
- for (; pix != pixend; ++pix, ++p, pi += 3) { |
|
334 |
+ for (; pix != pixend; ++pix, ++p, pi += channels) { |
|
330 | 335 |
Pixel &pixel = *pix; |
331 | 336 |
|
332 | 337 |
// default color: black (in case pixel is not in pixel data) |
333 | 338 |
uint8_t r = 0, g = 0, b = 0; |
334 | 339 |
// get color of pixel from data |
335 | 340 |
if (o < outputs && p < pixels) { |
336 |
- r = mapRed .display2video(data[pi + 0]); |
|
337 |
- g = mapGreen.display2video(data[pi + 1]); |
|
338 |
- b = mapBlue .display2video(data[pi + 2]); |
|
341 |
+ r = mapRed .display2video(data[pi + ofs_r]); |
|
342 |
+ g = mapGreen.display2video(data[pi + ofs_g]); |
|
343 |
+ b = mapBlue .display2video(data[pi + ofs_b]); |
|
339 | 344 |
} |
340 | 345 |
// store color |
341 | 346 |
pixel.setColor(r, g, b); |
... | ... |
@@ -132,10 +132,11 @@ protected: |
132 | 132 |
* @brief process pixel data |
133 | 133 |
* @param[in] outputs number of outputs in pixel data |
134 | 134 |
* @param[in] pixels number of pixels per output in pixel data |
135 |
+ * @param[in] channels number of channels in pixel data |
|
135 | 136 |
* @param[in] data pixel data |
136 | 137 |
*/ |
137 | 138 |
void procPixelData(unsigned long outputs, unsigned long pixels, |
138 |
- uint8_t const *data); |
|
139 |
+ unsigned int channels, uint8_t const *data); |
|
139 | 140 |
|
140 | 141 |
protected: |
141 | 142 |
/// output data |
142 | 143 |