]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
IPTV: fix network builder (to add the new network to all IPTV input threads), fixes...
authorJaroslav Kysela <perex@perex.cz>
Fri, 23 Mar 2018 18:40:38 +0000 (19:40 +0100)
committerJaroslav Kysela <perex@perex.cz>
Fri, 23 Mar 2018 18:40:38 +0000 (19:40 +0100)
- also add mpegts_mux_post_create() helper to set the mux nicename correctly

src/input/mpegts.h
src/input/mpegts/iptv/iptv.c
src/input/mpegts/iptv/iptv_auto.c
src/input/mpegts/mpegts_mux.c
src/input/mpegts/mpegts_mux_dvb.c
src/input/mpegts/mpegts_network_dvb.c
src/input/mpegts/mpegts_network_scan.c
src/input/mpegts/tsfile/tsfile.c

index 10c3913041847ed70f0127bcd8e6993736e3e108..518d1258d01702c9f1aa28c274090a77717bc3e0 100644 (file)
@@ -357,7 +357,7 @@ struct mpegts_network
     (mpegts_mux_t*, uint16_t sid, uint16_t pmt_pid);
   const idclass_t*  (*mn_mux_class)   (mpegts_network_t*);
   mpegts_mux_t *    (*mn_mux_create2) (mpegts_network_t *mn, htsmsg_t *conf);
- void              (*mn_scan)        (mpegts_network_t*);
 void              (*mn_scan)        (mpegts_network_t*);
 
   /*
    * Configuration
@@ -885,6 +885,8 @@ mpegts_mux_t *mpegts_mux_create0
   mpegts_mux_create0(calloc(1, sizeof(mpegts_mux_t)), &mpegts_mux_class, uuid,\
                      mn, onid, tsid, conf)
 
+mpegts_mux_t *mpegts_mux_post_create(mpegts_mux_t *mm);
+
 static inline mpegts_mux_t *mpegts_mux_find0(tvh_uuid_t *uuid)
   { return idnode_find0(uuid, &mpegts_mux_class, NULL); }
 
index 739fb422e7bff018b67e054fb1989e8f65b8ff64..0897f3c2445eafb5e84306514ea46a4df7c33ad3 100644 (file)
@@ -150,7 +150,7 @@ iptv_input_is_free ( mpegts_input_t *mi, mpegts_mux_t *mm,
   iptv_input_t *mi2;
   iptv_network_t *in = (iptv_network_t *)mm->mm_network;
   iptv_thread_pool_t *pool;
-  
+
   TAILQ_FOREACH(pool, &iptv_tpool, link) {
     mi2 = pool->input;
     pthread_mutex_lock(&mi2->mi_output_lock);
@@ -1017,7 +1017,8 @@ static mpegts_mux_t *
 iptv_network_create_mux2
   ( mpegts_network_t *mn, htsmsg_t *conf )
 {
-  return (mpegts_mux_t*)iptv_mux_create0((iptv_network_t*)mn, NULL, conf);
+  iptv_mux_t *im = iptv_mux_create0((iptv_network_t*)mn, NULL, conf);
+  return mpegts_mux_post_create((mpegts_mux_t *)im);
 }
 
 static void
@@ -1059,6 +1060,7 @@ iptv_network_create0
   ( const char *uuid, htsmsg_t *conf, const idclass_t *idc )
 {
   iptv_network_t *in = calloc(1, sizeof(*in));
+  iptv_mux_t *im;
   htsmsg_t *c;
   char ubuf[UUID_HEX_SIZE];
 
@@ -1098,7 +1100,8 @@ iptv_network_create0
     HTSMSG_FOREACH(f, c) {
       if (!(e = htsmsg_get_map_by_field(f)))  continue;
       if (!(e = htsmsg_get_map(e, "config"))) continue;
-      iptv_mux_create0(in, f->hmf_name, e);
+      im = iptv_mux_create0(in, f->hmf_name, e);
+      mpegts_mux_post_create((mpegts_mux_t *)im);
     }
     htsmsg_destroy(c);
   }
@@ -1113,7 +1116,13 @@ static mpegts_network_t *
 iptv_network_builder
   ( const idclass_t *idc, htsmsg_t *conf )
 {
-  return (mpegts_network_t*)iptv_network_create0(NULL, conf, idc);
+  mpegts_network_t *mn;
+  iptv_thread_pool_t *pool;
+
+  mn = (mpegts_network_t *)iptv_network_create0(NULL, conf, idc);
+  TAILQ_FOREACH(pool, &iptv_tpool, link)
+    mpegts_input_add_network((mpegts_input_t *)pool->input, mn);
+  return mn;
 }
 
 /* **************************************************************************
index 509819a06e027187a468bbcb9bdd0526ad4fd1e9..0ee497df88b5318810afd3b24b18f3421b4a19d5 100644 (file)
@@ -311,6 +311,7 @@ skip_url:
     htsmsg_add_s32(conf, "spriority", smuxprio);
 
   im = iptv_mux_create0(in, NULL, conf);
+  mpegts_mux_post_create((mpegts_mux_t *)im);
   htsmsg_destroy(conf);
 
   if (im) {
index 51cfcf0414abefa8c58b4d4874dfea0288959980..6acfb348f033d3824ac45ca723ea2fe680e24f78 100644 (file)
@@ -1197,8 +1197,6 @@ mpegts_mux_create0
   ( mpegts_mux_t *mm, const idclass_t *class, const char *uuid,
     mpegts_network_t *mn, uint16_t onid, uint16_t tsid, htsmsg_t *conf )
 {
-  char buf[256];
-
   if (idnode_insert(&mm->mm_id, uuid, class, 0)) {
     if (uuid)
       tvherror(LS_MPEGTS, "invalid mux uuid '%s'", uuid);
@@ -1251,9 +1249,26 @@ mpegts_mux_create0
   if (conf)
     idnode_load(&mm->mm_id, conf);
 
+  return mm;
+}
+
+mpegts_mux_t *
+mpegts_mux_post_create ( mpegts_mux_t *mm )
+{
+  mpegts_network_t *mn;
+  char buf[256];
+
+  if (mm == NULL)
+    return NULL;
+
+  mn = mm->mm_network;
   if (mm->mm_enabled == MM_IGNORE)
     mm->mm_scan_result = MM_SCAN_IGNORE;
 
+  mpegts_mux_nice_name(mm, buf, sizeof(buf));
+  tvhtrace(LS_MPEGTS, "%s - created", buf);
+  mm->mm_nicename = strdup(buf);
+
   /* Initial scan */
   if (mm->mm_scan_result == MM_SCAN_NONE || !mn->mn_skipinitscan)
     mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_INIT,
