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 '')
| -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; +} + | 
