Diff for /margi2/dvb_demux.c between versions 1.1 and 1.2

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)

Removed from v.1.1  
changed lines
  Added in v.1.2


LinuxTV legacy CVS <linuxtv.org/cvs>