@@ -1262,10 +1277,6 @@ mpegts_mux_create0
     mpegts_network_scan_queue_add(mm, SUBSCRIPTION_PRIO_SCAN_IDLE,
                                   SUBSCRIPTION_IDLESCAN, 10);
 
-  mpegts_mux_nice_name(mm, buf, sizeof(buf));
-  tvhtrace(LS_MPEGTS, "%s - created", buf);
-  mm->mm_nicename = strdup(buf);
-
   return mm;
 }
 
index 7f8260658e05d48e71207c1fe1cae3e3a0f17570..7228dcd1eb9a955b04f8aec3adb8806db6046233 100644 (file)
@@ -1103,7 +1103,6 @@ dvb_mux_create0
   htsmsg_t *c, *c2, *e;
   htsmsg_field_t *f;
   dvb_fe_delivery_system_t delsys;
-  char buf[512];
   char ubuf1[UUID_HEX_SIZE];
   char ubuf2[UUID_HEX_SIZE];
 
@@ -1167,10 +1166,6 @@ dvb_mux_create0
   lm->mm_display_name     = dvb_mux_display_name;
   lm->mm_config_save      = dvb_mux_config_save;
 
-  mpegts_mux_nice_name(mm, buf, sizeof(buf));
-  free(mm->mm_nicename);
-  mm->mm_nicename = strdup(buf);
-
   /* No config */
   if (!conf) return lm;
 
