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