diff options
Diffstat (limited to 'pixelflut.c')
-rw-r--r-- | pixelflut.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/pixelflut.c b/pixelflut.c new file mode 100644 index 0000000..15dcc55 --- /dev/null +++ b/pixelflut.c @@ -0,0 +1,72 @@ + +#include <stdlib.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <netdb.h> +#include <string.h> +#include <stdio.h> +#include <unistd.h> +#include <errno.h> + +#define PIXEL_FORMAT "PX %zd %zd %02x%02x%02x\n" +int cct(const char *target, int port) { + printf("Reconnecting %s:%d\n", target, port); + int sockfd = socket(AF_INET, SOCK_STREAM, 0); + if (!sockfd) { + fprintf(stderr, "No sockfd.\n"); + return -1; + } + + struct sockaddr_in serv_addr; + memset(&serv_addr, 0, sizeof(serv_addr)); + serv_addr.sin_family = AF_INET; + serv_addr.sin_port = htons(port); + if (inet_pton(AF_INET, target, &serv_addr.sin_addr) != 1) { + fprintf(stderr, "Address error. \"%s\"\n", target); + return -2; + } + + if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr))) { + fprintf(stderr, "Connect error.\n"); + return -3; + } + + return sockfd; +} + +int sendframe(int fd, uint8_t *img, int w, int h, int ox, int oy) { + static unsigned long fcnt=0; + printf("frame %lu %dx%d @pos %dx%d\n", fcnt++, w, h, ox, oy); + int fmtlen = snprintf(NULL, 0, PIXEL_FORMAT, (size_t)1000, (size_t)1000, 0xff, 0xff, 0xff); + char *out = malloc(1400); + if (!out) { + fprintf(stderr, "Malloc error.\n"); + return -4; + } + char *p = out; + for (size_t x=0; x<w; x++) { + for (size_t y=0; y<h; y++) { + uint8_t *px = img + (y*w + x)*4; + uint8_t r = px[0], g = px[1], b = px[2], a = px[3]; + if (a != 255) + continue; + size_t cx = ox+x, cy = oy+y; + p += snprintf(p, fmtlen+1, PIXEL_FORMAT, cx, cy, r, g, b); + if (p-out > 1400-fmtlen-1) { + if (send(fd, out, p-out, 0) < 0) { + fprintf(stderr, "Send error. %d %s\n", errno, strerror(errno)); + return -5; + } + p = out; + } + } + } + free(out); + usleep(1000); + return 0; +} + +void discct(int fd) { + close(fd); +} |