Diff for /multiplexer/splice.c between versions 1.6 and 1.7

version 1.6, 2001/08/01 08:23:18 version 1.7, 2001/08/02 14:51:22
Line 23  t_msec next_psi_periodic; Line 23  t_msec next_psi_periodic;
 t_msec psi_frequency_msec;  t_msec psi_frequency_msec;
 boolean psi_frequency_changed;  boolean psi_frequency_changed;
   
 boolean configuration_on;  int configuration_on;
 boolean configuration_changed;  boolean configuration_changed;
   boolean configuration_descr_changed;
 const char *configuration_total = "Conf: progs: %d\n";  const char *configuration_total = "Conf: progs: %d\n";
   
   static modifydescr_descr *globalmodifydescr;
   
 boolean splice_init (void)  boolean splice_init (void)
 {  {
   psi_frequency_msec = 0;    psi_frequency_msec = 0;
   psi_frequency_changed = FALSE;    psi_frequency_changed = FALSE;
   configuration_on = FALSE;    configuration_on = 0;
     globalmodifydescr = NULL;
   return (splice_specific_init ());    return (splice_specific_init ());
 }  }
   
Line 213  stream_descr *splice_findpcrstream (prog Line 217  stream_descr *splice_findpcrstream (prog
   return (NULL);    return (NULL);
 }  }
   
   /* Print configuration of descriptors
    * Precondition: manud!=NULL
    */
   static void splice_descr_configuration (descr_descr *manud,
       descr_descr *autod)
   {
     int i, l;
     byte *y;
     i = NUMBER_DESCR;
     while (--i >= 0) {
       y = manud->refx[i];
       if (y == NULL) {
         if (autod != NULL) {
           y = autod->refx[i];
         }
       } else if (y[1] == 0) {
         y = NULL;
       }
       if (y != NULL) {
         l = y[1];
         fprintf (stderr, "Conf: descr:%02X len:%d data:", *y++, l);
         while (--l >= 0) {
           fprintf (stderr, "%02X", *++y);
         }
         fprintf (stderr, "\n");
       }
     }
   }
   
 /* Print configuration for one program  /* Print configuration for one program
  * Precondition: p!=NULL   * Precondition: p!=NULL
  */   */
