#include #include #include #include #include #include extern const char *__progname; static const char *videodev = "viddev"; #define MAXFRAMEBYTES (100<<20) static int vfd; static unsigned char *framebuf; static unsigned int framelen; static void open_video(void) { vfd = open(videodev,O_RDWR,0); if (vfd < 0) { fprintf(stderr,"%s: %s: %s\n",__progname,videodev,strerror(errno)); exit(1); } } static void size_frame(void) { int lastlen; int goodcount; int n; int goodlen; framelen = 1000; lastlen = 0; framebuf = 0; while (1) { if (framelen != lastlen) { goodcount = 0; free(framebuf); framebuf = malloc(framelen+1); lastlen = framelen; } n = read(vfd,framebuf,framelen+1); if (n < 0) { fprintf(stderr,"%s: %s: read: %s\n",__progname,videodev,strerror(errno)); exit(1); } if (n == 0) { fprintf(stderr,"%s: %s: read EOF\n",__progname,videodev); exit(1); } if (n > framelen) { framelen <<= 1; } else { if ((goodcount == 0) || (goodlen != n)) { goodlen = n; goodcount = 1; } else { goodcount ++; } if (goodcount > 4) break; } } framelen = n; fprintf(stderr,"framelen %d\n",n); } int main(void); int main(void) { int l; open_video(); size_frame(); while (1) { l = read(vfd,framebuf,framelen+1); if (l < 0) { fprintf(stderr,"%s: %s: read: %s\n",__progname,videodev,strerror(errno)); exit(1); } if (l == 0) { fprintf(stderr,"%s: %s: read EOF\n",__progname,videodev); exit(1); } if (l < framelen) { fprintf(stderr,"%s: %s: short read (got %d wanted %d)\n",__progname,videodev,l,framelen); continue; } if (l > framelen) { fprintf(stderr,"%s: %s: long read (got %d wanted %d)\n",__progname,videodev,l,framelen); continue; } write(1,framebuf,framelen); } }