Diff for /margi2/dvb_demux.c between versions 1.8 and 1.9

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;
         }          }
 }  }
   

Removed from v.1.8  
changed lines
  Added in v.1.9


LinuxTV legacy CVS <linuxtv.org/cvs>