--- multiplexer/splicets.c 2001/08/02 14:51:22 1.15 +++ multiplexer/splicets.c 2001/08/08 09:59:58 1.16 @@ -31,6 +31,7 @@ const boolean splice_multipleprograms = TRUE; static boolean changed_pat; +static boolean unchanged_pat; static int pat_section; static const int last_patsection = 0; static byte nextpat_version; @@ -463,7 +464,6 @@ static int make_pmtsection (stream_descr int i; byte *d; stump_descr *st; - p->changed = FALSE; d = dest; *d++ = TS_TABLEID_PMT; d += 2; @@ -471,7 +471,6 @@ static int make_pmtsection (stream_descr *d++ = (i >> 8); *d++ = i; *d++ = 0xC0 | 0x01 | (p->pmt_version << 1); - p->pmt_version = (p->pmt_version+1) & 0x1F; *d++ = 0; *d++ = 0; if (p->pcr_pid < 0) { @@ -591,6 +590,8 @@ static void procdata_check_psi (int *pid ctrl_buffer *c) { t_msec now; + int i, l; + prog_descr *p; if (psi_size > 0) { *pid = psi_pid; *scramble = 0; @@ -601,23 +602,26 @@ static void procdata_check_psi (int *pid if ((psi_frequency_changed) || ((psi_frequency_msec > 0) && ((next_psi_periodic - now) <= 0))) { - int l; - changed_pat = TRUE; + unchanged_pat = TRUE; l = progs; while (--l >= 0) { - prog[l]->changed = TRUE; + prog[l]->unchanged = TRUE; } psi_frequency_changed = FALSE; next_psi_periodic = now + psi_frequency_msec; } - if (changed_pat) { + if (unchanged_pat || changed_pat) { psi_pid = TS_PID_PAT; conticnt = &pat_conticnt; psi_data[0] = 0; + if ((pat_section == 0) + && (changed_pat)) { + nextpat_version = (nextpat_version+1) & 0x1F; + } psi_size = make_patsection (pat_section,&psi_data[1]) + 1; if (pat_section >= last_patsection) { changed_pat = FALSE; - nextpat_version = (nextpat_version+1) & 0x1F; + unchanged_pat = FALSE; pat_section = 0; } else { pat_section += 1; @@ -627,20 +631,24 @@ static void procdata_check_psi (int *pid *scramble = 0; *size = psi_size; } else { - int l; l = s->u.d.progs; while (--l >= 0) { - if (s->u.d.pdescr[l]->changed) { - int i; - i = s->u.d.pdescr[l]->streams; + p = s->u.d.pdescr[l]; + if (p->unchanged || p->changed) { + i = p->streams; while ((--i >= 0) - && (!s->u.d.pdescr[l]->stream[i]->u.d.mention)) { + && (!p->stream[i]->u.d.mention)) { } if (i >= 0) { - psi_pid = s->u.d.pdescr[l]->pmt_pid; - conticnt = &s->u.d.pdescr[l]->pmt_conticnt; + psi_pid = p->pmt_pid; + conticnt = &p->pmt_conticnt; psi_data[0] = 0; - psi_size = make_pmtsection (s,s->u.d.pdescr[l],&psi_data[1]) + 1; + if (p->changed) { + p->pmt_version = (p->pmt_version+1) & 0x1F; + } + psi_size = make_pmtsection (s,p,&psi_data[1]) + 1; + p->changed = FALSE; + p->unchanged = FALSE; psi_done = 0; *pid = psi_pid; *scramble = 0;