diff options
author | etobi <git@e-tobi.net> | 2013-09-03 09:48:38 +0200 |
---|---|---|
committer | etobi <git@e-tobi.net> | 2013-09-03 09:48:38 +0200 |
commit | 6e40287e2f39a80fc72bd8d0fbc1a8334d688c2d (patch) | |
tree | 024bef311226653bdd1da4fa588becf5098bcff7 /util/dvbtraffic | |
download | linux-dvb-apps-6e40287e2f39a80fc72bd8d0fbc1a8334d688c2d.tar.gz |
Imported Upstream version 1.1.0upstream/1.1.0
Diffstat (limited to 'util/dvbtraffic')
-rw-r--r-- | util/dvbtraffic/Makefile | 6 | ||||
-rw-r--r-- | util/dvbtraffic/dvbtraffic.c | 130 |
2 files changed, 136 insertions, 0 deletions
diff --git a/util/dvbtraffic/Makefile b/util/dvbtraffic/Makefile new file mode 100644 index 0000000..c29be40 --- /dev/null +++ b/util/dvbtraffic/Makefile @@ -0,0 +1,6 @@ + +dvbtraffic: dvbtraffic.c + gcc -MD -g -O2 -Wall -I../../include $< -o $@ + +clean: + rm -f *.o *.d dvbtraffic diff --git a/util/dvbtraffic/dvbtraffic.c b/util/dvbtraffic/dvbtraffic.c new file mode 100644 index 0000000..8add053 --- /dev/null +++ b/util/dvbtraffic/dvbtraffic.c @@ -0,0 +1,130 @@ +#include <stdio.h> +#include <stdlib.h> +#include <sys/ioctl.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <time.h> +#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> + +#define BSIZE 188 + +int pidt[0x2001]; + +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); + + ffd = open("/dev/dvb/adapter0/demux0", O_RDWR); + if (ffd < 0) { + perror("/dev/dvb/adapter0/demux0"); + return -fd; + } + + flt.pid = 0x2000; + flt.input = DMX_IN_FRONTEND; + flt.output = DMX_OUT_TS_TAP; + flt.pes_type = DMX_PES_OTHER; + flt.flags = 0; + + if (ioctl(ffd, DMX_SET_PES_FILTER, &flt) < 0) { + perror("DMX_SET_PES_FILTER"); + return -1; + } + + if (ioctl(ffd, DMX_START, 0) < 0) { + perror("DMX_SET_PES_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) { + perror("read"); + break; + } + if (r != 188) { + printf("only read %d\n", r); + break; + } + if (buffer[0] != 0x47) { + continue; + printf("desync (%x)\n", buffer[0]); + while (buffer[0] != 0x47) + read(fd, buffer, 1); + continue; + } + ok = 1; + pid = ((((unsigned) buffer[1]) << 8) | + ((unsigned) buffer[2])) & 0x1FFF; + + if (search) { + int i, sl = strlen(search); + ok = 0; + if (pid != 0x1fff) { + for (i = 0; i < (188 - sl); ++i) { + if (!memcmp(buffer + i, search, sl)) + ok = 1; + } + } + } + + if (ok) { + pidt[pid]++; + pidt[0x2000]++; + } + + packets++; + + if (!(packets & 0xFF)) { + struct timeval now; + int diff; + gettimeofday(&now, 0); + diff = + (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]) { + 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); + } + pidt[pid] = 0; + } + printf("-PID--FREQ-----BANDWIDTH-BANDWIDTH-\n"); + startt = now; + } + } + } + + close(ffd); + close(fd); + return 0; +} + |