diff --git a/dvb/dvb.h b/dvb/dvb.h index 122ddd93..7b35c188 100644 --- a/dvb/dvb.h +++ b/dvb/dvb.h @@ -73,6 +73,9 @@ void dvb_tune_tdmi(th_dvb_mux_instance_t *tdmi, int maylog, /** * DVB Transport (aka DVB service) */ + +void dvb_transport_load(th_dvb_mux_instance_t *tdmi); + th_transport_t *dvb_transport_find(th_dvb_mux_instance_t *tdmi, uint16_t sid, int pmt_pid, int *created); diff --git a/dvb/dvb_multiplex.c b/dvb/dvb_multiplex.c index a652f84a..cb81d1f7 100644 --- a/dvb/dvb_multiplex.c +++ b/dvb/dvb_multiplex.c @@ -149,6 +149,8 @@ dvb_mux_create(th_dvb_adapter_t *tda, struct dvb_frontend_parameters *fe_param, dvb_adapter_notify_reload(tda); } + dvb_transport_load(tdmi); + return tdmi; } diff --git a/dvb/dvb_tables.c b/dvb/dvb_tables.c index 4b3e9440..8887fa54 100644 --- a/dvb/dvb_tables.c +++ b/dvb/dvb_tables.c @@ -343,7 +343,6 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, char chname0[256], *chname; uint8_t stype; int l; - int change = 0; if(len < 8) return; @@ -412,23 +411,26 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, if(t == NULL) break; - change |= - t->tht_servicetype != stype || - t->tht_scrambled != free_ca_mode || - strcmp(t->tht_provider ?: "", provider) || - strcmp(t->tht_svcname ?: "", chname ); - - t->tht_servicetype = stype; - t->tht_scrambled = free_ca_mode; - - free((void *)t->tht_provider); - t->tht_provider = strdup(provider); - - free((void *)t->tht_svcname); - t->tht_svcname = strdup(chname); - + if(t->tht_servicetype != stype || + t->tht_scrambled != free_ca_mode || + strcmp(t->tht_provider ?: "", provider) || + strcmp(t->tht_svcname ?: "", chname )) { + + t->tht_servicetype = stype; + t->tht_scrambled = free_ca_mode; + + free((void *)t->tht_provider); + t->tht_provider = strdup(provider); + + free((void *)t->tht_svcname); + t->tht_svcname = strdup(chname); + + t->tht_config_change(t); + } + if(t->tht_chname == NULL) t->tht_chname = strdup(chname); + } break; } @@ -436,10 +438,6 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, len -= dlen; ptr += dlen; dllen -= dlen; } } - if(change) { - dvb_mux_save(tdmi); - // notify_tdmi_services_change(tdmi); - } } @@ -707,15 +705,7 @@ dvb_pmt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, uint8_t tableid, void *opaque) { th_transport_t *t = opaque; - int v = t->tht_pmt_seen; - psi_parse_pmt(t, ptr, len, 1); - v ^= t->tht_pmt_seen; - if(v) { - dvb_mux_save(tdmi); - //notify_tdmi_services_change(tdmi); - } - return; } diff --git a/dvb/dvb_transport.c b/dvb/dvb_transport.c index 0b8da781..d9da18a0 100644 --- a/dvb/dvb_transport.c +++ b/dvb/dvb_transport.c @@ -48,6 +48,61 @@ #include "notify.h" + +/** + * Load config for the given mux + */ +void +dvb_transport_load(th_dvb_mux_instance_t *tdmi) +{ + htsmsg_t *l, *c; + htsmsg_field_t *f; + uint32_t sid, pmt; + const char *s; + unsigned int u32; + th_transport_t *t; + + if((l = hts_settings_load("dvbtransports/%s", tdmi->tdmi_identifier)) == NULL) + return; + + HTSMSG_FOREACH(f, l) { + if((c = htsmsg_get_msg_by_field(f)) == NULL) + continue; + + if(htsmsg_get_u32(c, "service_id", &sid)) + continue; + + if(htsmsg_get_u32(c, "pmt", &pmt)) + continue; + + t = dvb_transport_find(tdmi, sid, pmt, NULL); + + htsmsg_get_u32(c, "stype", &t->tht_servicetype); + if(htsmsg_get_u32(c, "scrambled", &u32)) + u32 = 0; + t->tht_scrambled = u32; + + s = htsmsg_get_str(c, "provider") ?: "unknown"; + t->tht_provider = strdup(s); + + s = htsmsg_get_str(c, "servicename") ?: "unknown"; + t->tht_svcname = strdup(s); + + s = htsmsg_get_str(c, "channelname"); + if(s != NULL) { + t->tht_chname = strdup(s); + } else { + t->tht_chname = strdup(t->tht_svcname); + } + + psi_load_transport_settings(c, t); + + if(!htsmsg_get_u32(c, "mapped", &u32) && u32) + transport_map_channel(t, NULL); + } + htsmsg_destroy(l); +} + /** * */ @@ -73,9 +128,12 @@ dvb_transport_save(th_transport_t *t) htsmsg_add_u32(m, "mapped", !!t->tht_ch); - psi_get_transport_settings(m, t); + psi_save_transport_settings(m, t); - hts_settings_save(m, "dvbtransports/%s", t->tht_identifier); + hts_settings_save(m, "dvbtransports/%s/%s", + t->tht_dvb_mux_instance->tdmi_identifier, + t->tht_identifier); + htsmsg_destroy(m); } diff --git a/psi.c b/psi.c index ebd49e68..790ae90c 100644 --- a/psi.c +++ b/psi.c @@ -288,6 +288,9 @@ psi_parse_pmt(th_transport_t *t, uint8_t *ptr, int len, int chksvcid) } } + if(t->tht_pmt_seen == 0) + t->tht_config_change(t); + t->tht_pmt_seen = 1; return 0; } @@ -546,7 +549,7 @@ htstvstreamtype2txt(tv_streamtype_t s) * Store transport settings into message */ void -psi_get_transport_settings(htsmsg_t *m, th_transport_t *t) +psi_save_transport_settings(htsmsg_t *m, th_transport_t *t) { th_stream_t *st; htsmsg_t *sub; @@ -575,51 +578,55 @@ psi_get_transport_settings(htsmsg_t *m, th_transport_t *t) } -#if 0 /** - * Load transport info + * Load transport info from htsmsg */ void -psi_load_transport(struct config_head *cl, th_transport_t *t) +psi_load_transport_settings(htsmsg_t *m, th_transport_t *t) { + htsmsg_t *c; + htsmsg_field_t *f; + uint32_t u32; th_stream_t *st; - config_entry_t *ce; tv_streamtype_t type; const char *v; - int pid, i; + uint32_t pid, i; - t->tht_pcr_pid = atoi(config_get_str_sub(cl, "pcr", "0")); - - t->tht_disabled = atoi(config_get_str_sub(cl, "disabled", "0")); + if(!htsmsg_get_u32(m, "pcr", &u32)) + t->tht_pcr_pid = u32; - TAILQ_FOREACH(ce, cl, ce_link) { - if(ce->ce_type != CFG_SUB || strcasecmp("stream", ce->ce_key)) + if(!htsmsg_get_u32(m, "disabled", &u32)) + t->tht_disabled = u32; + + HTSMSG_FOREACH(f, m) { + if(strcmp(f->hmf_name, "stream")) continue; - type = str2val(config_get_str_sub(&ce->ce_sub, "type", ""), streamtypetab); + if((c = htsmsg_get_msg_by_field(f)) == NULL) + continue; + + if((v = htsmsg_get_str(c, "type")) == NULL) + continue; + + type = str2val(v, streamtypetab); if(type == -1) continue; - pid = atoi(config_get_str_sub(&ce->ce_sub, "pid", "0")); - if(pid < 1) + if(htsmsg_get_u32(c, "pid", &pid)) continue; st = transport_add_stream(t, pid, type); st->st_tb = (AVRational){1, 90000}; - v = config_get_str_sub(&ce->ce_sub, "lang", NULL); - if(v != NULL) + if((v = htsmsg_get_str(c, "lang")) != NULL) av_strlcpy(st->st_lang, v, 4); - st->st_frame_duration = - atoi(config_get_str_sub(&ce->ce_sub, "frameduration", "0")); + if(!htsmsg_get_u32(c, "frameduration", &u32)) + st->st_frame_duration = u32; - v = config_get_str_sub(&ce->ce_sub, "caid", NULL); - if(v != NULL) { + if((v = htsmsg_get_str(c, "caid")) != NULL) { i = str2val(v, caidnametab); st->st_caid = i < 0 ? strtol(v, NULL, 0) : i; } } } - -#endif diff --git a/psi.h b/psi.h index 95051fcd..519a4c8e 100644 --- a/psi.h +++ b/psi.h @@ -45,6 +45,7 @@ int psi_build_pmt(th_muxer_t *tm, uint8_t *buf0, int maxlen, int pcrpid); const char *psi_caid2name(uint16_t caid); -void psi_get_transport_settings(htsmsg_t *m, th_transport_t *t); +void psi_load_transport_settings(htsmsg_t *m, th_transport_t *t); +void psi_save_transport_settings(htsmsg_t *m, th_transport_t *t); #endif /* PSI_H_ */