]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts mux: implement enable/disable/ignore mux settings
authorJaroslav Kysela <perex@perex.cz>
Mon, 30 May 2016 13:03:00 +0000 (15:03 +0200)
committerJaroslav Kysela <perex@perex.cz>
Mon, 30 May 2016 13:03:00 +0000 (15:03 +0200)
src/epggrab/module/eit.c
src/input/mpegts.h
src/input/mpegts/dvb_psi.c
src/input/mpegts/mpegts_dvb.h
src/input/mpegts/mpegts_mux.c
src/input/mpegts/mpegts_network.c
src/input/mpegts/mpegts_network_dvb.c
src/satip/rtsp.c

index 3fa2c6087ec92a9025ac4b1ed4d0198354ec109f..19505ce5574c5b09460f01a0126a4d5420b582e5 100644 (file)
@@ -673,7 +673,7 @@ _eit_callback
   // Note: tableid=0x4f,0x60-0x6f is other TS
   //       so must find the tdmi
   if(tableid == 0x4f || tableid >= 0x60) {
-    mm = mpegts_network_find_mux(mm->mm_network, onid, tsid);
+    mm = mpegts_network_find_mux(mm->mm_network, onid, tsid, 1);
 
   } else {
     if ((mm->mm_tsid != tsid || mm->mm_onid != onid) &&
index 8c95d372b0b8a983c16854a4f634e6e0b421826b..b7b8e3cb713cfca93051fc72e8e09d493169a5dc 100644 (file)
@@ -365,12 +365,20 @@ typedef enum mpegts_mux_scan_result
   MM_SCAN_NONE,
   MM_SCAN_OK,
   MM_SCAN_FAIL,
-  MM_SCAN_PARTIAL
+  MM_SCAN_PARTIAL,
+  MM_SCAN_IGNORE,
 } 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_enable
+{
+  MM_IGNORE  = -1,
+  MM_DISABLE =  0,
+  MM_ENABLE  =  1,
+};
+
 enum mpegts_mux_epg_flag
 {
   MM_EPG_DISABLE,
@@ -825,7 +833,7 @@ static inline mpegts_network_t *mpegts_network_find(const char *uuid)
   { return idnode_find(uuid, &mpegts_network_class, NULL); }
 
 mpegts_mux_t *mpegts_network_find_mux
-  (mpegts_network_t *mn, uint16_t onid, uint16_t tsid);
+  (mpegts_network_t *mn, uint16_t onid, uint16_t tsid, int check);
 
 void mpegts_network_class_delete ( const idclass_t *idc, int delconf );
 
index 4dad4aff56fe9ad9f167d77525f6eb9b23c8d883..0e961bb08e079e505896745e149ce25189ad9f1f 100644 (file)
@@ -97,6 +97,7 @@ mpegts_mux_alive(mpegts_mux_t *mm)
   /*
    * Return, if mux seems to be alive for updating.
    */
+  if (mm->mm_enabled != MM_ENABLE) return 0;
   return !LIST_EMPTY(&mm->mm_services) && mm->mm_scan_result != MM_SCAN_FAIL;
 }
 
@@ -1181,7 +1182,7 @@ dvb_nit_mux
   const char *charset;
   char buf[128], dauth[256];
 
-  if (mux && !mux->mm_enabled)
+  if (mux && mux->mm_enabled != MM_ENABLE)
     bi = NULL;
 
   charset = dvb_charset_find(mux ? mux->mm_network : mm->mm_network, mux, NULL);
index 0258e7cf2ee1e41d4bb4fb70516f9d04510b8a76..c0f446502678867848d8a38a895e5fd00da6d614 100644 (file)
@@ -70,7 +70,7 @@ dvb_network_t *dvb_network_create0
   ( const char *uuid, const idclass_t *idc, htsmsg_t *conf );
 
 dvb_mux_t *dvb_network_find_mux
-  ( dvb_network_t *ln, dvb_mux_conf_t *dmc, uint16_t onid, uint16_t tsid );
+  ( dvb_network_t *ln, dvb_mux_conf_t *dmc, uint16_t onid, uint16_t tsid, int check );
 
 const idclass_t *dvb_network_mux_class(mpegts_network_t *mn);
 int dvb_network_get_orbital_pos(mpegts_network_t *mn);
index 9e98c0c579ae9484bb8c6a05a662bb7e0fb4eece..849411fffeff65f381da1664c44e540996feac79 100644 (file)
@@ -30,6 +30,9 @@
 #include <assert.h>
 
 static void mpegts_mux_scan_timeout ( void *p );
+static void mpegts_mux_do_stop ( mpegts_mux_t *mm, int delconf );
+
+
 /* ****************************************************************************
  * Mux instance (input linkage)
  * ***************************************************************************/
@@ -396,6 +399,7 @@ scan_result_tab[] = {
  { N_("OK"),           MM_SCAN_OK   },
  { N_("FAIL"),         MM_SCAN_FAIL },
  { N_("OK (partial)"), MM_SCAN_PARTIAL },
+ { N_("IGNORE"),       MM_SCAN_IGNORE },
 };
 
 int
@@ -455,9 +459,24 @@ mpegts_mux_class_enabled_notify ( void *p, const char *lang )
   if (!mm->mm_is_enabled(mm)) {
     mm->mm_stop(mm, 1, SM_CODE_MUX_NOT_ENABLED);
     mpegts_network_scan_mux_cancel(mm, 0);
+    if (mm->mm_enabled == MM_IGNORE) {
+      mpegts_mux_do_stop(mm, 1);
+      mm->mm_scan_result = MM_SCAN_IGNORE;
+    }
   }
 }
 
