#include #include #include #include #include #include #include #include static void signal_handler(int _signal); static int quit_app = 0; int main(int argc, char *argv[]) { signal(SIGINT, signal_handler); if (argc <= 3) exit(1); int in_fd = open(argv[1], O_RDONLY); int out_fd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); int tsi_fd = open(argv[3], O_RDWR); int rlen = 0; int wlen = 0; int rtsilen = 0; int wtsilen = 0; int BUFFY = 188 * 20; unsigned char buf[BUFFY]; struct timespec sl[1]; sl[0].tv_nsec = 250000; while (!quit_app) { // read from input (DVR or other) rlen = read(in_fd, buf, BUFFY); if (rlen > 0) { // write data to caio device wlen = write(tsi_fd, buf, rlen); if (wlen != rlen) { perror("Did not write same amount of data from input to caio!!!"); exit(1); }/* else printf("written %d bytes in tsi\n", wlen); */ } if (rlen < BUFFY) { nanosleep(sl, NULL); } if (rlen < 188) continue; // read data from caio device - should be decrypted // finding sync byte do { rtsilen = read(tsi_fd, buf, 1); // printf("reading one byte: %02x from tsi\n", buf[0]); if (rtsilen && (buf[0] == 0x47)) { do { int i = read(tsi_fd, buf + rtsilen, 188 - rtsilen); rtsilen += i; // printf("reading %d bytes from tsi\n", i); } while (rtsilen < 188); break; } } while (1); //printf("sync byte found: %02x \n", buf[0]); wtsilen = 0; do { // printf("from tsi out: %x %x %x \n", buf[0], buf[1], buf[2]); if (buf[0] == 0x47 && buf[1] == 0x1F && buf[2] == 0xFF) { // DVB null packet, discard } else { // write packet to output wtsilen += write(out_fd, buf, 188); } if (rlen == wtsilen) break; rtsilen = 0; do { rtsilen += read(tsi_fd, buf + rtsilen, 188 - rtsilen); } while (rtsilen < 188); } while (1); } close(in_fd); close(out_fd); close(tsi_fd); exit(0); } static void signal_handler(int _signal) { if (!quit_app) { quit_app = 1; } }