]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts table: added MT_ONESHOT, change pmt scan weight
authorJaroslav Kysela <perex@perex.cz>
Mon, 27 Apr 2015 06:46:02 +0000 (08:46 +0200)
committerJaroslav Kysela <perex@perex.cz>
Mon, 27 Apr 2015 17:57:13 +0000 (19:57 +0200)
src/input/mpegts.h
src/input/mpegts/dvb_psi.c
src/input/mpegts/mpegts_table.c

index 119e1e20f6f6bdf3408cce5fad5cd9140cbddf39..474551e84aba799567ef14814749c1a99d1bcd52 100644 (file)
@@ -154,6 +154,7 @@ typedef struct mpegts_pid_sub
 #define MPS_WEIGHT_RAW      400
 #define MPS_WEIGHT_NIT2     300
 #define MPS_WEIGHT_SDT2     300
+#define MPS_WEIGHT_PMT_SCAN 100
   int   mps_weight;
   void *mps_owner;
 } mpegts_pid_sub_t;
@@ -183,12 +184,13 @@ struct mpegts_table
 #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
+#define MT_ONESHOT    0x0010
+#define MT_RECORD     0x0020
+#define MT_SKIPSUBS   0x0040
+#define MT_SCANSUBS   0x0080
+#define MT_FAST       0x0100
+#define MT_SLOW       0x0200
+#define MT_DEFER      0x0400
 
   /**
    * PID subscription weight
index 1411ca1d8b266f4eade0d97b37708121331d7c0b..6cf901286c2a08ad85f8b31ffd7dc9bee1d76e69 100644 (file)
@@ -889,8 +889,9 @@ dvb_pat_callback
         }
         s->s_dvb_check_seen = dispatch_clock;
         mpegts_table_add(mm, DVB_PMT_BASE, DVB_PMT_MASK, dvb_pmt_callback,
-                         NULL, "pmt", MT_CRC | MT_QUICKREQ | MT_SCANSUBS,
-                         pid, MPS_WEIGHT_PMT);
+                         NULL, "pmt",
+                         MT_CRC | MT_QUICKREQ | MT_ONESHOT | MT_SCANSUBS,
+                         pid, MPS_WEIGHT_PMT_SCAN);
 
         if (save)
           service_request_save((service_t*)s, 1);
index d3163f64d5de3a08b43c89498f77dc2c66663d52..beac5649a9ea173c7e51b810e388e17d00863331 100644 (file)
@@ -42,11 +42,13 @@ mpegts_table_consistency_check ( mpegts_mux_t *mm )
 }
 
 static void
-mpegts_table_fastswitch ( mpegts_mux_t *mm )
+mpegts_table_fastswitch ( mpegts_mux_t *mm, mpegts_table_t *mtm )
 {
   char buf[256];
   mpegts_table_t   *mt;
 
+  assert(mm == mtm->mt_mux);
+
   if(mm->mm_scan_state != MM_SCAN_STATE_ACTIVE)
     return;
 
@@ -59,6 +61,8 @@ mpegts_table_fastswitch ( mpegts_mux_t *mm )
       return;
     }
   }
+  if (mtm->mt_flags & MT_ONESHOT)
+    mm->mm_close_table(mm, mtm);
   pthread_mutex_unlock(&mm->mm_tables_lock);
 
   mpegts_mux_nice_name(mm, buf, sizeof(buf));
@@ -96,7 +100,7 @@ mpegts_table_dispatch
     mt->mt_count++;
 
   if(!ret && mt->mt_flags & (MT_QUICKREQ|MT_FASTSWITCH))
-    mpegts_table_fastswitch(mt->mt_mux);
+    mpegts_table_fastswitch(mt->mt_mux, mt);
 }
 
 void