Mailing List archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[linux-dvb] Re: Stream investigating



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

Home | Main Index | Thread Index