summaryrefslogtreecommitdiff
path: root/linux/drivers/media/dvb
diff options
context:
space:
mode:
Diffstat (limited to 'linux/drivers/media/dvb')
-rw-r--r--linux/drivers/media/dvb/dvb-core/dvb_demux.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/linux/drivers/media/dvb/dvb-core/dvb_demux.c b/linux/drivers/media/dvb/dvb-core/dvb_demux.c
index b5edf3af2..affe8b3a8 100644
--- a/linux/drivers/media/dvb/dvb-core/dvb_demux.c
+++ b/linux/drivers/media/dvb/dvb-core/dvb_demux.c
@@ -404,15 +404,18 @@ void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf, size_t cou
void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count)
{
int p = 0,i, j;
-
+
+ spin_lock(&demux->lock);
+
if ((i = demux->tsbufp)) {
if (count < (j=188-i)) {
memcpy(&demux->tsbuf[i], buf, count);
demux->tsbufp += count;
- return;
+ goto bailout;
}
memcpy(&demux->tsbuf[i], buf, j);
- dvb_dmx_swfilter_packet(demux, demux->tsbuf);
+ if (demux->tsbuf[0] == 0x47)
+ dvb_dmx_swfilter_packet(demux, demux->tsbuf);
demux->tsbufp = 0;
p += j;
}
@@ -426,11 +429,14 @@ void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count)
i = count-p;
memcpy(demux->tsbuf, buf+p, i);
demux->tsbufp=i;
- return;
+ goto bailout;
}
} else
p++;
}
+
+bailout:
+ spin_unlock(&demux->lock);
}