Mailing List archive

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

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



Marian Durkovic wrote:
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.
what fidbirq() implementation was working best for you?

Holger




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