Mailing List archive

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

[linux-dvb] Re: new. perfect fidbirq()



Hi Emard,


  unfortunately this doesn't work with well when multiple cards are being
used. I've recompiled with your modification and let it running for 2 hours
on two different boxes. Both are suffering from discontinuities (see below).
I had the same experience when trying to do the same myself - unless the
piece of code (which ignores DMApos during TSF1 when its value is < 0x20000)
from the original driver is present, it makes strange things when you trust
DMApos. 

	With kind regards,

		M.


BOX#1:

libdvbpsi error (PSI decoder): TS discontinuity (received 8, expected 6)
libdvbpsi error (PSI decoder): TS discontinuity (received 11, expected 10)
libdvbpsi error (PSI decoder): TS discontinuity (received 6, expected 8)
libdvbpsi error (PSI decoder): TS discontinuity (received 2, expected 3)
libdvbpsi error (PSI decoder): TS discontinuity (received 10, expected 12)
libdvbpsi error (PSI decoder): TS discontinuity (received 4, expected 5)
libdvbpsi error (PSI decoder): TS discontinuity (received 0, expected 14)
libdvbpsi error (PSI decoder): TS discontinuity (received 7, expected 6)
libdvbpsi error (PSI decoder): TS discontinuity (received 0, expected 14)
libdvbpsi error (PSI decoder): TS discontinuity (received 7, expected 6)
libdvbpsi error (PSI decoder): TS discontinuity (received 0, expected 14)
libdvbpsi error (PSI decoder): TS discontinuity (received 0, expected 14)
libdvbpsi error (PSI decoder): TS discontinuity (received 7, expected 6)
libdvbpsi error (PSI decoder): TS discontinuity (received 5, expected 3)
libdvbpsi error (PSI decoder): TS discontinuity (received 12, expected 10)
libdvbpsi error (PSI decoder): TS discontinuity (received 0, expected 14)
libdvbpsi error (PSI decoder): TS discontinuity (received 0, expected 14)
libdvbpsi error (PSI decoder): TS discontinuity (received 12, expected 11) 
libdvbpsi error (PSI decoder): TS discontinuity (received 4, expected 2)
libdvbpsi error (PSI decoder): TS discontinuity (received 12, expected 10)
libdvbpsi error (PSI decoder): TS discontinuity (received 2, expected 0)
libdvbpsi error (PSI decoder): TS discontinuity (received 8, expected 7)
libdvbpsi error (PSI decoder): TS discontinuity (received 6, expected 4)
libdvbpsi error (PSI decoder): TS discontinuity (received 6, expected 4)
libdvbpsi error (PSI decoder): TS discontinuity (received 2, expected 1)
libdvbpsi error (PSI decoder): TS discontinuity (received 2, expected 1)
libdvbpsi error (PSI decoder): TS discontinuity (received 6, expected 4)
libdvbpsi error (PSI decoder): TS discontinuity (received 6, expected 4)
libdvbpsi error (PSI decoder): TS discontinuity (received 11, expected 9)
libdvbpsi error (PSI decoder): TS discontinuity (received 2, expected 0)
libdvbpsi error (PSI decoder): TS discontinuity (received 6, expected 4)
libdvbpsi error (PSI decoder): TS discontinuity (received 6, expected 4)
libdvbpsi error (PSI decoder): TS discontinuity (received 2, expected 1)
libdvbpsi error (PSI decoder): TS discontinuity (received 7, expected 6)
libdvbpsi error (PSI decoder): TS discontinuity (received 4, expected 3)
libdvbpsi error (PSI decoder): TS discontinuity (received 3, expected 2)
libdvbpsi error (PSI decoder): TS discontinuity (received 3, expected 2)
libdvbpsi error (PSI decoder): TS discontinuity (received 4, expected 3)
libdvbpsi error (PSI decoder): TS discontinuity (received 4, expected 3)
libdvbpsi error (PSI decoder): TS discontinuity (received 4, expected 3) 


BOX #2:

