#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <time.h>
#include <iostream>
#include <CImg.h>

using namespace cimg_library;

void read(void *p, int s)
{
	while (s) {
		int r = fread(p, sizeof(unsigned char), s, stdin);
		p += r;
		s -= r;
	}
}

int catch_ffs()
{
	int i = 0;
	int x;
	unsigned char c;
	unsigned char buffer[4];

	for (x = 0; x < 4; x++)
		buffer[x] = 0;

	while (1) {
		read(&c, 1);

		buffer[i % 4] = c;

		i++;

		if (buffer[0] == 0xff
			&& buffer[1] == 0xff
			&& buffer[2] == 0xff
			&& buffer[3] == 0xff) {
			return i;
		}
	}

	return -1;
}

int main(int argc, char **argv) {
	char buffer[900];
	CImg<unsigned char> image(120, 120, 1, 1);

	CImgDisplay display(image, "omview");

	fprintf(stderr, "waiting for initial synchronization... ");
	fflush(stderr);
	catch_ffs();
	fprintf(stderr, "done\n");

	while (!display.is_closed()) {
		read(buffer, 900);

		assert(catch_ffs() == 4);

		cimg_forXY(image, x, y) { image(x, y) = buffer[(y >> 2) * 30 + (x >> 2)] * 4; }

		image.display(display);

		fprintf(stderr, "new frame\n");
	}

	return 0;
}
