From: Adam Sutton Date: Fri, 1 Feb 2013 20:53:36 +0000 (+0000) Subject: dvb: re-instate some of the form scanning code. X-Git-Tag: v3.5~40 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dc160b9e48ab09bb6cb8a719be6d9a495760a61e;p=thirdparty%2Ftvheadend.git dvb: re-instate some of the form scanning code. Mux TSID and ONID can now be updated from other tables if, and only if, they values are not yet set. Values from the NIT will ALWAYS override existing values, as they're hopefully more reliable. --- diff --git a/src/dvb/dvb.h b/src/dvb/dvb.h index 28a9587d7..50ce547a7 100644 --- a/src/dvb/dvb.h +++ b/src/dvb/dvb.h @@ -429,9 +429,9 @@ th_dvb_mux_instance_t *dvb_mux_create(th_dvb_adapter_t *tda, void dvb_mux_set_networkname(th_dvb_mux_instance_t *tdmi, const char *name); -void dvb_mux_set_tsid(th_dvb_mux_instance_t *tdmi, uint16_t tsid); +void dvb_mux_set_tsid(th_dvb_mux_instance_t *tdmi, uint16_t tsid, int force); -void dvb_mux_set_onid(th_dvb_mux_instance_t *tdmi, uint16_t onid); +void dvb_mux_set_onid(th_dvb_mux_instance_t *tdmi, uint16_t onid, int force); void dvb_mux_set_enable(th_dvb_mux_instance_t *tdmi, int enabled); diff --git a/src/dvb/dvb_multiplex.c b/src/dvb/dvb_multiplex.c index 7f0eb0c36..7fd5e2c25 100644 --- a/src/dvb/dvb_multiplex.c +++ b/src/dvb/dvb_multiplex.c @@ -169,12 +169,14 @@ dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc, } if(tdmi != NULL) { + /* Update stuff ... */ int save = 0; char buf2[1024]; buf2[0] = 0; - if(tdmi_compare_conf(tda->tda_type, &tdmi->tdmi_conf, dmc)) { + if(tdmi->tdmi_adapter->tda_autodiscovery && + tdmi_compare_conf(tda->tda_type, &tdmi->tdmi_conf, dmc)) { #if DVB_API_VERSION >= 5 snprintf(buf2, sizeof(buf2), " ("); if (tdmi->tdmi_conf.dmc_fe_modulation != dmc->dmc_fe_modulation) @@ -861,10 +863,14 @@ dvb_mux_set_networkname(th_dvb_mux_instance_t *tdmi, const char *networkname) * */ void -dvb_mux_set_tsid(th_dvb_mux_instance_t *tdmi, uint16_t tsid) +dvb_mux_set_tsid(th_dvb_mux_instance_t *tdmi, uint16_t tsid, int force) { htsmsg_t *m; + if (!force) + if (tdmi->tdmi_transport_stream_id != 0xFFFF || tsid == 0xFFFF) + return; + tdmi->tdmi_transport_stream_id = tsid; dvb_mux_save(tdmi); @@ -879,10 +885,14 @@ dvb_mux_set_tsid(th_dvb_mux_instance_t *tdmi, uint16_t tsid) * */ void -dvb_mux_set_onid(th_dvb_mux_instance_t *tdmi, uint16_t onid) +dvb_mux_set_onid(th_dvb_mux_instance_t *tdmi, uint16_t onid, int force) { htsmsg_t *m; + if (force) + if (tdmi->tdmi_network_id != 0 || onid == 0) + return; + tdmi->tdmi_network_id = onid; dvb_mux_save(tdmi); diff --git a/src/dvb/dvb_tables.c b/src/dvb/dvb_tables.c index 302c7b53b..f3ddb560f 100644 --- a/src/dvb/dvb_tables.c +++ b/src/dvb/dvb_tables.c @@ -342,6 +342,8 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, tsid = ptr[0] << 8 | ptr[1]; onid = ptr[5] << 8 | ptr[6]; if (tableid == 0x42) { + dvb_mux_set_tsid(tdmi, tsid, 0); + dvb_mux_set_onid(tdmi, onid, 0); if(tdmi->tdmi_transport_stream_id != tsid || tdmi->tdmi_network_id != onid) return -1; } else { @@ -504,6 +506,7 @@ dvb_pat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, } tsid = (ptr[0] << 8) | ptr[1]; + dvb_mux_set_tsid(tdmi, tsid, 0); if (tdmi->tdmi_transport_stream_id != tsid) return -1; @@ -844,11 +847,11 @@ dvb_table_local_channel(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, t = dvb_service_find(tdmi, sid, 0, NULL); if(t != NULL) { - if(t->s_channel_number != chan) { - t->s_channel_number = chan; - t->s_config_save(t); - service_refresh_channel(t); - } + if(t->s_channel_number != chan) { + t->s_channel_number = chan; + t->s_config_save(t); + service_refresh_channel(t); + } } } ptr += 4; @@ -999,8 +1002,9 @@ atsc_vct_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, /* Search all muxes on adapter */ LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) - if(tdmi->tdmi_transport_stream_id == tsid && tdmi->tdmi_network_id == onid); - break; + if(tdmi->tdmi_transport_stream_id == tsid && + tdmi->tdmi_network_id == onid); + break; if(tdmi == NULL) continue;