version 1.1, 2001/03/06 23:44:34
|
version 1.2, 2001/03/08 01:41:26
|
Line 75 struct list_head *dmx_get_demuxes(void)
|
Line 75 struct list_head *dmx_get_demuxes(void)
|
return &dmx_muxs; |
return &dmx_muxs; |
} |
} |
|
|
static int dmx_section_feed_stop_filtering(struct dmx_section_feed_s* feed); |
|
|
|
/****************************************************************************** |
/****************************************************************************** |
* static inlined helper functions |
* static inlined helper functions |
******************************************************************************/ |
******************************************************************************/ |
|
|
/* NOTE: these might not work on some arhictectures due to missing alignment */ |
|
|
|
|
|
static inline u16 |
static inline u16 |
section_length(const u8 *buf) |
section_length(const u8 *buf) |
{ |
{ |
return 3+(0xfff&ntohs(*(u16 *)(buf+1))); |
return 3+((buf[1]&0x0f)<<8)+buf[2]; |
} |
} |
|
|
static inline u16 |
static inline u16 |
ts_pid(const u8 *buf) |
ts_pid(const u8 *buf) |
{ |
{ |
return (0x1fff&ntohs(*(u16 *)(buf+1))); |
return ((buf[1]&0x1f)<<8)+buf[2]; |
} |
} |
|
|
static inline int |
static inline int |
payload(const u8 *tsp, const u8 **data) |
payload(const u8 *tsp) |
{ |
{ |
int len=184; |
|
*data=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]; |
int aflen=tsp[4]+1; |
return 184; |
|
|
len-=aflen; |
|
*data+=aflen; |
|
} |
|
return len; |
|
} |
} |
|
|
/****************************************************************************** |
/****************************************************************************** |
Line 121 payload(const u8 *tsp, const u8 **data)
|
Line 108 payload(const u8 *tsp, const u8 **data)
|
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=4, count=184, ccok; |
int p, count, ccok; |
|
|
if (!(buf[3]&0x10)) // no payload? |
if (!(count=payload(buf))) |
return -1; |
return -1; |
|
p=188-count; |
if (buf[3]&0x20) { // adaptation field? |
|
count-=buf[4]+1; |
|
p+=buf[4]+1; |
|
} |
|
|
|
ccok=((dvbdmxfeed->cc+1)&0x0f)==(buf[3]&0x0f) ? 1 : 0; |
ccok=((dvbdmxfeed->cc+1)&0x0f)==(buf[3]&0x0f) ? 1 : 0; |
dvbdmxfeed->cc=buf[3]&0x0f; |
dvbdmxfeed->cc=buf[3]&0x0f; |
|
/* |
/* |
|
if (!ccok) |
if (!ccok) |
printk("missed packet!\n"); |
printk("missed packet!\n"); |
*/ |
*/ |
if (buf[1]&0x40) { // PUSI ? |
if (buf[1]&0x40) // PUSI ? |
dvbdmxfeed->peslen=0xfffa; |
dvbdmxfeed->peslen=0xfffa; |
} |
|
dvbdmxfeed->peslen+=count; |
dvbdmxfeed->peslen+=count; |
|
|
return dvbdmxfeed->cb.ts((u8 *)&buf[p], count, 0, 0, |
return dvbdmxfeed->cb.ts((u8 *)&buf[p], count, 0, 0, |
Line 211 DvbDmxSWFilterSectionFeed(dvb_demux_feed
|
Line 191 DvbDmxSWFilterSectionFeed(dvb_demux_feed
|
static inline int |
static inline int |
DvbDmxSWFilterSectionPacket(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf) |
DvbDmxSWFilterSectionPacket(dvb_demux_feed_t *dvbdmxfeed, const u8 *buf) |
{ |
{ |
int p=4, count=184, ccok=0, rest=0; |
int p, count; |
|
int ccok, rest; |
|
|
if (!(buf[3]&0x10)) // no payload? |
if (!(count=payload(buf))) |
return -1; |
return -1; |
|
p=188-count; |
if (buf[3]&0x20) { // adaptation field? |
|
count-=buf[4]+1; |
|
p+=buf[4]+1; |
|
} |
|
|
|
|
|
ccok=((dvbdmxfeed->cc+1)&0x0f)==(buf[3]&0x0f) ? 1 : 0; |
ccok=((dvbdmxfeed->cc+1)&0x0f)==(buf[3]&0x0f) ? 1 : 0; |
dvbdmxfeed->cc=buf[3]&0x0f; |
dvbdmxfeed->cc=buf[3]&0x0f; |
|
|
//printk ("function : %s payload=%d ccok=%d\n", __FUNCTION__, count, ccok); |
if (buf[1]&0x40) { // PUSI set -- a section begins in this packet |
|
// offset to start of first section is in buf[p] |
if (buf[1]&0x40) { // PUSI set |
|
if (buf[p] && ccok) { |
if (buf[p] && ccok) { // rest of previous section? |
|
|
|
// did we have enough data in last packet to calc length? |
|
if (dvbdmxfeed->secbufp && dvbdmxfeed->secbufp<3) { |
|
memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, |
|
buf+p+1, |
|
3-dvbdmxfeed->secbufp); |
|
dvbdmxfeed->seclen=section_length(dvbdmxfeed->secbuf); |
|
} |
rest=dvbdmxfeed->seclen-dvbdmxfeed->secbufp; |
rest=dvbdmxfeed->seclen-dvbdmxfeed->secbufp; |
if (rest==buf[p] && dvbdmxfeed->seclen) { |
if (rest==buf[p] && dvbdmxfeed->seclen) { |
memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, |
memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, |
Line 237 DvbDmxSWFilterSectionPacket(dvb_demux_fe
|
Line 221 DvbDmxSWFilterSectionPacket(dvb_demux_fe
|
DvbDmxSWFilterSectionFeed(dvbdmxfeed); |
DvbDmxSWFilterSectionFeed(dvbdmxfeed); |
} |
} |
} |
} |
p+=buf[p]+1; |
p+=buf[p]+1; // skip rest of last section |
count-=buf[p]+1; |
count=188-p; |
while (count>0) { |
while (count>0) { |
if ((count>2) && |
if ((count>2) && // enough data to determine sec length? |
((dvbdmxfeed->seclen=section_length(buf+p))<=count)) { |
((dvbdmxfeed->seclen=section_length(buf+p))<=count)) { |
memcpy(dvbdmxfeed->secbuf, buf+p, |
memcpy(dvbdmxfeed->secbuf, buf+p, |
dvbdmxfeed->seclen); |
dvbdmxfeed->seclen); |
dvbdmxfeed->secbufp=dvbdmxfeed->seclen; |
dvbdmxfeed->secbufp=dvbdmxfeed->seclen; |
count-=dvbdmxfeed->seclen; |
|
p+=dvbdmxfeed->seclen; |
p+=dvbdmxfeed->seclen; |
|
count=188-p; |
DvbDmxSWFilterSectionFeed(dvbdmxfeed); |
DvbDmxSWFilterSectionFeed(dvbdmxfeed); |
} else { |
|
|
// filling bytes until packet end? |
|
if (buf[p]==0xff) |
|
count=0; |
|
} else { // section continues to following ts block |
memcpy(dvbdmxfeed->secbuf, buf+p, count); |
memcpy(dvbdmxfeed->secbuf, buf+p, count); |
|
dvbdmxfeed->secbufp+=count; |
count=0; |
count=0; |
} |
} |
if (buf[p]==0xff) |
|
count=0; |
|
} |
} |
} else { |
} else { // section continued below |
if (!ccok) |
if (!ccok) |
return -1; |
return -1; |
|
if (!dvbdmxfeed->secbufp) // any data in last ts packet? |
|
return -1; |
|
// did we have enough data in last packet to calc section length? |
if (dvbdmxfeed->secbufp<3) { |
if (dvbdmxfeed->secbufp<3) { |
memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, buf+p, count); |
memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, buf+p, |
|
3-dvbdmxfeed->secbufp); |
dvbdmxfeed->seclen=section_length(dvbdmxfeed->secbuf); |
dvbdmxfeed->seclen=section_length(dvbdmxfeed->secbuf); |
dvbdmxfeed->secbufp+=count; |
|
return DvbDmxSWFilterSectionFeed(dvbdmxfeed); |
|
} |
} |
rest=dvbdmxfeed->seclen-dvbdmxfeed->secbufp; |
rest=dvbdmxfeed->seclen-dvbdmxfeed->secbufp; |
if (!dvbdmxfeed->seclen || rest<0 || rest<count) |
if (rest<0) |
return -1; |
return -1; |
memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, buf+p, count); |
if (rest<=count) { // section completed in this ts block |
dvbdmxfeed->secbufp+=count; |
memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, buf+p, rest); |
return DvbDmxSWFilterSectionFeed(dvbdmxfeed); |
dvbdmxfeed->secbufp+=rest; |
|
DvbDmxSWFilterSectionFeed(dvbdmxfeed); |
|
} else { // section continues in following ts block |
|
memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, buf+p, count); |
|
dvbdmxfeed->secbufp+=count; |
|
} |
|
|
} |
} |
return 0; |
return 0; |
} |
} |
Line 545 static int dvbdmx_release_ts_feed(dmx_de
|
Line 540 static int dvbdmx_release_ts_feed(dmx_de
|
|
|
if (dvbdmxfeed->state==DMX_STATE_FREE) |
if (dvbdmxfeed->state==DMX_STATE_FREE) |
return -EINVAL; |
return -EINVAL; |
if (dvbdmxfeed->buffer) |
if (dvbdmxfeed->buffer) |
vfree(dvbdmxfeed->buffer); |
vfree(dvbdmxfeed->buffer); |
dvbdmxfeed->buffer=0; |
dvbdmxfeed->buffer=0; |
dvbdmxfeed->state=DMX_STATE_FREE; |
dvbdmxfeed->state=DMX_STATE_FREE; |
Line 708 dmx_section_feed_release_filter(dmx_sect
|
Line 703 dmx_section_feed_release_filter(dmx_sect
|
if (dvbdmxfilter->feed!=dvbdmxfeed) |
if (dvbdmxfilter->feed!=dvbdmxfeed) |
return -EINVAL; |
return -EINVAL; |
if (feed->is_filtering) |
if (feed->is_filtering) |
return -EBUSY; |
feed->stop_filtering(feed); |
|
//return -EBUSY; |
|
|
f=dvbdmxfeed->filter; |
f=dvbdmxfeed->filter; |
if (f==dvbdmxfeed->filter) |
if (f==dvbdmxfeed->filter) |