Line 233  void splice_one_configuration (prog_desc Line 266  void splice_one_configuration (prog_desc
     fprintf (stderr, " (%d)", s);      fprintf (stderr, " (%d)", s);
   }    }
   fprintf (stderr, "\n");    fprintf (stderr, "\n");
     if (configuration_on > 1) {
       splice_descr_configuration (&p->manudescr, NULL); /* Missing auto descr! */
     }
   while (--i >= 0) {    while (--i >= 0) {
     stream_descr *s;      stream_descr *s;
     s = p->stream[i];      s = p->stream[i];
Line 240  void splice_one_configuration (prog_desc Line 276  void splice_one_configuration (prog_desc
       "file:%d source:%04hX num:%2d name:%s\n",        "file:%d source:%04hX num:%2d name:%s\n",
       s->u.d.pid, s->stream_type, s->stream_id,        s->u.d.pid, s->stream_type, s->stream_id,
       s->fdescr->content, s->sourceid, s->fdescr->filerefnum, s->fdescr->name);        s->fdescr->content, s->sourceid, s->fdescr->filerefnum, s->fdescr->name);
       if (configuration_on > 1) {
         splice_descr_configuration (s->manudescr, s->autodescr);
       }
   }    }
   st = p->stump;    st = p->stump;
   while (st != NULL) {    while (st != NULL) {
     fprintf (stderr, "Conf: stream:%04hX type:%02X\n",      fprintf (stderr, "Conf: stream:%04hX type:%02X\n",
       st->pid, st->stream_type);        st->pid, st->stream_type);
       if (configuration_on > 1) {
         splice_descr_configuration (&st->manudescr, NULL);
       }
     st = st->next;      st = st->next;
   }    }
 }  }
   
 void splice_set_configuration (boolean on)  void splice_set_configuration (int on)
 {  {
   configuration_on = on;    configuration_on = on;
   configuration_changed = TRUE;    configuration_changed = TRUE;
 }  }
   
   static void splice_modifydescriptor (descr_descr *md,
       int dtag,
       int dlength,
       byte *data,
       stream_descr *s)
   {
     int i, j;
     byte *t, *u;
     if (dtag < 0) {
       clear_descrdescr (md);
     } else {
       t = md->refx[dtag];
       if ((dlength < 0)
        || ((t != NULL)
         && (t != &md->null[0]))) {
         j = t[1]+2;
         i = NUMBER_DESCR;
         while (--i >= 0) {
           if ((md->refx[i]-t) > 0) {
             md->refx[i] -= j;
           }
         }
         memmove (t,&t[j],sizeof(md->data)-(j+(t-&md->data[0])));
       }
       if (dlength == 0) {
         t = &md->null[0];
       } else if (dlength < 0) {
         t = NULL;
       } else {
         i = NUMBER_DESCR;
         t = &md->data[0];
         while (--i >= 0) {
           u = md->refx[i];
           if (u != NULL) {
             u = &u[u[1]+2];
             if ((u-t) > 0) {
               t = u;
             }
           }
         }
         if (t-&md->data[0] < 0) {
           warn (LERR,"No space left",ESPC,5,2,t-&md->data[0]);
           return;
         }
         if ((t-&md->data[0]+dlength+2-MAX_PSI_SIZE) > 0) {
           warn (LWAR,"No space left",ESPC,5,1,t-&md->data[0]);
           return;
         }
         t[0] = dtag;
         t[1] = dlength;
         memcpy (&t[2],data,dlength);
       }
       md->refx[dtag] = t;
     }
     if (s != NULL) {
       i = s->u.d.progs;
       while (--i >= 0) {
         s->u.d.pdescr[i]->changed = TRUE;
       }
     }
   }
   
   static void splice_modifydescrlater (int programnb,
       short sid,
       short pid,
       int dtag,
       int dlength,
       byte *data)
   {
     modifydescr_descr *l;
     modifydescr_descr **pl;
     pl = &globalmodifydescr;
     l = *pl;
     while (l != NULL) {
       if ((programnb < 0) /* delete older matching entries */
        || ((programnb == l->programnb)
         && ((pid == 0)
          || ((pid == l->pid)
           && (sid == l->sid)
           && ((dtag < 0)
            || (dtag == l->dtag)))))) {
         *pl = l->next;
         free (l);
       } else {
         pl = &l->next;
       }
       l = *pl;
     }
     if ((dtag >= 0)
      && (dlength >= 0)) { /* don't save modifiers, that delete */
       if ((l = malloc (sizeof(modifydescr_descr))) != NULL) {
         l->next = NULL;
         l->programnb = programnb;
         l->sid = sid;
         l->pid = pid;
         l->dtag = dtag;
         l->dlength = dlength;
         if (dlength > 0) {
           memcpy (&l->data[0],data,dlength);
         }
         *pl = l; /* append at end of list */
       } else {
         warn (LERR,"Malloc fail",ETSC,12,1,programnb);
       }
     }
   }
   
   /* For a new program and maybe stream or stump,
    * check presence of applicable descriptors, that have been stored.
    * All non-NULL parameters must be completely linked into p upon call!
    * Precondition: p != NULL
    */
   void splice_modifycheckmatch (int programnb,
       prog_descr *p,
       stream_descr *s,
       stump_descr *st)
   {
     modifydescr_descr *l;
     modifydescr_descr **pl;
     pl = &globalmodifydescr;
     l = *pl;
     while (l != NULL) {
       if ((programnb == l->programnb)
        && (((l->sid < 0)
          && (l->pid < 0))
         || ((l->pid > 0)
          && (((s != NULL)
            && (l->pid == s->u.d.pid))
           || ((st != NULL)
            && (l->pid = st->pid))))
         || ((l->sid >= 0)
          && (s != NULL)
          && (l->sid == s->stream_id)))) {
         splice_modifytargetdescrprog (p,programnb,
             l->sid,l->pid,l->dtag,l->dlength,&l->data[0],st);
         *pl = l->next;
         free (l);
       } else {
         pl = &l->next;
       }
       l = *pl;
     }
   }
   
   /* Modify an entry in a manudescr struct.
    */
   void splice_modifytargetdescrprog (prog_descr *p,
       int programnb,
       short sid,
       short pid,
       int dtag,
       int dlength,
       byte *data,
       stump_descr *globstump)
   {
     int i;
     stream_descr *s;
     stump_descr *st;
     if (sid >= 0) {
       if (p != NULL) {
         i = p->streams;
         while (--i >= 0) {
           s = p->stream[i];
           if (s->stream_id == sid) {
             splice_modifydescriptor (s->manudescr,dtag,dlength,data,s);
             configuration_descr_changed = TRUE;
             return;
           }
         }
       }
       splice_modifydescrlater (programnb,sid,pid,dtag,dlength,data);
     } else {
       if (pid > 0) {
         if (p != NULL) {
           i = p->streams;
           while (--i >= 0) {
             s = p->stream[i];
             if (s->u.d.pid == pid) {
               splice_modifydescriptor (s->manudescr,dtag,dlength,data,s);
               configuration_descr_changed = TRUE;
               return;
             }
           }
           st = p->stump;
         } else {
           st = globstump;
         }
         while (st != NULL) {
           if ((st->pid == pid)
            && (st->program_number == programnb)) {
             splice_modifydescriptor (&st->manudescr,dtag,dlength,data,NULL);
             if (p != NULL) {
               p->changed = TRUE;
             }
             configuration_descr_changed = TRUE;
             return;
           }
           st = st->next;
         }
         splice_modifydescrlater (programnb,sid,pid,dtag,dlength,data);
       } else if (pid < 0) {
         if (p != NULL) {
           splice_modifydescriptor (&p->manudescr,dtag,dlength,data,NULL);
           p->changed = TRUE;
           configuration_descr_changed = TRUE;
         } else {
           splice_modifydescrlater (programnb,sid,pid,dtag,dlength,data);
         }
       } else {
         if (p != NULL) {
           i = p->streams;
           while (--i >= 0) {
             s = p->stream[i];
             splice_modifydescriptor (s->manudescr,dtag,dlength,data,s);
           }
           splice_modifydescriptor (&p->manudescr,dtag,dlength,data,NULL);
           configuration_descr_changed = TRUE;
           st = p->stump;
         } else {
           st = globstump;
         }
         while (st != NULL) {
           if (st->program_number == programnb) {
             splice_modifydescriptor (&st->manudescr,dtag,dlength,data,NULL);
           }
           st = st->next;
         }
         splice_modifydescrlater (programnb,sid,pid,dtag,dlength,data);
       }
     }
   }
   

Removed from v.1.6  
changed lines
  Added in v.1.7


LinuxTV legacy CVS <linuxtv.org/cvs>