Store DVB trasports in settings.
This commit is contained in:
parent
32e194948e
commit
36ea9ecd4b
6 changed files with 114 additions and 53 deletions
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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
51
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
|
||||
|
|
3
psi.h
3
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_ */
|
||||
|
|
Loading…
Add table
Reference in a new issue