+static htsmsg_t *
+mpegts_mux_enable_list ( void *o, const char *lang )
+{
+  static const struct strtab tab[] = {
+    { N_("Ignore"),                   MM_IGNORE },
+    { N_("Disable"),                  MM_DISABLE },
+    { N_("Enable"),                   MM_ENABLE },
+  };
+  return strtab2htsmsg(tab, 1, lang);
+}
+
 static htsmsg_t *
 mpegts_mux_epg_list ( void *o, const char *lang )
 {
@@ -503,13 +522,17 @@ const idclass_t mpegts_mux_class =
   .ic_get_title  = mpegts_mux_class_get_title,
   .ic_properties = (const property_t[]){
     {
-      .type     = PT_BOOL,
+      .type     = PT_INT,
       .id       = "enabled",
       .name     = N_("Enabled"),
-      .desc     = N_("Enable or disable the mux."),
+      .desc     = N_("Enable, disable or ignore the mux. "
+                     "When the mux is marked as ignore, "
+                     "all discovered services are removed."),
       .off      = offsetof(mpegts_mux_t, mm_enabled),
-      .def.i    = 1,
+      .def.i    = MM_ENABLE,
+      .list     = mpegts_mux_enable_list,
       .notify   = mpegts_mux_class_enabled_notify,
+      .opts     = PO_DOC_NLIST
     },
     {
       .type     = PT_INT,
@@ -662,24 +685,12 @@ mpegts_mux_display_name ( mpegts_mux_t *mm, char *buf, size_t len )
            mm->mm_onid, mm->mm_tsid);
 }
 
-void
-mpegts_mux_delete ( mpegts_mux_t *mm, int delconf )
+static void
+mpegts_mux_do_stop ( mpegts_mux_t *mm, int delconf )
 {
   mpegts_mux_instance_t *mmi;
-  mpegts_service_t *s;
   th_subscription_t *ths;
-  char buf[256];
-
-  idnode_save_check(&mm->mm_id, delconf);
-
-  mpegts_mux_nice_name(mm, buf, sizeof(buf));
-  tvhinfo("mpegts", "%s (%p) - deleting", buf, mm);
-  
-  /* Stop */
-  mm->mm_stop(mm, 1, SM_CODE_ABORTED);
-
-  /* Remove from network */
-  LIST_REMOVE(mm, mm_network_link);
+  mpegts_service_t *s;
 
   /* Cancel scan */
   mpegts_network_scan_queue_del(mm);
@@ -701,6 +712,26 @@ mpegts_mux_delete ( mpegts_mux_t *mm, int delconf )
 
   /* Stop PID timer */
   mtimer_disarm(&mm->mm_update_pids_timer);
+}
+
+void
+mpegts_mux_delete ( mpegts_mux_t *mm, int delconf )
+{
+  char buf[256];
+
+  idnode_save_check(&mm->mm_id, delconf);
+
+  mpegts_mux_nice_name(mm, buf, sizeof(buf));
+  tvhinfo("mpegts", "%s (%p) - deleting", buf, mm);
+
+  /* Stop */
+  mm->mm_stop(mm, 1, SM_CODE_ABORTED);
+
+  /* Remove from network */
+  LIST_REMOVE(mm, mm_network_link);
+
+  /* Real stop */
+  mpegts_mux_do_stop(mm, delconf);
 
   /* Free memory */
   idnode_save_check(&mm->mm_id, 1);
@@ -720,7 +751,7 @@ mpegts_mux_config_save ( mpegts_mux_t *mm, char *filename, size_t fsize )
 static int
 mpegts_mux_is_enabled ( mpegts_mux_t *mm )
 {
-  return mm->mm_enabled;
+  return mm->mm_enabled == MM_ENABLE;
 }
 
 static int
@@ -1127,8 +1158,8 @@ mpegts_mux_create0
   }
 
   /* Enabled by default */
-  mm->mm_enabled             = 1;
-  mm->mm_epg                 = 1;
+  mm->mm_enabled             = MM_ENABLE;
+  mm->mm_epg                 = MM_EPG_ENABLE;
 
   /* Identification */
   mm->mm_onid                = onid;
@@ -1167,6 +1198,9 @@ mpegts_mux_create0
   if (conf)
     idnode_load(&mm->mm_id, conf);
 
+  if (mm->mm_enabled == MM_IGNORE)
+    mm->mm_scan_result = MM_SCAN_IGNORE;
+
   /* Initial scan */
   if (mm->mm_scan_result == MM_SCAN_NONE || !mn->mn_skipinitscan)
     mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_INIT,
index aba8accfce6d2b88a5f5c8afe4f4e63699bc8307..fc829aa0ca6c7ecfd05fe77ea74fde14ee9ec3a3 100644 (file)
@@ -633,13 +633,15 @@ mpegts_network_build
 
 mpegts_mux_t *
 mpegts_network_find_mux
-  ( mpegts_network_t *mn, uint16_t onid, uint16_t tsid )
+  ( mpegts_network_t *mn, uint16_t onid, uint16_t tsid, int check )
 {
   mpegts_mux_t *mm;
   LIST_FOREACH(mm, &mn->mn_muxes, mm_network_link) {
     if (mm->mm_onid && onid && mm->mm_onid != onid) continue;
-    if (mm->mm_tsid == tsid && mm->mm_enabled)
-      break;
+    if (mm->mm_tsid == tsid) {
+      if (!check || mm->mm_enabled == MM_ENABLE)
+        break;
+    }
   }
   return mm;
 }
index b10a33aa5666e8bfebd7114c438b02125f5e1541..67b01fa4087f65fc3d2bf69a7b35f65e64c60fdd 100644 (file)
@@ -80,7 +80,7 @@ dvb_network_scanfile_set ( dvb_network_t *ln, const char *id )
 
   /* Create */
   LIST_FOREACH(dmc, &sfn->sfn_muxes, dmc_link) {
-    if (!(mm = dvb_network_find_mux(ln, dmc, MPEGTS_ONID_NONE, MPEGTS_TSID_NONE))) {
+    if (!(mm = dvb_network_find_mux(ln, dmc, MPEGTS_ONID_NONE, MPEGTS_TSID_NONE, 0))) {
       mm = dvb_mux_create0(ln, MPEGTS_ONID_NONE, MPEGTS_TSID_NONE,
                            dmc, NULL, NULL);
       if (mm)
@@ -498,12 +498,15 @@ dvb_network_check_orbital_pos ( int satpos1, int satpos2 )
 
 dvb_mux_t *
 dvb_network_find_mux
-  ( dvb_network_t *ln, dvb_mux_conf_t *dmc, uint16_t onid, uint16_t tsid )
+  ( dvb_network_t *ln, dvb_mux_conf_t *dmc, uint16_t onid, uint16_t tsid, int check )
 {
   int deltaf, deltar;
   mpegts_mux_t *mm, *mm_alt = NULL;
 
   LIST_FOREACH(mm, &ln->mn_muxes, mm_network_link) {
+
+    if (check && mm->mm_enabled != MM_ENABLE) continue;
+
     deltaf = 2000; // 2K/MHz
     deltar = 1000;
     dvb_mux_t *lm = (dvb_mux_t*)mm;
@@ -654,7 +657,7 @@ dvb_network_create_mux
   }
 
   ln = (dvb_network_t*)mn;
-  mm = dvb_network_find_mux(ln, dmc, onid, tsid);
+  mm = dvb_network_find_mux(ln, dmc, onid, tsid, 0);
   if (!mm && (ln->mn_autodiscovery || force)) {
     cls = dvb_network_mux_class((mpegts_network_t *)ln);
     save |= cls == &dvb_mux_dvbt_class && dmc->dmc_fe_type == DVB_TYPE_T;
index 07cc2c606f9b3d62cfd1e9b719b6fd05e180dd23..602d39d376b9ce994cf6d2cef47b9996edb88c6a 100644 (file)
@@ -521,7 +521,7 @@ rtsp_start
           if (!mn2) mn2 = mn;
           mux = (mpegts_mux_t *)
                 dvb_network_find_mux((dvb_network_t *)mn, &rs->dmc,
-                                     MPEGTS_ONID_NONE, MPEGTS_TSID_NONE);
+                                     MPEGTS_ONID_NONE, MPEGTS_TSID_NONE, 1);
           if (mux) {
             dmc = ((dvb_mux_t *)mux)->lm_tuning;
             rs->perm_lock = 0;