From: Jaroslav Kysela Date: Fri, 27 May 2016 10:55:29 +0000 (+0200) Subject: dvb psi: improve the TSID detection (avoid creation of shadow services) X-Git-Tag: v4.2.1~468 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8725137fa4e5c69168796a5b9d06508516c3a52b;p=thirdparty%2Ftvheadend.git 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 --- diff --git a/src/input/mpegts.h b/src/input/mpegts.h index c8b260d0d..8c95d372b 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -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; diff --git a/src/input/mpegts/dvb_psi.c b/src/input/mpegts/dvb_psi.c index 0046821b4..abf123b13 100644 --- a/src/input/mpegts/dvb_psi.c +++ b/src/input/mpegts/dvb_psi.c @@ -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 */ @@ -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; diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index 0ee868ad1..daae4c2a8 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -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); @@ -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; }