]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts: DVB scan - add OK (partial) status
authorJaroslav Kysela <perex@perex.cz>
Sat, 26 Sep 2015 19:53:51 +0000 (21:53 +0200)
committerJaroslav Kysela <perex@perex.cz>
Sat, 26 Sep 2015 19:53:54 +0000 (21:53 +0200)
It seems that few tables are not completely read during
the short scan phase or broadcaster are crazy enough to
add invalid tables (tested mostly on 1W satellite position).

src/input/mpegts.h
src/input/mpegts/mpegts_mux.c
src/input/mpegts/mpegts_network_scan.c
src/input/mpegts/mpegts_network_scan.h
src/input/mpegts/mpegts_table.c

index 2290a88513276d30e06e34eaccca669b2a8d3f14..d4ad64b34d4928b68fd9317d51f01d65a5bb20a6 100644 (file)
@@ -343,9 +343,13 @@ typedef enum mpegts_mux_scan_result
 {
   MM_SCAN_NONE,
   MM_SCAN_OK,
-  MM_SCAN_FAIL
+  MM_SCAN_FAIL,
+  MM_SCAN_PARTIAL
 } mpegts_mux_scan_result_t;
 
+#define MM_SCAN_CHECK_OK(mm) \
+  ((mm)->mm_scan_result == MM_SCAN_OK || (mm)->mm_scan_result == MM_SCAN_PARTIAL)
+
 enum mpegts_mux_epg_flag
 {
   MM_EPG_DISABLE,
index df2c61863dad9a6b23c6ab1b81ae33ea265d7d29..fde69fb375595f0de5c299c8ac6025a75de15c07 100644 (file)
@@ -177,7 +177,7 @@ mpegts_mux_subscribe_linked
   LIST_FOREACH(mnl2, &mi2->mi_networks, mnl_mi_link)
     if (mnl2->mnl_network == mm->mm_network)
       LIST_FOREACH(mm2, &mnl2->mnl_network->mn_muxes, mm_network_link)
-        if (!mm2->mm_active && mm->mm_scan_result == MM_SCAN_OK &&
+        if (!mm2->mm_active && MM_SCAN_CHECK_OK(mm) &&
             !LIST_EMPTY(&mm2->mm_services))
           if (!mpegts_mux_subscribe_keep(mm2, mi2))
             return;
@@ -186,7 +186,7 @@ mpegts_mux_subscribe_linked
   LIST_FOREACH(mnl2, &mi2->mi_networks, mnl_mi_link)
     if (mnl2->mnl_network != mm->mm_network)
       LIST_FOREACH(mm2, &mnl2->mnl_network->mn_muxes, mm_network_link)
-        if (!mm2->mm_active && mm->mm_scan_result == MM_SCAN_OK &&
+        if (!mm2->mm_active && MM_SCAN_CHECK_OK(mm) &&
             !LIST_EMPTY(&mm2->mm_services))
           if (!mpegts_mux_subscribe_keep(mm2, mi2))
             return;
@@ -385,9 +385,10 @@ scan_state_tab[] = {
 
 static struct strtab
 scan_result_tab[] = {
- { N_("NONE"),    MM_SCAN_NONE },
- { N_("OK"),      MM_SCAN_OK   },
- { N_("FAIL"),    MM_SCAN_FAIL },
+ { N_("NONE"),         MM_SCAN_NONE },
+ { N_("OK"),           MM_SCAN_OK   },
+ { N_("FAIL"),         MM_SCAN_FAIL },
+ { N_("OK (partial)"), MM_SCAN_PARTIAL },
 };
 
 int
@@ -960,6 +961,7 @@ void
 mpegts_mux_scan_done ( mpegts_mux_t *mm, const char *buf, int res )
 {
   mpegts_table_t *mt;
+  int total = 0, incomplete = 0;
 
   assert(mm->mm_scan_state == MM_SCAN_STATE_ACTIVE);
 
@@ -969,20 +971,36 @@ mpegts_mux_scan_done ( mpegts_mux_t *mm, const char *buf, int res )
   LIST_FOREACH(mt, &mm->mm_tables, mt_link) {
     if (mt->mt_flags & MT_QUICKREQ) {
       const char *s = "not found";
-      if (mt->mt_complete)
+      if (mt->mt_complete) {
         s = "complete";
-      else if (mt->mt_count)
+        total++;
+      } else if (mt->mt_count) {
         s = "incomplete";
+        total++;
+        incomplete++;
+      }
       tvhdebug("mpegts", "%s - %04X (%d) %s %s", buf, mt->mt_pid, mt->mt_pid, mt->mt_name, s);
     }
   }
   pthread_mutex_unlock(&mm->mm_tables_lock);
 
-  if (res) {
+  if (res < 0) {
+    /* is threshold 3 missing tables enough? */
+    if (incomplete > 0 && total > incomplete && incomplete <= 3) {
+      tvhinfo("mpegts", "%s - scan complete (partial - %d/%d tables)", buf, total, incomplete);
+      mpegts_network_scan_mux_partial(mm);
+    } else {
+      tvhinfo("mpegts", "%s - scan timed out (%d/%d tables)", buf, total, incomplete);
+      mpegts_network_scan_mux_fail(mm);
+    }
+  } else if (res) {
+    tvhinfo("mpegts", "%s scan complete", buf);
     mpegts_network_scan_mux_done(mm);
     mpegts_mux_scan_service_check(mm);
-  } else
+  } else {
+    tvhinfo("mpegts", "%s - scan no data, failed", buf);
     mpegts_network_scan_mux_fail(mm);
+  }
 }
 
 static void
@@ -996,8 +1014,7 @@ mpegts_mux_scan_timeout ( void *aux )
 
   /* Timeout */
   if (mm->mm_scan_init) {
-    tvhinfo("mpegts", "%s - scan timed out", buf);
-    mpegts_mux_scan_done(mm, buf, 0);
+    mpegts_mux_scan_done(mm, buf, -1);
     return;
   }
   mm->mm_scan_init = 1;
@@ -1027,7 +1044,6 @@ again:
       
   /* No DATA - give up now */
   if (!c) {
-    tvhinfo("mpegts", "%s - scan no data, failed", buf);
     mpegts_mux_scan_done(mm, buf, 0);
 
   /* Pending tables (another 20s or 30s - bit arbitrary) */
@@ -1038,7 +1054,6 @@ again:
 
   /* Complete */
   } else {
-    tvhinfo("mpegts", "%s - scan complete", buf);
     mpegts_mux_scan_done(mm, buf, 1);
   }
 }
index ff800f1fd969d41d734abb16201e2f47326f8b75..fdb9dd072384518fecd0730e0a8c42bf20b6bac5 100644 (file)
@@ -147,11 +147,11 @@ mpegts_network_scan_mux_done    ( mpegts_mux_t *mm )
   mpegts_network_scan_mux_done0(mm, MM_SCAN_OK, 0);
 }
 
-/* Failed - no input */
+/* Partially completed (not all tables were read) */
 void
-mpegts_network_scan_mux_timeout ( mpegts_mux_t *mm )
+mpegts_network_scan_mux_partial ( mpegts_mux_t *mm )
 {
-  mpegts_network_scan_mux_done0(mm, MM_SCAN_FAIL, 0);
+  mpegts_network_scan_mux_done0(mm, MM_SCAN_PARTIAL, 0);
 }
 
 /* Interrupted (re-add) */
index 7f44d3c8b7c9d4c622a9831fdfad1d416fe96d71..748eee03b525a917f7c1576f97919b1af56fc723 100644 (file)
@@ -42,7 +42,7 @@ void mpegts_network_scan_queue_del ( mpegts_mux_t *mm );
  */
 void mpegts_network_scan_mux_fail    ( mpegts_mux_t *mm );
 void mpegts_network_scan_mux_done    ( mpegts_mux_t *mm );
-void mpegts_network_scan_mux_timeout ( mpegts_mux_t *mm );
+void mpegts_network_scan_mux_partial ( mpegts_mux_t *mm );
 void mpegts_network_scan_mux_cancel  ( mpegts_mux_t *mm, int reinsert );
 void mpegts_network_scan_mux_active  ( mpegts_mux_t *mm );
 
index ef3382c5bde4ff6978820104e62baddc7c01ab4e..74e2f26890288fe2392e4a22380dfb3a06520e08 100644 (file)
@@ -74,7 +74,6 @@ mpegts_table_fastswitch ( mpegts_mux_t *mm, mpegts_table_t *mtm )
   pthread_mutex_unlock(&mm->mm_tables_lock);
 
   mpegts_mux_nice_name(mm, buf, sizeof(buf));
-  tvhinfo("mpegts", "%s scan complete", buf);
   mpegts_mux_scan_done(mm, buf, 1);
 }