libdvbpsi error (PSI decoder): TS discontinuity (received 2, expected 1)
libdvbpsi error (PSI decoder): TS discontinuity (received 14, expected 13)
libdvbpsi error (PSI decoder): TS discontinuity (received 4, expected 3)
libdvbpsi error (PSI decoder): TS discontinuity (received 0, expected 15)
libdvbpsi error (PSI decoder): TS discontinuity (received 11, expected 10)
libdvbpsi error (PSI decoder): TS discontinuity (received 6, expected 5)
libdvbpsi error (PSI decoder): TS discontinuity (received 10, expected 9)
libdvbpsi error (PSI decoder): TS discontinuity (received 9, expected 8) 
libdvbpsi error (PSI decoder): TS discontinuity (received 0, expected 15)
libdvbpsi error (PSI decoder): TS discontinuity (received 1, expected 0)
libdvbpsi error (PSI decoder): TS discontinuity (received 3, expected 2)
libdvbpsi error (PSI decoder): TS discontinuity (received 7, expected 6)
libdvbpsi error (PSI decoder): TS discontinuity (received 14, expected 13)
libdvbpsi error (PSI decoder): TS discontinuity (received 2, expected 1)
libdvbpsi error (PSI decoder): TS discontinuity (received 1, expected 0)
libdvbpsi error (PSI decoder): TS discontinuity (received 4, expected 3)
libdvbpsi error (PSI decoder): TS discontinuity (received 0, expected 15)
libdvbpsi error (PSI decoder): TS discontinuity (received 2, expected 1)
libdvbpsi error (PSI decoder): TS discontinuity (received 3, expected 2)
libdvbpsi error (PSI decoder): TS discontinuity (received 7, expected 6)
libdvbpsi error (PSI decoder): TS discontinuity (received 6, expected 5)
libdvbpsi error (PSI decoder): TS discontinuity (received 9, expected 8)
libdvbpsi error (PSI decoder): TS discontinuity (received 5, expected 4)
libdvbpsi error (PSI decoder): TS discontinuity (received 7, expected 6)
libdvbpsi error (PSI decoder): TS discontinuity (received 6, expected 5)
libdvbpsi error (PSI decoder): TS discontinuity (received 2, expected 1)
libdvbpsi error (PSI decoder): TS discontinuity (received 4, expected 3)
libdvbpsi error (PSI decoder): TS discontinuity (received 13, expected 12)
libdvbpsi error (PSI decoder): TS discontinuity (received 2, expected 1)
libdvbpsi error (PSI decoder): TS discontinuity (received 2, expected 1)
libdvbpsi error (PSI decoder): TS discontinuity (received 2, expected 1)
libdvbpsi error (PSI decoder): TS discontinuity (received 6, expected 5)
libdvbpsi error (PSI decoder): TS discontinuity (received 5, expected 4)
libdvbpsi error (PSI decoder): TS discontinuity (received 14, expected 13)
libdvbpsi error (PSI decoder): TS discontinuity (received 1, expected 0)
libdvbpsi error (PSI decoder): TS discontinuity (received 13, expected 12)
libdvbpsi error (PSI decoder): TS discontinuity (received 15, expected 14)
libdvbpsi error (PSI decoder): TS discontinuity (received 8, expected 7)
libdvbpsi error (PSI decoder): TS discontinuity (received 13, expected 12)
libdvbpsi error (PSI decoder): TS discontinuity (received 2, expected 1)
libdvbpsi error (PSI decoder): TS discontinuity (received 7, expected 6)
libdvbpsi error (PSI decoder): TS discontinuity (received 6, expected 5) 




On Sun, Feb 02, 2003 at 01:23:31AM +0100, Emard wrote:
> HI All
> 
> Today I was watching the breaking news on a different 
> computer with budget card... From packet loss and artefacts 
> I couldn't follow what's going on, so I said "enough is enough".
> 
> It was all because of the improper coding logic
> in fidbirq(). Even the recently modified fidbirq() 
> by Marian couldn't cope with heavy loaded PCI latency.
> 
> So I remembered a discussion with Roberto Deza about
> fidbirq() that was almost forgotten...
> 
> I took the paper and have rewritten fidbirq() 
> from scrach, having in mind triggering on both edges,
> recovery from lost interrupt and the trust in 7146 dma 
> pointer given the proper pointer arithmetic.
> 
> The result is absolutely astonishing: ZERO PACKET LOSS.
> (patch and complete the fidbirq attached)
> 
> I recommend you all to try this new fidbirq(), and
> also to apply it to the dvb-kernel.
> 
> Best regards, Emard


