diff options
Diffstat (limited to 'util/dvbtraffic/dvbtraffic.c')
-rw-r--r-- | util/dvbtraffic/dvbtraffic.c | 110 |
1 files changed, 65 insertions, 45 deletions
diff --git a/util/dvbtraffic/dvbtraffic.c b/util/dvbtraffic/dvbtraffic.c index 8add053..b9a151d 100644 --- a/util/dvbtraffic/dvbtraffic.c +++ b/util/dvbtraffic/dvbtraffic.c @@ -1,3 +1,5 @@ +/* This file is released into the public domain by its authors */ + #include <stdio.h> #include <stdlib.h> #include <sys/ioctl.h> @@ -9,64 +11,83 @@ #include <sys/poll.h> #include <sys/time.h> #include <string.h> - -#include <linux/dvb/dmx.h> -#include <linux/dvb/frontend.h> -#include <linux/dvb/video.h> +#include <limits.h> +#include <libdvbapi/dvbdemux.h> #define BSIZE 188 -int pidt[0x2001]; +static int pidt[0x2001]; + +static void usage(FILE *output) +{ + fprintf(output, + "Usage: dvbtraffic [OPTION]...\n" + "Options:\n" + " -a N use dvb adapter N\n" + " -d N use demux N\n" + " -h display this help\n"); +} int main(int argc, char **argv) { - int fd, ffd, packets = 0; struct timeval startt; - struct dmx_pes_filter_params flt; - char *search; - unsigned char buffer[BSIZE]; - - fd = open("/dev/dvb/adapter0/dvr0", O_RDONLY); - - ioctl(fd, DMX_SET_BUFFER_SIZE, 1024 * 1024); + int adapter = 0, demux = 0; + char *search = NULL; + int fd, ffd, packets = 0; + int opt; - ffd = open("/dev/dvb/adapter0/demux0", O_RDWR); - if (ffd < 0) { - perror("/dev/dvb/adapter0/demux0"); - return -fd; + while ((opt = getopt(argc, argv, "a:d:hs:")) != -1) { + switch (opt) { + case 'a': + adapter = atoi(optarg); + break; + case 'd': + demux = atoi(optarg); + break; + case 'h': + usage(stdout); + exit(0); + case 's': + search = strdup(optarg); + break; + default: + usage(stderr); + exit(1); + } } - flt.pid = 0x2000; - flt.input = DMX_IN_FRONTEND; - flt.output = DMX_OUT_TS_TAP; - flt.pes_type = DMX_PES_OTHER; - flt.flags = 0; + // open the DVR device + fd = dvbdemux_open_dvr(adapter, demux, 1, 0); + if (fd < 0) { + fprintf(stderr, "dvbtraffic: Could not open dvr device: %m\n"); + exit(1); + } + dvbdemux_set_buffer(fd, 1024 * 1024); - if (ioctl(ffd, DMX_SET_PES_FILTER, &flt) < 0) { - perror("DMX_SET_PES_FILTER"); - return -1; + ffd = dvbdemux_open_demux(adapter, demux, 0); + if (ffd < 0) { + fprintf(stderr, "dvbtraffic: Could not open demux device: %m\n"); + exit(1); } - if (ioctl(ffd, DMX_START, 0) < 0) { - perror("DMX_SET_PES_FILTER"); + if (dvbdemux_set_pid_filter(ffd, -1, DVBDEMUX_INPUT_FRONTEND, DVBDEMUX_OUTPUT_DVR, 1)) { + perror("dvbdemux_set_pid_filter"); return -1; } gettimeofday(&startt, 0); - if (argc > 1) - search = argv[1]; - else - search = 0; - while (1) { - int pid, r, ok; - if ((r = read(fd, buffer, 188)) <= 0) { + unsigned char buffer[BSIZE]; + int pid, ok; + ssize_t r; + + if ((r = read(fd, buffer, BSIZE)) <= 0) { perror("read"); break; } - if (r != 188) { - printf("only read %d\n", r); + if (r != BSIZE) { + fprintf(stderr, "dvbtraffic: only read %zd bytes\n", r); break; } if (buffer[0] != 0x47) { @@ -106,16 +127,16 @@ int main(int argc, char **argv) (now.tv_sec - startt.tv_sec) * 1000 + (now.tv_usec - startt.tv_usec) / 1000; if (diff > 1000) { - int pid = 0; - for (pid = 0; pid < 0x2001; pid++) { - if (pidt[pid]) { + int _pid = 0; + for (_pid = 0; _pid < 0x2001; _pid++) { + if (pidt[_pid]) { printf("%04x %5d p/s %5d kb/s %5d kbit\n", - pid, - pidt[pid] * 1000 / diff, - pidt[pid] * 1000 / diff * 188 / 1024, - pidt[pid] * 8 * 1000 / diff * 188 / 1000); + _pid, + pidt[_pid] * 1000 / diff, + pidt[_pid] * 1000 / diff * 188 / 1024, + pidt[_pid] * 8 * 1000 / diff * 188 / 1000); } - pidt[pid] = 0; + pidt[_pid] = 0; } printf("-PID--FREQ-----BANDWIDTH-BANDWIDTH-\n"); startt = now; @@ -127,4 +148,3 @@ int main(int argc, char **argv) close(fd); return 0; } - |