version 1.8, 2001/10/15 12:40:28
|
version 1.9, 2001/10/29 20:56:33
|
Line 105 payload(const u8 *tsp)
|
Line 105 payload(const u8 *tsp)
|
{ |
{ |
if (!(tsp[3]&0x10)) // no payload? |
if (!(tsp[3]&0x10)) // no payload? |
return 0; |
return 0; |
if (tsp[3]&0x20) // adaptation field? |
if (tsp[3]&0x20) { // adaptation field? |
return 184-1-tsp[4]; |
if (tsp[4]>183) // corrupted data? |
|
return 0; |
|
else |
|
return 184-1-tsp[4]; |
|
} |
return 184; |
return 184; |
} |
} |
|
|
Line 186 void dvb_set_crc32(u8 *data, int length)
|
Line 190 void dvb_set_crc32(u8 *data, int length)
|
static inline int |
static inline int |
DvbDmxSWFilterPayload(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf) |
DvbDmxSWFilterPayload(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf) |
{ |
{ |
int p, count, ccok; |
int p, count; |
|
//int ccok; |
|
//u8 cc; |
|
|
if (!(count=payload(buf))) |
if (!(count=payload(buf))) |
return -1; |
return -1; |
p=188-count; |
p=188-count; |
ccok=((dvbdmxfeed->cc+1)&0x0f)==(buf[3]&0x0f) ? 1 : 0; |
|
dvbdmxfeed->cc=buf[3]&0x0f; |
|
/* |
/* |
|
cc=buf[3]&0x0f; |
|
ccok=((dvbdmxfeed->cc+1)&0x0f)==cc ? 1 : 0; |
|
dvbdmxfeed->cc=cc; |
if (!ccok) |
if (!ccok) |
printk("missed packet!\n"); |
printk("missed packet!\n"); |
*/ |
*/ |
Line 271 DvbDmxSWFilterSectionPacket(dvb_demux_fe
|
Line 278 DvbDmxSWFilterSectionPacket(dvb_demux_fe
|
{ |
{ |
int p, count; |
int p, count; |
int ccok, rest; |
int ccok, rest; |
|
u8 cc; |
|
|
if (!(count=payload(buf))) |
if (!(count=payload(buf))) |
return -1; |
return -1; |
p=188-count; |
p=188-count; |
|
|
ccok=((dvbdmxfeed->cc+1)&0x0f)==(buf[3]&0x0f) ? 1 : 0; |
cc=buf[3]&0x0f; |
dvbdmxfeed->cc=buf[3]&0x0f; |
ccok=((dvbdmxfeed->cc+1)&0x0f)==cc ? 1 : 0; |
|
dvbdmxfeed->cc=cc; |
|
|
if (buf[1]&0x40) { // PUSI set |
if (buf[1]&0x40) { // PUSI set |
// offset to start of first section is in buf[p] |
// offset to start of first section is in buf[p] |
|
if (p+buf[p]>187) // trash if it points beyond packet |
|
return -1; |
if (buf[p] && ccok) { // rest of previous section? |
if (buf[p] && ccok) { // rest of previous section? |
|
|
// did we have enough data in last packet to calc length? |
// did we have enough data in last packet to calc length? |
if (dvbdmxfeed->secbufp && dvbdmxfeed->secbufp<3) { |
if (dvbdmxfeed->secbufp && dvbdmxfeed->secbufp<3) { |
memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, |
memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, |
buf+p+1, |
buf+p+1, |
3-dvbdmxfeed->secbufp); |
3-dvbdmxfeed->secbufp); |
dvbdmxfeed->seclen=section_length(dvbdmxfeed->secbuf); |
dvbdmxfeed->seclen=section_length(dvbdmxfeed->secbuf); |
|
if (dvbdmxfeed->seclen>4096) |
|
return -1; |
} |
} |
rest=dvbdmxfeed->seclen-dvbdmxfeed->secbufp; |
rest=dvbdmxfeed->seclen-dvbdmxfeed->secbufp; |
if (rest==buf[p] && dvbdmxfeed->seclen) { |
if (rest==buf[p] && dvbdmxfeed->seclen) { |
Line 303 DvbDmxSWFilterSectionPacket(dvb_demux_fe
|
Line 315 DvbDmxSWFilterSectionPacket(dvb_demux_fe
|
while (count>0) { |
while (count>0) { |
if ((count>2) && // enough data to determine sec length? |
if ((count>2) && // enough data to determine sec length? |
((dvbdmxfeed->seclen=section_length(buf+p))<=count)) { |
((dvbdmxfeed->seclen=section_length(buf+p))<=count)) { |
|
if (dvbdmxfeed->seclen>4096) |
|
return -1; |
memcpy(dvbdmxfeed->secbuf, buf+p, |
memcpy(dvbdmxfeed->secbuf, buf+p, |
dvbdmxfeed->seclen); |
dvbdmxfeed->seclen); |
dvbdmxfeed->secbufp=dvbdmxfeed->seclen; |
dvbdmxfeed->secbufp=dvbdmxfeed->seclen; |
Line 311 DvbDmxSWFilterSectionPacket(dvb_demux_fe
|
Line 325 DvbDmxSWFilterSectionPacket(dvb_demux_fe
|
DvbDmxSWFilterSectionFeed(dvbdmxfeed); |
DvbDmxSWFilterSectionFeed(dvbdmxfeed); |
|
|
// filling bytes until packet end? |
// filling bytes until packet end? |
if (buf[p]==0xff) |
if (count && buf[p]==0xff) |
count=0; |
count=0; |
} else { // section continues to following ts block |
} else { // section continues to following TS packet |
memcpy(dvbdmxfeed->secbuf, buf+p, count); |
memcpy(dvbdmxfeed->secbuf, buf+p, count); |
dvbdmxfeed->secbufp+=count; |
dvbdmxfeed->secbufp+=count; |
count=0; |
count=0; |
Line 329 DvbDmxSWFilterSectionPacket(dvb_demux_fe
|
Line 343 DvbDmxSWFilterSectionPacket(dvb_demux_fe
|
memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, buf+p, |
memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, buf+p, |
3-dvbdmxfeed->secbufp); |
3-dvbdmxfeed->secbufp); |
dvbdmxfeed->seclen=section_length(dvbdmxfeed->secbuf); |
dvbdmxfeed->seclen=section_length(dvbdmxfeed->secbuf); |
|
if (dvbdmxfeed->seclen>4096) |
|
return -1; |
} |
} |
rest=dvbdmxfeed->seclen-dvbdmxfeed->secbufp; |
rest=dvbdmxfeed->seclen-dvbdmxfeed->secbufp; |
if (rest<0) |
if (rest<0) |
return -1; |
return -1; |
if (rest<=count) { // section completed in this ts block |
if (rest<=count) { // section completed in this TS packet |
memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, buf+p, rest); |
memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, buf+p, rest); |
dvbdmxfeed->secbufp+=rest; |
dvbdmxfeed->secbufp+=rest; |
DvbDmxSWFilterSectionFeed(dvbdmxfeed); |
DvbDmxSWFilterSectionFeed(dvbdmxfeed); |
Line 396 DvbDmxSWFilterPackets(dvb_demux_t *dvbdm
|
Line 412 DvbDmxSWFilterPackets(dvb_demux_t *dvbdm
|
if ((dvbdmxfeed=dvbdmx->pid2feed[0x2000])) |
if ((dvbdmxfeed=dvbdmx->pid2feed[0x2000])) |
dvbdmxfeed->cb.ts((u8 *)buf, count*188, 0, 0, |
dvbdmxfeed->cb.ts((u8 *)buf, count*188, 0, 0, |
&dvbdmxfeed->feed.ts, DMX_OK); |
&dvbdmxfeed->feed.ts, DMX_OK); |
for (; count>0; count--, buf+=188) { |
while (count) { |
if ((dvbdmxfeed=dvbdmx->pid2feed[ts_pid(buf)])) |
DvbDmxSWFilterPacket(dvbdmx, buf); |
DvbDmxSWFilterPacketType(dvbdmxfeed, buf); |
count--; |
|
buf+=188; |
} |
} |
} |
} |
|
|