/**
* 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);
dvb_adapter_notify_reload(tda);
}
+ dvb_transport_load(tdmi);
+
return tdmi;
}
char chname0[256], *chname;
uint8_t stype;
int l;
- int change = 0;
if(len < 8)
return;
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;
}
len -= dlen; ptr += dlen; dllen -= dlen;
}
}
- if(change) {
- dvb_mux_save(tdmi);
- // notify_tdmi_services_change(tdmi);
- }
}
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;
}
#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);
+}
+
/**
*
*/
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);
}
}
}
+ if(t->tht_pmt_seen == 0)
+ t->tht_config_change(t);
+
t->tht_pmt_seen = 1;
return 0;
}
* 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;
}
-#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;
+
+ if(!htsmsg_get_u32(m, "disabled", &u32))
+ t->tht_disabled = u32;
+
+ HTSMSG_FOREACH(f, m) {
+ if(strcmp(f->hmf_name, "stream"))
+ continue;
+
+ if((c = htsmsg_get_msg_by_field(f)) == NULL)
+ continue;
- TAILQ_FOREACH(ce, cl, ce_link) {
- if(ce->ce_type != CFG_SUB || strcasecmp("stream", ce->ce_key))
+ if((v = htsmsg_get_str(c, "type")) == NULL)
continue;
- type = str2val(config_get_str_sub(&ce->ce_sub, "type", ""), streamtypetab);
+ 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
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_ */