]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
dvb: attempt to stop bad updates to network info.
authorAdam Sutton <dev@adamsutton.me.uk>
Sat, 30 Mar 2013 13:01:43 +0000 (13:01 +0000)
committerAdam Sutton <dev@adamsutton.me.uk>
Thu, 18 Apr 2013 10:54:39 +0000 (11:54 +0100)
src/dvb/dvb.h
src/dvb/dvb_multiplex.c
src/dvb/dvb_preconf.c
src/dvb/dvb_tables.c

index 3b3e8f1fc8caba7471689edfa3278226eda9934d..127d676ff887e26db2e672346f067b9eb8f001c9 100644 (file)
@@ -435,7 +435,7 @@ th_dvb_mux_instance_t *dvb_mux_create(th_dvb_adapter_t *tda,
                                      uint16_t onid, uint16_t tsid, const char *network,
                                      const char *logprefix, int enabled,
                                      int initialscan, const char *identifier,
-                                     dvb_satconf_t *satconf, int create);
+                                     dvb_satconf_t *satconf, int create, th_dvb_mux_instance_t *src);
 
 void dvb_mux_set_networkname(th_dvb_mux_instance_t *tdmi, const char *name);
 
index f9985fd0efc68d8e6d89042ab35ae8ccf383adc6..ce0f19093823357587f2edb4d7150fc13667896c 100644 (file)
@@ -155,7 +155,7 @@ th_dvb_mux_instance_t *
 dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc,
               uint16_t onid, uint16_t tsid, const char *network, const char *source,
               int enabled, int initialscan, const char *identifier,
-              dvb_satconf_t *satconf, int create)
+              dvb_satconf_t *satconf, int create, th_dvb_mux_instance_t *src)
 {
   th_dvb_mux_instance_t *tdmi, *c;
   char buf[200];
@@ -177,7 +177,35 @@ dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc,
     int save = 0;
     char buf2[1024];
     buf2[0] = 0;
+    int master = 0;
+    if (!src) 
+      master = 1;
+    else if (src->tdmi_network_id == tdmi->tdmi_network_id)
+      master = 1;
 
+    /* Network ID */
+    if(tsid != 0xFFFF && tdmi->tdmi_transport_stream_id != tsid) {
+      if (tdmi->tdmi_transport_stream_id == 0xFFFF || master) {
+        tdmi->tdmi_transport_stream_id = tsid;
+        save = 1;
+      }
+    }
+    if(onid && tdmi->tdmi_network_id != onid) {
+      if (!tdmi->tdmi_network_id || master) {
+        tdmi->tdmi_network_id = onid;
+        save = 1;
+      }
+    }
+    if(network && *network && strcmp(tdmi->tdmi_network ?: "", network)) {
+      if (!tdmi->tdmi_network || master) {
+        free(tdmi->tdmi_network);
+        tdmi->tdmi_network = strdup(network);
+        save = 1;
+      }
+    }
+
+    /* Tuning Info */
+    // TODO: same protection here?
     if(tdmi->tdmi_adapter->tda_autodiscovery &&
        tdmi_compare_conf(tda->tda_type, &tdmi->tdmi_conf, dmc)) {
 #if DVB_API_VERSION >= 5
@@ -201,20 +229,6 @@ dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc,
       save = 1;
     }
 
-    if(tsid != 0xFFFF && tdmi->tdmi_transport_stream_id != tsid) {
-      tdmi->tdmi_transport_stream_id = tsid;
-      save = 1;
-    }
-    if(onid && tdmi->tdmi_network_id != onid) {
-      tdmi->tdmi_network_id = onid;
-      save = 1;
-    }
-    if(network && *network && strcmp(tdmi->tdmi_network ?: "", network)) {
-      free(tdmi->tdmi_network);
-      tdmi->tdmi_network = strdup(network);
-      save = 1;
-    }
-
     /* HACK - load old transports and remove old mux config */
     if(identifier) {
       save = 1;
@@ -803,7 +817,7 @@ tdmi_create_by_msg(th_dvb_adapter_t *tda, htsmsg_t *m, const char *identifier)
   tdmi = dvb_mux_create(tda, &dmc,
                        onid, tsid, htsmsg_get_str(m, "network"), NULL, enabled,
       initscan,
-                       identifier, NULL, 1);
+                       identifier, NULL, 1, NULL);
   if(tdmi != NULL) {
 
     if((s = htsmsg_get_str(m, "status")) != NULL)
@@ -1203,7 +1217,7 @@ dvb_mux_add_by_params(th_dvb_adapter_t *tda,
   }
   dmc.dmc_polarisation = polarisation;
 
-  tdmi = dvb_mux_create(tda, &dmc, 0, 0xffff, NULL, NULL, 1, 1, NULL, NULL, 1);
+  tdmi = dvb_mux_create(tda, &dmc, 0, 0xffff, NULL, NULL, 1, 1, NULL, NULL, 1, NULL);
 
   if(tdmi == NULL)
     return "Mux already exist";
@@ -1230,7 +1244,7 @@ dvb_mux_copy(th_dvb_adapter_t *dst, th_dvb_mux_instance_t *tdmi_src,
                            tdmi_src->tdmi_transport_stream_id,
                            tdmi_src->tdmi_network,
                            "copy operation", tdmi_src->tdmi_enabled,
-                           1, NULL, satconf, 1);
+                           1, NULL, satconf, 1, tdmi_src);
 
   if(tdmi_dst == NULL)
     return -1; // Already exist
index d1805242fe8afed6332b504d241b09453cefa3df..bf9e8e345da11670adebe76d587e539521f00eec 100644 (file)
@@ -98,7 +98,7 @@ dvb_mux_preconf_add(th_dvb_adapter_t *tda, const network_t *net,
 
     dmc.dmc_satconf = dvb_satconf_entry_find(tda, satconf, 0);
       
-    dvb_mux_create(tda, &dmc, 0, 0xffff, NULL, source, 1, 1, NULL, NULL, 1);
+    dvb_mux_create(tda, &dmc, 0, 0xffff, NULL, source, 1, 1, NULL, NULL, 1, NULL);
   }
 }
 
