]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
dvb psi: improve the TSID detection (avoid creation of shadow services)
authorJaroslav Kysela <perex@perex.cz>
Fri, 27 May 2016 10:55:29 +0000 (12:55 +0200)
committerJaroslav Kysela <perex@perex.cz>
Fri, 27 May 2016 10:59:45 +0000 (12:59 +0200)
- 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

src/input/mpegts.h
src/input/mpegts/dvb_psi.c
src/input/mpegts/mpegts_mux.c

index c8b260d0d6f378c57eb919c7beeb5613218bd363..8c95d372b0b8a983c16854a4f634e6e0b421826b 100644 (file)
@@ -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;
index 0046821b4de0e71d2c96c5c1ca6a220ddba95a43..abf123b1363d5cca45601503888a6dea4e0debef 100644 (file)
@@ -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;
index 0ee868ad14612eed7739f53eb416f7fdf1fb4ad3..daae4c2a8eabd042f18f4e352044aef5576d690e 100644 (file)
@@ -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;
 }