From 7dac5c4184ce3bdc1e42377c675184c9df979180 Mon Sep 17 00:00:00 2001 From: Charles Lohr Date: Thu, 22 Mar 2018 02:15:40 +0000 Subject: Add orangepitest and fbstream! --- tools/fbstream/fbstream.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 tools/fbstream/fbstream.c (limited to 'tools/fbstream/fbstream.c') diff --git a/tools/fbstream/fbstream.c b/tools/fbstream/fbstream.c new file mode 100644 index 0000000..93c9e98 --- /dev/null +++ b/tools/fbstream/fbstream.c @@ -0,0 +1,136 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define STB_IMAGE_WRITE_IMPLEMENTATION +#include "stb_image_write.h" + +//HTTP stuff blatantly ripped off of https://www.cs.cmu.edu/afs/cs/academic/class/15213-f99/www/class26/tcpserver.c + +#define BUFSIZE 1200000 + +#define WIDTH 2160 +#define HEIGHT 1200 +#define COMPS 4 +#define PORTNO 8080 + +char buf[BUFSIZE]; /* message buffer */ +int jpegsize = 0; + +void myjpegwrite(void *context, void *data, int size) +{ + memcpy( buf + jpegsize, data, size ); + jpegsize += size; +} + + +int main() +{ + uint32_t * copiedrx = malloc( WIDTH * HEIGHT * COMPS ); + //MMap the fb device. + int fd = open("/dev/fb0", O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600); + uint32_t *map; + int FILESIZE = WIDTH*HEIGHT*COMPS; + if (fd == -1) + { + fprintf( stderr,"Error opening file for writing"); + exit(EXIT_FAILURE); + } + map = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if (map == MAP_FAILED) { + close(fd); + fprintf( stderr,"Error mmapping the file"); + exit(EXIT_FAILURE); + } + + + //An awful single-thread TCP server. + int parentfd; /* parent socket */ + int childfd; /* child socket */ + int clientlen; /* byte size of client's address */ + struct sockaddr_in serveraddr; /* server's addr */ + struct sockaddr_in clientaddr; /* client addr */ + struct hostent *hostp; /* client host info */ + char *hostaddrp; /* dotted decimal host addr string */ + int optval; /* flag value for setsockopt */ + int n; /* message byte size */ + parentfd = socket(AF_INET, SOCK_STREAM, 0); + optval = 1; + setsockopt(parentfd, SOL_SOCKET, SO_REUSEADDR, + (const void *)&optval , sizeof(int)); + bzero((char *) &serveraddr, sizeof(serveraddr)); + + serveraddr.sin_family = AF_INET; + serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); + serveraddr.sin_port = htons((unsigned short)PORTNO); + + if (bind(parentfd, (struct sockaddr *) &serveraddr, + sizeof(serveraddr)) < 0) + { + fprintf( stderr,"ERROR on binding"); + exit( -1 ); + } + + if (listen(parentfd, 5) < 0) /* allow 5 requests to queue up */ + { + fprintf( stderr,"ERROR on listen"); + exit( -1 ); + } + + clientlen = sizeof(clientaddr); + while (1) { + int childfd = accept(parentfd, (struct sockaddr *) &clientaddr, &clientlen); + if (childfd < 0) + { + fprintf( stderr,"Error on accept\n" ); + exit(-1); + } + + int reads = recv( childfd, buf, BUFSIZE, 0 ); + char header[1024]; + int ts = sprintf( header, "HTTP/1.1 200 Ok\r\nContent-type: multipart/x-mixed-replace;boundary=ipcam264\r\n\r\n" ); + send( childfd, header, ts, MSG_NOSIGNAL ); + while(1) + { + jpegsize = 0; + memcpy( copiedrx, map, WIDTH * HEIGHT * COMPS ); + int k = 0; + int x, y; + for( y = 0; y < HEIGHT/2; y++ ) + for( x = 0; x < WIDTH/2; x++ ) + { + //uint32_t c1 = map[x*2+y*2*WIDTH]&0xfcfcfcfc; + //uint32_t c2 = map[x*2+y*2*WIDTH+1]&0xfcfcfcfc; + //uint32_t c3 = map[x*2+(y*2+1)*WIDTH]&0xfcfcfcfc; + //uint32_t c4 = map[x*2+(y*2+1)*WIDTH+1]&0xfcfcfcfc; + //uint32_t c = ((c1+c2+c3+c4))/4; + uint32_t c = map[x*2+y*2*WIDTH]; + copiedrx[k++] = ((c & 0xff)<<16) | ((c & 0xff0000)>>16) | 0xff000000 | (c & 0xff00); + } + int sr = stbi_write_jpg_to_func( myjpegwrite, 0, WIDTH/2, HEIGHT/2, COMPS, ((uint8_t*)copiedrx), 50); + char header[1024]; + int ts = sprintf( header, "--ipcam264\r\nContent-type:image/jpeg\r\nContent-Length:%d\r\n\r\n", jpegsize ); + send( childfd, header, ts, MSG_NOSIGNAL ); + if( send( childfd, buf, jpegsize, MSG_NOSIGNAL ) <= 0 ) break; + printf( "!\n" ); + } + } + +// printf( "%p\n", map ); +// printf( "%p\n", map[0] ); +// stbi_write_jpg("/tmp/test.jpg", WIDTH, HEIGHT, 4, map, 3); +// printf( "%p\n", map[0] ); +} + -- cgit v1.2.3