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
- To: linux-dvb@linuxtv.org
- Subject: [linux-dvb] [PATCH] Reducing the number of dropped packets when an error is detected
- From: Jon Burgess <mplayer@jburgess.uklinux.net>
- Date: Mon, 15 Sep 2003 18:04:11 +0100
- Content-type: multipart/mixed;boundary="------------070003020701010204020003"
- Sender: linux-dvb-bounce@linuxtv.org
- User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.5b) Gecko/20030827
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