]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
bouquets: scan + bat tables - fix the scan end condition for bouquets
authorJaroslav Kysela <perex@perex.cz>
Wed, 5 Nov 2014 15:43:28 +0000 (16:43 +0100)
committerJaroslav Kysela <perex@perex.cz>
Sat, 8 Nov 2014 20:05:38 +0000 (21:05 +0100)
src/input/mpegts.h
src/input/mpegts/dvb_psi.c
src/input/mpegts/mpegts_mux.c
src/input/mpegts/mpegts_table.c

index c898a1a5ea9ab4fbd8dc17149a85c70bda36f514..eb39160dba01142f6af927824507b3059710e506 100644 (file)
@@ -110,6 +110,7 @@ typedef struct mpegts_table_state
   uint64_t extraid;
   int      version;
   int      complete;
+  int      working;
   uint32_t sections[8];
   RB_ENTRY(mpegts_table_state)   link;
 } mpegts_table_state_t;
@@ -142,15 +143,16 @@ struct mpegts_table
    */
   int mt_flags;
 
-#define MT_CRC      0x0001
-#define MT_FULL     0x0002
-#define MT_QUICKREQ 0x0004
-#define MT_RECORD   0x0008
-#define MT_SKIPSUBS 0x0010
-#define MT_SCANSUBS 0x0020
-#define MT_FAST     0x0040
-#define MT_SLOW     0x0080
-#define MT_DEFER    0x0100
+#define MT_CRC        0x0001
+#define MT_FULL       0x0002
+#define MT_QUICKREQ   0x0004
+#define MT_FASTSWITCH 0x0008
+#define MT_RECORD     0x0010
+#define MT_SKIPSUBS   0x0020
+#define MT_SCANSUBS   0x0040
+#define MT_FAST       0x0080
+#define MT_SLOW       0x0100
+#define MT_DEFER      0x0200
 
   /**
    * Cycle queue
@@ -184,6 +186,8 @@ struct mpegts_table
 #define MT_DEFER_OPEN_PID  1
 #define MT_DEFER_CLOSE_PID 2
 
+  int mt_working;
+
   int mt_count;
 
   int mt_pid;
index 9ef3426b785c67c3e64b05302edbe8a5aae11b77..02c6e480f01a774e48020e8aff0b4418c6ba5b34 100644 (file)
@@ -1165,8 +1165,11 @@ dvb_nit_callback
   if (r == 0) {
     if (tableid == 0x4A) {
       if ((b = mt->mt_bat) != NULL) {
-        if (!b->complete)
+        if (!b->complete) {
           dvb_bat_completed(b, mt->mt_name, tableid, mm->mm_tsid, nbid, mm);
+          mt->mt_working -= st->working;
+          st->working = 0;
+        }
         if (b->complete)
           dvb_bat_destroy_lists(mt);
       }
@@ -1205,6 +1208,11 @@ dvb_nit_callback
       TAILQ_INIT(&bi->services);
       LIST_INSERT_HEAD(&b->bats, bi, link);
     }
+    if (!st->working) {
+      st->working = 1;
+      mt->mt_working++;
+      mt->mt_flags |= MT_FASTSWITCH;
+    }
   }
 
   /* Network Descriptors */
@@ -1639,7 +1647,11 @@ dvb_fs_sdt_callback
   if (tableid != 0xBD)
     return -1;
   r = dvb_table_begin(mt, ptr, len, tableid, nbid, 7, &st, &sect, &last, &ver);
-  if (r == 0) bouquet_completed(bq);
+  if (r == 0) {
+    mt->mt_working -= st->working;
+    st->working = 0;
+    bouquet_completed(bq);
+  }
   if (r != 1) return r;
   if (len < 5) return -1;
   ptr += 5;
@@ -1751,6 +1763,12 @@ dvb_fs_sdt_callback
       idnode_changed(&s->s_id);
       service_refresh_channel((service_t*)s);
     }
+
+    if (!st->working) {
+      st->working = 1;
+      mt->mt_working++;
+      mt->mt_flags |= MT_FASTSWITCH;
+    }
   }
 
   if (bq && bq->bq_saveflag)
@@ -1758,7 +1776,6 @@ dvb_fs_sdt_callback
 
   /* End */
   return dvb_table_end(mt, st, sect);
-
 }
 #endif
 
index 9c9aa054cf3644ee74339fe1cdb97b0b6598e354..e1e4140458da1e49c472f4863ab590204a14b1ec 100644 (file)
@@ -866,7 +866,7 @@ mpegts_mux_scan_done ( mpegts_mux_t *mm, const char *buf, int res )
 static void
 mpegts_mux_scan_timeout ( void *aux )
 {
-  int c, q;
+  int c, q, w;
   char buf[256];
   mpegts_mux_t *mm = aux;
   mpegts_table_t *mt;
@@ -884,17 +884,19 @@ mpegts_mux_scan_timeout ( void *aux )
 again:
   pthread_mutex_lock(&mm->mm_tables_lock);
   mpegts_table_consistency_check(mm);
-  c = q = 0;
+  c = q = w = 0;
   LIST_FOREACH(mt, &mm->mm_tables, mt_link) {
-    if (!(mt->mt_flags & MT_QUICKREQ)) continue;
+    if (!(mt->mt_flags & MT_QUICKREQ) && !mt->mt_working) continue;
     if (!mt->mt_count) {
       mpegts_table_grab(mt);
       pthread_mutex_unlock(&mm->mm_tables_lock);
       mpegts_table_destroy(mt);
       mpegts_table_release(mt);
       goto again;
-    } else if (!mt->mt_complete) {
+    } else if (!mt->mt_complete || mt->mt_working) {
       q++;
+      if (mt->mt_working)
+        w++;
     } else {
       c++;
     }
@@ -906,10 +908,10 @@ again:
     tvhinfo("mpegts", "%s - scan no data, failed", buf);
     mpegts_mux_scan_done(mm, buf, 0);
 
-  /* Pending tables (another 20s - bit arbitrary) */
+  /* Pending tables (another 20s or 30s - bit arbitrary) */
   } else if (q) {
-    tvhinfo("mepgts", "%s - scan needs more time", buf);
-    gtimer_arm(&mm->mm_scan_timeout, mpegts_mux_scan_timeout, mm, 20);
+    tvhinfo("mpegts", "%s - scan needs more time", buf);
+    gtimer_arm(&mm->mm_scan_timeout, mpegts_mux_scan_timeout, mm, w ? 30 : 20);
     return;
 
   /* Complete */
index 3da63d1237734f1e25ad52c5669dd4580004ce6b..31c71f9d6b65630029b601d3d6695a0746042abb 100644 (file)
@@ -52,8 +52,9 @@ mpegts_table_fastswitch ( mpegts_mux_t *mm )
 
   pthread_mutex_lock(&mm->mm_tables_lock);
   LIST_FOREACH(mt, &mm->mm_tables, mt_link) {
-    if (!(mt->mt_flags & MT_QUICKREQ)) continue;
-    if(!mt->mt_complete) {
+    if (!(mt->mt_flags & MT_QUICKREQ) && !mt->mt_working)
+      continue;
+    if(!mt->mt_complete || mt->mt_working) {
       pthread_mutex_unlock(&mm->mm_tables_lock);
       return;
     }
@@ -126,7 +127,7 @@ mpegts_table_dispatch
   if(ret >= 0)
     mt->mt_count++;
 
-  if(!ret && mt->mt_flags & MT_QUICKREQ)
+  if(!ret && mt->mt_flags & (MT_QUICKREQ|MT_FASTSWITCH))
     mpegts_table_fastswitch(mt->mt_mux);
 }