index 7397561eff057642608671e68abd712db2b9abf1..07671dd29378117d9d7a0caa0ec766de5b320540 100644 (file)
@@ -448,17 +448,30 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
 
     if (chname && (strcmp(t->s_provider ?: "", provider) ||
                    strcmp(t->s_svcname  ?: "", chname))) {
-      free(t->s_provider);
-      t->s_provider = strdup(provider);
+      int save2 = 0;
+      int master = 0;
+      if (t->s_dvb_mux_instance && t->s_dvb_mux_instance->tdmi_network_id &&
+          t->s_dvb_mux_instance->tdmi_network_id == tdmi->tdmi_network_id)
+        master = 1;
+
+      if (!t->s_provider || master) {
+        free(t->s_provider);
+        t->s_provider = strdup(provider);
+        save2 = 1;
+      }
       
-      free(t->s_svcname);
-      t->s_svcname = strdup(chname);
-
-      pthread_mutex_lock(&t->s_stream_mutex); 
-      service_make_nicename(t);
-      pthread_mutex_unlock(&t->s_stream_mutex); 
+      if (!t->s_svcname || master) {
+        free(t->s_svcname);
+        t->s_svcname = strdup(chname);
+        save2 = 1;
+      }
 
-      save = 1;
+      if (save2) {
+        pthread_mutex_lock(&t->s_stream_mutex); 
+        service_make_nicename(t);
+        pthread_mutex_unlock(&t->s_stream_mutex); 
+        save = 1;
+      }
     }
 
     if (*crid && strcmp(t->s_default_authority ?: "", crid)) {
@@ -692,7 +705,7 @@ dvb_table_cable_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
 
   dvb_mux_create(tdmi->tdmi_adapter, &dmc, onid, tsid, netname,
                 "automatic mux discovery", 1, 1, NULL, NULL,
-     tdmi->tdmi_adapter->tda_autodiscovery);
+     tdmi->tdmi_adapter->tda_autodiscovery, tdmi);
 
   return 0;
 }
@@ -778,7 +791,7 @@ dvb_table_sat_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
 
   dvb_mux_create(tdmi->tdmi_adapter, &dmc, onid, tsid, netname,
                 "automatic mux discovery", 1, 1, NULL, tdmi->tdmi_conf.dmc_satconf,
-     tdmi->tdmi_adapter->tda_autodiscovery);
+     tdmi->tdmi_adapter->tda_autodiscovery, tdmi);
   
   return 0;
 }
@@ -817,7 +830,7 @@ dvb_table_terr_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
 
   dvb_mux_create(tdmi->tdmi_adapter, &dmc, onid, tsid, netname,
                  "automatic mux discovery", 1, 1, NULL, NULL,
-                 tdmi->tdmi_adapter->tda_autodiscovery);
+                 tdmi->tdmi_adapter->tda_autodiscovery, tdmi);
   
   return 0;
 }