From ed27c4b3dd94971289bda05695e81d1d85e13eb9 Mon Sep 17 00:00:00 2001 From: Adam Sutton Date: Sat, 30 Mar 2013 13:01:43 +0000 Subject: [PATCH] dvb: attempt to stop bad updates to network info. --- src/dvb/dvb.h | 2 +- src/dvb/dvb_multiplex.c | 50 ++++++++++++++++++++++++++--------------- src/dvb/dvb_preconf.c | 2 +- src/dvb/dvb_tables.c | 37 ++++++++++++++++++++---------- 4 files changed, 59 insertions(+), 32 deletions(-) diff --git a/src/dvb/dvb.h b/src/dvb/dvb.h index 3b3e8f1f..127d676f 100644 --- a/src/dvb/dvb.h +++ b/src/dvb/dvb.h @@ -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); diff --git a/src/dvb/dvb_multiplex.c b/src/dvb/dvb_multiplex.c index f9985fd0..ce0f1909 100644 --- a/src/dvb/dvb_multiplex.c +++ b/src/dvb/dvb_multiplex.c @@ -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 diff --git a/src/dvb/dvb_preconf.c b/src/dvb/dvb_preconf.c index d1805242..bf9e8e34 100644 --- a/src/dvb/dvb_preconf.c +++ b/src/dvb/dvb_preconf.c @@ -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); } } diff --git a/src/dvb/dvb_tables.c b/src/dvb/dvb_tables.c index 7397561e..07671dd2 100644 --- a/src/dvb/dvb_tables.c +++ b/src/dvb/dvb_tables.c @@ -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); + if (!t->s_svcname || master) { + free(t->s_svcname); + t->s_svcname = strdup(chname); + save2 = 1; + } - pthread_mutex_lock(&t->s_stream_mutex); - service_make_nicename(t); - pthread_mutex_unlock(&t->s_stream_mutex); - - 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; }