On Sat, Dec 06, 2003 at 06:42:37PM -0800, Augusto Cardoso wrote:
> Hi!
> 
> Is it possible for you to either post or send the "dvbtraffic" software?
> I wasn't able to find it in the archives.

Of course, this 'software' IMHO would be good to find its place in the CVS
among szap and scan utilities (Holger, what do you think about this)

Emard

#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 <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;
	}
	if (ioctl(ffd, DMX_START, 0)<0)
	{
		perror("DMX_SET_PES_FILTER");
		return;
	}
	
	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;
}
all:    dvbtraffic

dvbtraffic: dvbtraffic.c
        gcc -m486 -O6 dvbtraffic.c -o dvbtraffic

clean:
        rm -f dvbtraffic

Reply via email to