]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts: add PMT monitoring option
authorAdam Sutton <dev@adamsutton.me.uk>
Tue, 22 Apr 2014 13:02:56 +0000 (14:02 +0100)
committerAdam Sutton <dev@adamsutton.me.uk>
Tue, 22 Apr 2014 13:02:56 +0000 (14:02 +0100)
PMT monitoring is currently disabled by default, need to decide whether
this is the correct behaviour. This should help low performance tuners.
Fixes #1986

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

index a919f8807576e32999d9db13c2a776c337c9e31a..9d8359a40dcb401a87f9b60563686ce097fcda63 100644 (file)
@@ -405,6 +405,12 @@ struct mpegts_service
    */
   int64_t  s_pcr_drift;
 
+  /**
+   * PMT monitoring
+   */
+
+  mpegts_table_t *s_pmt_mon; ///< Table entry for monitoring PMT
+
 };
 
 /* **************************************************************************
@@ -454,6 +460,8 @@ struct mpegts_input
 
   int mi_priority;
 
+  int mi_pmtmon;
+
   LIST_ENTRY(mpegts_input) mi_global_link;
 
   mpegts_network_link_list_t mi_networks;
index f4ce6b1145050532d023bd8859494e73ab7e7bfc..9f2ce048136b0c0b2d0c417b01c874b46c463eb9 100644 (file)
@@ -591,8 +591,12 @@ dvb_pat_callback
       tvhdebug("pat", "  sid %04X (%d) on pid %04X (%d)", sid, sid, pid, pid);
       int save = 0;
       if ((s = mpegts_service_find(mm, sid, pid, 1, &save))) {
-        mpegts_table_add(mm, DVB_PMT_BASE, DVB_PMT_MASK, dvb_pmt_callback,
-                         NULL, "pmt", MT_CRC | MT_QUICKREQ, pid);
+        if (mm->mm_active && mm->mm_active->mmi_input) {
+          mpegts_input_t *mi = mm->mm_active->mmi_input;
+          if (mi->mi_pmtmon)
+            mpegts_table_add(mm, DVB_PMT_BASE, DVB_PMT_MASK, dvb_pmt_callback,
+                             NULL, "pmt", MT_CRC | MT_QUICKREQ, pid);
+        }
 
         if (save)
           service_request_save((service_t*)s, 1);
index 225407999f15b480a1707da66ccc8f2ca192d82a..11936371b7658ed19ba4d1d42c6d50515c97d615 100644 (file)
@@ -153,6 +153,13 @@ const idclass_t mpegts_input_class =
       .list     = mpegts_input_class_network_enum,
       .rend     = mpegts_input_class_network_rend,
     },
+    {
+      .type     = PT_BOOL,
+      .id       = "pmtmon",
+      .name     = "Enable PMT monitor",
+      .off      = offsetof(mpegts_input_t, mi_pmtmon),
+      .opts     = PO_ADVANCED,
+    },
     {}
   }
 };
@@ -319,6 +326,12 @@ mpegts_input_open_service ( mpegts_input_t *mi, mpegts_service_t *s, int init )
 
   pthread_mutex_unlock(&s->s_stream_mutex);
   pthread_mutex_unlock(&mi->mi_output_lock);
+
+   /* Add PMT monitor */
+  s->s_pmt_mon =
+    mpegts_table_add(s->s_dvb_mux, DVB_PMT_BASE, DVB_PMT_MASK,
+                     dvb_pmt_callback, s, "pmt",
+                     MT_CRC, s->s_pmt_pid);
 }
 
 void
@@ -326,6 +339,11 @@ mpegts_input_close_service ( mpegts_input_t *mi, mpegts_service_t *s )
 {
   elementary_stream_t *st;
 
+  /* Close PMT table */
+  if (s->s_pmt_mon)
+    mpegts_table_destroy(s->s_pmt_mon);
+  s->s_pmt_mon = NULL;
+
   /* Remove from list */
   pthread_mutex_lock(&mi->mi_output_lock);
   if (s->s_dvb_active_input != NULL) {
@@ -340,6 +358,7 @@ mpegts_input_close_service ( mpegts_input_t *mi, mpegts_service_t *s )
   TAILQ_FOREACH(st, &s->s_components, es_link)
     mi->mi_close_pid(mi, s->s_dvb_mux, st->es_pid, MPS_STREAM, s);
 
+
   pthread_mutex_unlock(&s->s_stream_mutex);
   pthread_mutex_unlock(&mi->mi_output_lock);