Mailing List archive

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

[linux-dvb] [PATCH] Reducing the number of dropped packets when an error is detected



When tuning to a new channel the first couple of packets are often junk, but most of the following 64kB of data in the DMA ring is actually OK.

The patch attached moves a check for the 0x47 TS packet sync byte from
the vpeirq DMA receive code into the lower demux layer (so it makes the decision to drop on a per TS packet basis). Without the patch the IRQ would junk the whole block of data if it didn't start with a sync byte.

This improves the channel switching time for me, as well as the resilience to small bursts of interference (which again could cause lots of good packets to be dropped unnecessarily).

Patches are attached for DVB & dvb-kernel

Jon


diff -ur DVB-cvs/driver/av7110/av7110.c DVB/driver/av7110/av7110.c
--- DVB-cvs/driver/av7110/av7110.c	2003-09-06 13:05:08.000000000 +0100
+++ DVB/driver/av7110/av7110.c	2003-09-13 16:52:38.967979904 +0100
@@ -931,7 +931,7 @@
                mem+=av7110->ttbp;
                num=(dmapos-av7110->ttbp)/188;
         } else {
-               if (av7110->feeding && mem[av7110->ttbp]==0x47)
+               if (av7110->feeding)
                          dvb_dmx_swfilter_packets(&av7110->demux,
                                  mem+av7110->ttbp, 1024-av7110->ttbp/188);
 
@@ -940,7 +940,7 @@
 
         av7110->ttbp=dmapos;
 
-        if (av7110->feeding && mem[0]==0x47)
+        if (av7110->feeding)
                 dvb_dmx_swfilter_packets(&av7110->demux, mem, num);
     
 }
Only in DVB/driver/av7110: av7110.c.~1.62.~
diff -ur DVB-cvs/driver/dvb_demux.c DVB/driver/dvb_demux.c
--- DVB-cvs/driver/dvb_demux.c	2003-08-08 17:16:02.000000000 +0100
+++ DVB/driver/dvb_demux.c	2003-09-13 16:51:53.045961112 +0100
@@ -404,7 +404,9 @@
 		dvbdmxfeed->cb.ts((u8 *)buf, count*188, 0, 0, 
 				  &dvbdmxfeed->feed.ts, DMX_OK); 
         while (count) {
-		dvb_dmx_swfilter_packet(dvbdmx, buf);
+		if (buf[0] == 0x47) {
+		        dvb_dmx_swfilter_packet(dvbdmx, buf);
+		}
 		count--;
 		buf+=188;
 	}
Only in DVB/driver: dvb_demux.c.~1.42.~
diff -Nur dvb-kernel-cvs/linux/drivers/media/dvb/dvb-core/dvb_demux.c dvb-kernel-test/linux/drivers/media/dvb/dvb-core/dvb_demux.c
--- dvb-kernel-cvs/linux/drivers/media/dvb/dvb-core/dvb_demux.c	2003-09-11 17:35:55.000000000 +0100
+++ dvb-kernel-test/linux/drivers/media/dvb/dvb-core/dvb_demux.c	2003-09-13 16:43:46.652904096 +0100
@@ -393,7 +393,9 @@
 	spin_lock(&demux->lock);
 
 	while (count--) {
-		dvb_dmx_swfilter_packet(demux, buf);
+               	if(buf[0] == 0x47) {
+		        dvb_dmx_swfilter_packet(demux, buf);
+		}
 		buf += 188;
 	}
 
diff -Nur dvb-kernel-cvs/linux/drivers/media/dvb/ttpci/budget-core.c dvb-kernel-test/linux/drivers/media/dvb/ttpci/budget-core.c
--- dvb-kernel-cvs/linux/drivers/media/dvb/ttpci/budget-core.c	2003-09-06 13:05:25.000000000 +0100
+++ dvb-kernel-test/linux/drivers/media/dvb/ttpci/budget-core.c	2003-09-13 16:43:23.598408912 +0100
@@ -80,14 +80,11 @@
 		return;
 
         if (newdma > olddma) { /* no wraparound, dump olddma..newdma */
-               	if(mem[olddma] == 0x47)
                         dvb_dmx_swfilter_packets(&budget->demux, 
         	                mem+olddma, (newdma-olddma) / 188);
         } else { /* wraparound, dump olddma..buflen and 0..newdma */
-                if(mem[olddma] == 0x47)
 	                dvb_dmx_swfilter_packets(&budget->demux,
         	                mem+olddma, (TS_BUFLEN-olddma) / 188);
-                if(mem[0] == 0x47)
                         dvb_dmx_swfilter_packets(&budget->demux,
                                 mem, newdma / 188);
         }

Home | Main Index | Thread Index