index 88d5d6ad8615372e0d996573300e9231715dad32..a4904f20947fd171a17bbbf11f805d857f77b92e 100644 (file)
@@ -83,8 +83,10 @@ dvb_network_scanfile_set ( dvb_network_t *ln, const char *id )
     if (!(mm = dvb_network_find_mux(ln, dmc, MPEGTS_ONID_NONE, MPEGTS_TSID_NONE, 0, 0))) {
       mm = dvb_mux_create0(ln, MPEGTS_ONID_NONE, MPEGTS_TSID_NONE,
                            dmc, NULL, NULL);
-      if (mm)
+      if (mm) {
+        mpegts_mux_post_create((mpegts_mux_t *)mm);
         idnode_changed(&mm->mm_id);
+      }
       if (tvhtrace_enabled()) {
         char buf[128];
         dvb_mux_conf_str(dmc, buf, sizeof(buf));
@@ -706,6 +708,7 @@ dvb_network_create_mux
     }
     if (save) {
       mm = dvb_mux_create0(ln, onid, tsid, dmc, NULL, NULL);
+      mpegts_mux_post_create((mpegts_mux_t *)mm);
       if (tvhtrace_enabled()) {
         char buf[128];
         dvb_mux_conf_str(&((dvb_mux_t *)mm)->lm_tuning, buf, sizeof(buf));
@@ -835,9 +838,10 @@ dvb_network_mux_create2
   ( mpegts_network_t *mn, htsmsg_t *conf )
 {
   dvb_network_t *ln = (dvb_network_t*)mn;
-  return (mpegts_mux_t*)
-    dvb_mux_create0(ln, MPEGTS_ONID_NONE, MPEGTS_TSID_NONE,
-                    NULL, NULL, conf);
+  dvb_mux_t *mm;
+  mm = dvb_mux_create0(ln, MPEGTS_ONID_NONE, MPEGTS_TSID_NONE,
+                       NULL, NULL, conf);
+  return mpegts_mux_post_create((mpegts_mux_t *)mm);
 }
 
 /* ****************************************************************************
@@ -849,6 +853,7 @@ dvb_network_create0
   ( const char *uuid, const idclass_t *idc, htsmsg_t *conf )
 {
   dvb_network_t *ln;
+  dvb_mux_t *lm;
   htsmsg_t *c, *e;
   htsmsg_field_t *f;
   const char *s;
@@ -883,7 +888,8 @@ dvb_network_create0
     HTSMSG_FOREACH(f, c) {
       if (!(e = htsmsg_get_map_by_field(f)))  continue;
       if (!(e = htsmsg_get_map(e, "config"))) continue;
-      (void)dvb_mux_create1(ln, f->hmf_name, e);
+      lm = dvb_mux_create1(ln, f->hmf_name, e);
+      mpegts_mux_post_create((mpegts_mux_t *)lm);
     }
     htsmsg_destroy(c);
   }
index 3bf2c82495a42b494ef63b4f3589a916566a62a4..72a000efe551d952ebd504761dee118f46cc80c0 100644 (file)
@@ -423,6 +423,7 @@ tsid_lookup:
                                             mux, NULL, NULL);
         if (mm) {
           char buf[256];
+          mpegts_mux_post_create(mm);
           idnode_changed(&mm->mm_id);
           mn->mn_display_name(mn, buf, sizeof(buf));
           tvhinfo(LS_MPEGTS, "fastscan mux add to network '%s'", buf);
index 4262a03db6f944daf63a12d2e6253b3a2f46aafd..c7540ef3a49e47aa5a075e1278ddc251e0db2bfc 100644 (file)
@@ -143,6 +143,7 @@ void tsfile_add_file ( const char *path )
   /* Create logical instance */
   mm = tsfile_mux_create(uuid, tsfile_network);
   mm->mm_tsid_accept_zero_value = 1;
+  mpegts_mux_post_create(mm);
   
   /* Create physical instance (for each tuner) */
   LIST_FOREACH(mi, &tsfile_inputs, tsi_link)