Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
dvb psi: improve the TSID detection (avoid creation of shadow services)
- do not set TSID from SDT callback
- check TSID in SDT callback for table 0x42 (current mux)
- if TSID differs in PAT callback, skip it, but allow slower override
  (10 checks) when new TSID is broadcasted
  • Loading branch information
perexg committed May 27, 2016
1 parent bb64db6 commit 8725137
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 3 deletions.
1 change: 1 addition & 0 deletions src/input/mpegts.h
Expand Up @@ -415,6 +415,7 @@ struct mpegts_mux
char *mm_provider_network_name;
uint16_t mm_onid;
uint16_t mm_tsid;
int mm_tsid_checks;

int mm_update_pids_flag;
mtimer_t mm_update_pids_timer;
Expand Down
20 changes: 19 additions & 1 deletion src/input/mpegts/dvb_psi.c
Expand Up @@ -874,6 +874,24 @@ dvb_pat_callback

/* Multiplex */
tvhdebug("pat", "tsid %04X (%d)", tsid, tsid);
if (mm->mm_tsid && mm->mm_tsid != tsid) {
char buf[256];
if (++mm->mm_tsid_checks > 10) {
mpegts_mux_nice_name(mm, buf, sizeof(buf));
tvhwarn("pat", "%s: TSID change detected - old %04x (%d), new %04x (%d)",
buf, mm->mm_tsid, mm->mm_tsid, tsid, tsid);
mm->mm_tsid_checks = 0;
} else {
if (tvhtrace_enabled()) {
mpegts_mux_nice_name(mm, buf, sizeof(buf));
tvhtrace("pat", "%s: ignore TSID - old %04x (%d), new %04x (%d)",
buf, mm->mm_tsid, mm->mm_tsid, tsid, tsid);
}
return 0; /* keep rolling */
}
} else {
mm->mm_tsid_checks = 0;
}
mpegts_mux_set_tsid(mm, tsid, 1);

/* Process each programme */
Expand Down Expand Up @@ -1655,8 +1673,8 @@ dvb_sdt_callback

/* Find Transport Stream */
if (tableid == 0x42) {
if (mm->mm_tsid != tsid) return 0; /* keep rolling - perhaps PAT was not parsed yet */
mpegts_mux_set_onid(mm, onid);
mpegts_mux_set_tsid(mm, tsid, 1);
r = dvb_sdt_mux(mt, mm, mm, ptr, len, tableid);
if (r)
return r;
Expand Down
9 changes: 7 additions & 2 deletions src/input/mpegts/mpegts_mux.c
Expand Up @@ -243,6 +243,8 @@ mpegts_mux_instance_start
LIST_FOREACH(s, &mm->mm_services, s_dvb_mux_link)
s->s_dvb_check_seen = s->s_dvb_last_seen;

mm->mm_tsid_checks = 0;

/* Start */
mi->mi_display_name(mi, buf2, sizeof(buf2));
tvhinfo("mpegts", "%s - tuning on %s", buf, buf2);
Expand Down Expand Up @@ -1210,11 +1212,14 @@ mpegts_mux_set_network_name ( mpegts_mux_t *mm, const char *name )
int
mpegts_mux_set_onid ( mpegts_mux_t *mm, uint16_t onid )
{
char buf[256];
if (onid == mm->mm_onid)
return 0;
mm->mm_onid = onid;
mpegts_mux_nice_name(mm, buf, sizeof(buf));
if (tvhtrace_enabled()) {
char buf[256];
mpegts_mux_nice_name(mm, buf, sizeof(buf));
tvhtrace("mpegts", "%s - set onid %04X (%d)", buf, onid, onid);
}
idnode_changed(&mm->mm_id);
return 1;
}
Expand Down

0 comments on commit 8725137

Please sign in to comment.