> diff -pur orig/dvb-kernel/linux/drivers/media/dvb/ttpci-budget/budget-core.c dvb-kernel/linux/drivers/media/dvb/ttpci-budget/budget-core.c
> --- orig/dvb-kernel/linux/drivers/media/dvb/ttpci-budget/budget-core.c	Thu Jan 23 20:00:03 2003
> +++ dvb-kernel/linux/drivers/media/dvb/ttpci-budget/budget-core.c	Sun Feb  2 00:21:30 2003
> @@ -110,27 +110,41 @@ void fidbirq (unsigned long data)
>  {
>  	struct budget_s *budget = (struct budget_s*) data;
>  	u8 *mem=(u8 *)(budget->grabbing);
> -	int num=512;
> -	int field=0x80 & saa7146_read(budget->dev, PSR);
> +//	int field=0x80 & saa7146_read(budget->dev, PSR);
> +	u16 oldblk = budget->ttbp;
> +	u16 newblk = saa7146_read(budget->dev, PCI_VDP3)/188; /* PCI_VDP3 = 0..TS_BUFLEN-1 */
> +	u8 *olddma = mem + oldblk*188;
> +	u8 *newdma = mem + newblk*188; /* rounded to last complete packet */
>  
>  	DEB_EE(("budget: %p\n",budget));
> +	
> +	/* Zero-Packet-Loss fidbirq by EMARD */
>  
> -	if (field) {
> -		if (field==budget->tsf)
> -			num=1024;
> -		else
> -			mem+=TS_BUFLEN/2;
> -	} else {
> -		if (field==budget->tsf) {
> -			if (budget->feeding && mem[TS_BUFLEN/2]==0x47)
> -				dvb_dmx_swfilter_packets(&budget->demux, 
> -				    mem+TS_BUFLEN/2, 512 );
> -		}
> -	}
> +	budget->ttbp = newblk;
> +	
> +	/* exit immediately when the card is not set for feeding
> +	** or when values are out of expected boundaries
> +	*/
> +	if(budget->feeding == 0 ||
> +		oldblk >= TS_BUFLEN/188 || newblk >= TS_BUFLEN/188)
> +		return;
>  
> -	budget->tsf=field;
> -	if (budget->feeding && mem[0]==0x47)
> -		dvb_dmx_swfilter_packets(&budget->demux, mem, num);
> +	if(oldblk < newblk) /* no wraparound - dump in one chunk */
> +		if(*olddma == 0x47)
> +			dvb_dmx_swfilter_packets(&budget->demux, olddma,
> +				newblk-oldblk);
> +	
> +	if(oldblk > newblk) /* wraparound - dump in two chunks */
> +	{
> +		/* dump from olddma to end of dma window */
> +		if(*olddma == 0x47)
> +			dvb_dmx_swfilter_packets(&budget->demux, olddma,
> +				TS_BUFLEN/188 - oldblk);
> +		/* dump from begin of dma window to newdma */
> +		if(*mem == 0x47)
> +			dvb_dmx_swfilter_packets(&budget->demux, mem,
> +				newblk);
> +	}			
>  }
>  
>  inline static void 
> diff -pur orig/dvb-kernel/linux/drivers/media/dvb/ttpci-budget/budget.h dvb-kernel/linux/drivers/media/dvb/ttpci-budget/budget.h
> --- orig/dvb-kernel/linux/drivers/media/dvb/ttpci-budget/budget.h	Thu Jan 23 20:00:03 2003
> +++ dvb-kernel/linux/drivers/media/dvb/ttpci-budget/budget.h	Sun Feb  2 00:22:39 2003
> @@ -47,7 +47,7 @@ struct budget_s {
>          struct semaphore        pid_mutex;
>  
>          int tsf;
> -        u32 ttbp;
> +        u16 ttbp;
>          int feeding;
>  
>          int registered;



--------------------------------------------------------------------------
----                                                                  ----
----   Marian Durkovic                       network  manager         ----
----                                                                  ----
----   Slovak Technical University           Tel: +421 2 524 51 301   ----
----   Computer Centre, Nam. Slobody 17      Fax: +421 2 524 94 351   ----
----   812 43 Bratislava, Slovak Republic    E-mail: md@bts.sk        ----
----                                                                  ----
--------------------------------------------------------------------------


-- 
Info:
To unsubscribe send a mail to listar@linuxtv.org with "unsubscribe linux-dvb" as subject.



Home | Main Index | Thread Index