Store DVB trasports in settings.

This commit is contained in:
Andreas Öman 2008-08-25 17:46:44 +00:00
parent 32e194948e
commit 36ea9ecd4b
6 changed files with 114 additions and 53 deletions

View file

@ -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);

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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);
}

51
psi.c
View file

@ -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

3
psi.h
View file

@ -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_ */