From: Ralph Metzler <rjkm@xxxxxxxxxxxxxx> > Issa Gorissen writes: > > Could you please take a look at the cxd2099 issues ? > > > > I have attached a version with my changes. I have tested a lot of > > different settings with the help of the chip datasheet. > > > > Scrambled programs are not handled correctly. I don't know if it is the > > TICLK/MCLKI which is too high or something, or the sync detector ? Also, > > as we have to set the TOCLK to max of 72MHz, there are way too much null > > packets added. Is there a way to solve this ? > > I do not have any cxd2099 issues. > I have a simple test program which includes a 32bit counter as payload > and can pump data through the CI with full speed and have no packet > loss. I only tested decoding with an ORF stream and an Alphacrypt CAM > but also had no problems with this. > > Please take care not to write data faster than it is read. Starting two > dds will not guarantee this. To be certain you could write a small > program which never writes more packets than input buffer size minus > the number of read packets (and minus the stuffing null packets on ngene). > > Before blaming packet loss on the CI data path also please make > certain that you have no buffer overflows in the input part of > the sec device. > In the ngene driver you can e.g. add a printk in tsin_exchange(): > > if (dvb_ringbuffer_free(&dev->tsin_rbuf) > len) { > ... > } else > printk ("buffer overflow !!!!\n"); > > > Regards, > Ralph Ralph, Please find my testing tool for the decryption attached. The idea is to write 5 packets and read them back from the CAM. My input is a raw ts captured with a gnutv I modified with a demux filter of 0x2000. Gnutv outputs at dvr and dvbloop reads from it, process via sec0 and writes output to a file. The channel I selected has been decrypted. Only problem is I have artifacts in the image and the sound. Do you have any idea of what I should improve from my test tool to fix that issue ? Thx, -- Issa
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <signal.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <time.h> 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 * 5; unsigned char buf[BUFFY]; struct timespec sl[1]; sl[0].tv_nsec = 250000; while (!quit_app) { // read from input (DVR or other) rlen = 0; while (rlen < BUFFY) { int i = read(in_fd, buf + rlen, BUFFY - rlen); if (!i) { quit_app = 1; continue; } rlen += i; } // 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); */ // read data from caio device - should be decrypted // finding sync byte do { buf[0] = 0; while (buf[0] != 0x47) { rtsilen = read(tsi_fd, buf, 1); } if (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; int nulls = 0; do { if (buf[0] == 0x47 && buf[1] == 0x1F && buf[2] == 0xFF) { ++nulls; if (nulls > 100) break; // printf("null packet "); // DVB null packet, discard } else { // printf("\nfrom tsi out: %x %x %x \n", buf[0], buf[1], buf[2]); // write packet to output int i = write(out_fd, buf, 188); if (i < 188) { perror("Did not write 188 bytes to output file!!!"); } wtsilen += i; } if (rlen == wtsilen || quit_app) 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; } }