After many hours of debugging last night, it looks like the corruption is caused by a hardware bug in the DMA engine used in the SAA7146. See the patch for more info.
A similar problem might effect the other DMA engines used by the full featured cards, but I don't have one to experiment with.
Jon
--- cvs/dvb-kernel/linux/drivers/media/dvb/ttpci/budget-core.c 2003-06-26
18:42:36.000000000 +0100
+++ dvb-kernel/linux/drivers/media/dvb/ttpci/budget-core.c 2003-08-30
03:15:44.000000000 +0100
@@ -68,6 +68,18 @@
u32 olddma = budget->ttbp;
u32 newdma = saa7146_read(budget->dev, PCI_VDP3);
+ if ((newdma == 0) || (newdma == TS_BUFLEN / 2)) {
+ /* The DMA Pointer is unreliable at 0% and 50% of buffer and
+ * frequently gets the two positions confused, we make a
+ * guess of the likely value based on the last known value
+ */
+ if (olddma < TS_BUFLEN/2) {
+ newdma = TS_BUFLEN/2;
+ } else {
+ newdma = 0;
+ }
+ }
+
/* nearest lower position divisible by 188 */
newdma -= newdma % 188;
