Add the concept of onid into the DVB structures, this will help overcome a few minor issues.

This commit is contained in:
Adam Sutton 2012-10-10 12:52:07 +01:00
parent 16fdfd2547
commit 1cc67b75e8
8 changed files with 94 additions and 60 deletions

View file

@ -128,6 +128,7 @@ typedef struct th_dvb_mux_instance {
/* Linked if tdmi_conf.dmc_satconf != NULL */
LIST_ENTRY(th_dvb_mux_instance) tdmi_satconf_link;
uint32_t tdmi_network_id;
uint16_t tdmi_transport_stream_id;
char *tdmi_identifier;
@ -354,7 +355,7 @@ void dvb_mux_destroy(th_dvb_mux_instance_t *tdmi);
th_dvb_mux_instance_t *dvb_mux_create(th_dvb_adapter_t *tda,
const struct dvb_mux_conf *dmc,
uint16_t tsid, const char *network,
uint16_t onid, uint16_t tsid, const char *network,
const char *logprefix, int enabled,
int initialscan, const char *identifier,
dvb_satconf_t *satconf);

View file

@ -153,7 +153,7 @@ tdmi_compare_conf(int adapter_type,
*/
th_dvb_mux_instance_t *
dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc,
uint16_t tsid, const char *network, const char *source,
uint16_t onid, uint16_t tsid, const char *network, const char *source,
int enabled, int initialscan, const char *identifier,
dvb_satconf_t *satconf)
{
@ -200,6 +200,10 @@ dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc,
tdmi->tdmi_transport_stream_id = tsid;
save = 1;
}
if(onid && tdmi->tdmi_network_id != onid) {
tdmi->tdmi_network_id = onid;
save = 1;
}
/* HACK - load old transports and remove old mux config */
if(identifier) {
@ -262,6 +266,7 @@ dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc,
TAILQ_INIT(&tdmi->tdmi_table_queue);
tdmi->tdmi_network_id = onid;
tdmi->tdmi_transport_stream_id = tsid;
tdmi->tdmi_adapter = tda;
tdmi->tdmi_network = network ? strdup(network) : NULL;
@ -560,6 +565,7 @@ dvb_mux_save(th_dvb_mux_instance_t *tdmi)
htsmsg_add_str(m, "status", dvb_mux_status(tdmi));
htsmsg_add_u32(m, "transportstreamid", tdmi->tdmi_transport_stream_id);
htsmsg_add_u32(m, "originalnetworkid", tdmi->tdmi_network_id);
if(tdmi->tdmi_network != NULL)
htsmsg_add_str(m, "network", tdmi->tdmi_network);
@ -650,7 +656,7 @@ tdmi_create_by_msg(th_dvb_adapter_t *tda, htsmsg_t *m, const char *identifier)
struct dvb_mux_conf dmc;
const char *s;
int r;
unsigned int tsid, u32, enabled, initscan;
unsigned int onid, tsid, u32, enabled, initscan;
memset(&dmc, 0, sizeof(dmc));
@ -765,6 +771,8 @@ tdmi_create_by_msg(th_dvb_adapter_t *tda, htsmsg_t *m, const char *identifier)
if(htsmsg_get_u32(m, "transportstreamid", &tsid))
tsid = 0xffff;
if(htsmsg_get_u32(m, "originalnetworkid", &onid))
onid = 0;
if(htsmsg_get_u32(m, "enabled", &enabled))
enabled = 1;
@ -779,7 +787,7 @@ tdmi_create_by_msg(th_dvb_adapter_t *tda, htsmsg_t *m, const char *identifier)
initscan = 1;
tdmi = dvb_mux_create(tda, &dmc,
tsid, htsmsg_get_str(m, "network"), NULL, enabled,
onid, tsid, htsmsg_get_str(m, "network"), NULL, enabled,
initscan,
identifier, NULL);
if(tdmi != NULL) {
@ -1004,6 +1012,9 @@ dvb_mux_build_msg(th_dvb_mux_instance_t *tdmi)
if(tdmi->tdmi_transport_stream_id != 0xffff)
htsmsg_add_u32(m, "muxid", tdmi->tdmi_transport_stream_id);
if(tdmi->tdmi_network_id)
htsmsg_add_u32(m, "onid", tdmi->tdmi_network_id);
htsmsg_add_u32(m, "quality", tdmi->tdmi_quality);
return m;
}
@ -1137,7 +1148,7 @@ dvb_mux_add_by_params(th_dvb_adapter_t *tda,
}
dmc.dmc_polarisation = polarisation;
tdmi = dvb_mux_create(tda, &dmc, 0xffff, NULL, NULL, 1, 1, NULL, NULL);
tdmi = dvb_mux_create(tda, &dmc, 0, 0xffff, NULL, NULL, 1, 1, NULL, NULL);
if(tdmi == NULL)
return "Mux already exist";
@ -1160,6 +1171,7 @@ dvb_mux_copy(th_dvb_adapter_t *dst, th_dvb_mux_instance_t *tdmi_src,
tdmi_dst = dvb_mux_create(dst,
&tdmi_src->tdmi_conf,
tdmi_src->tdmi_network_id,
tdmi_src->tdmi_transport_stream_id,
tdmi_src->tdmi_network,
"copy operation", tdmi_src->tdmi_enabled,

View file

@ -98,7 +98,7 @@ dvb_mux_preconf_add(th_dvb_adapter_t *tda, const network_t *net,
dmc.dmc_satconf = dvb_satconf_entry_find(tda, satconf, 0);
dvb_mux_create(tda, &dmc, 0xffff, NULL, source, 1, 1, NULL, NULL);
dvb_mux_create(tda, &dmc, 0, 0xffff, NULL, source, 1, 1, NULL, NULL);
}
}

View file

@ -366,7 +366,7 @@ dvb_bat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *buf, int len,
{
int i, j, bdlen, tslen, tdlen;
uint8_t dtag, dlen;
uint16_t tsid;
uint16_t tsid, onid;
char crid[257];
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
@ -391,6 +391,7 @@ dvb_bat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *buf, int len,
i = 0;
while (i+6 < tslen) {
tsid = buf[i] << 8 | buf[i+1];
onid = buf[i+2] << 8 | buf[i+3];
tdlen = ((buf[i+4] & 0xf) << 8) | buf[i+5];
if (tdlen+i+6 > tslen) break;
i += 6;
@ -398,7 +399,8 @@ dvb_bat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *buf, int len,
/* Find TDMI */
LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link)
if(tdmi->tdmi_transport_stream_id == tsid)
if(tdmi->tdmi_transport_stream_id == tsid &&
tdmi->tdmi_network_id == onid)
break;
/* Descriptors */
@ -441,7 +443,7 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
{
service_t *t;
uint16_t service_id;
uint16_t transport_stream_id;
uint16_t tsid, onid;
int free_ca_mode;
int dllen;
uint8_t dtag, dlen;
@ -458,13 +460,15 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
if(len < 8) return -1;
transport_stream_id = ptr[0] << 8 | ptr[1];
tsid = ptr[0] << 8 | ptr[1];
onid = ptr[5] << 8 | ptr[6];
if (tableid == 0x42) {
if(tdmi->tdmi_transport_stream_id != transport_stream_id)
if(tdmi->tdmi_transport_stream_id != tsid || tdmi->tdmi_network_id != onid)
return -1;
} else {
LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link)
if(tdmi->tdmi_transport_stream_id == transport_stream_id)
if(tdmi->tdmi_transport_stream_id == tsid &&
tdmi->tdmi_network_id != onid)
break;
if (!tdmi) return 0;
}
@ -623,14 +627,14 @@ dvb_pat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
LIST_FOREACH(other, &tda->tda_muxes, tdmi_adapter_link)
if(other != tdmi &&
other->tdmi_conf.dmc_satconf == tdmi->tdmi_conf.dmc_satconf &&
other->tdmi_transport_stream_id == tsid)
other->tdmi_transport_stream_id == tsid &&
other->tdmi_network_id == tdmi->tdmi_network_id)
return -1;
if(tdmi->tdmi_transport_stream_id == 0xffff)
dvb_mux_set_tsid(tdmi, tsid);
else if(tdmi->tdmi_transport_stream_id != tsid) {
else if (tdmi->tdmi_transport_stream_id != tsid)
return -1; // TSID mismatches, skip packet, may be from another mux
}
ptr += 5;
len -= 5;
@ -740,7 +744,7 @@ static const fe_modulation_t qam_tab [6] = {
*/
static int
dvb_table_cable_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
uint16_t tsid)
uint16_t tsid, uint16_t onid)
{
struct dvb_mux_conf dmc;
int freq, symrate;
@ -777,7 +781,7 @@ dvb_table_cable_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
dmc.dmc_fe_params.u.qam.fec_inner = fec_tab[ptr[10] & 0x07];
dvb_mux_create(tdmi->tdmi_adapter, &dmc, tsid, NULL,
dvb_mux_create(tdmi->tdmi_adapter, &dmc, onid, tsid, NULL,
"automatic mux discovery", 1, 1, NULL, NULL);
return 0;
}
@ -787,7 +791,7 @@ dvb_table_cable_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
*/
static int
dvb_table_sat_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
uint16_t tsid)
uint16_t tsid, uint16_t onid)
{
int freq, symrate;
// uint16_t orbital_pos;
@ -862,7 +866,7 @@ dvb_table_sat_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
}
#endif
dvb_mux_create(tdmi->tdmi_adapter, &dmc, tsid, NULL,
dvb_mux_create(tdmi->tdmi_adapter, &dmc, onid, tsid, NULL,
"automatic mux discovery", 1, 1, NULL, tdmi->tdmi_conf.dmc_satconf);
return 0;
@ -874,14 +878,14 @@ dvb_table_sat_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
*/
static void
dvb_table_local_channel(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
uint16_t tsid)
uint16_t tsid, uint16_t onid)
{
uint16_t sid, chan;
th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
service_t *t;
LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link)
if(tdmi->tdmi_transport_stream_id == tsid)
if(tdmi->tdmi_transport_stream_id == tsid && tdmi->tdmi_network_id == onid)
break;
if(tdmi == NULL)
@ -919,7 +923,7 @@ dvb_nit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
uint8_t tag, tlen;
int ntl;
char networkname[256];
uint16_t tsid;
uint16_t tsid, onid;
uint16_t network_id = (ptr[0] << 8) | ptr[1];
if(tdmi->tdmi_adapter->tda_nitoid) {
@ -981,6 +985,7 @@ dvb_nit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
while(len >= 6) {
tsid = ( ptr[0] << 8) | ptr[1];
onid = ( ptr[2] << 8) | ptr[3];
ntl = ((ptr[4] & 0xf) << 8) | ptr[5];
ptr += 6;
@ -997,14 +1002,14 @@ dvb_nit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
switch(tag) {
case DVB_DESC_SAT:
if(tdmi->tdmi_adapter->tda_type == FE_QPSK)
dvb_table_sat_delivery(tdmi, ptr, tlen, tsid);
dvb_table_sat_delivery(tdmi, ptr, tlen, tsid, onid);
break;
case DVB_DESC_CABLE:
if(tdmi->tdmi_adapter->tda_type == FE_QAM)
dvb_table_cable_delivery(tdmi, ptr, tlen, tsid);
dvb_table_cable_delivery(tdmi, ptr, tlen, tsid, onid);
break;
case DVB_DESC_LOCAL_CHAN:
dvb_table_local_channel(tdmi, ptr, tlen, tsid);
dvb_table_local_channel(tdmi, ptr, tlen, tsid, onid);
break;
}
@ -1031,7 +1036,7 @@ atsc_vct_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
uint8_t atsc_stype;
uint8_t stype;
uint16_t service_id;
uint16_t transport_stream_id;
uint16_t tsid, onid;
int dlen, dl;
uint8_t *dptr;
@ -1055,11 +1060,12 @@ atsc_vct_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
if(dlen + 32 > len)
return -1; // Corrupt table
transport_stream_id = (ptr[22] << 8) | ptr[23];
tsid = (ptr[22] << 8) | ptr[23];
onid = (ptr[24] << 8) | ptr[25];
/* Search all muxes on adapter */
LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link)
if(tdmi->tdmi_transport_stream_id == transport_stream_id)
if(tdmi->tdmi_transport_stream_id == tsid && tdmi->tdmi_network_id == onid);
break;
if(tdmi == NULL)

View file

@ -35,6 +35,7 @@ typedef struct eit_table_status
{
LIST_ENTRY(eit_table_status) link;
int tid;
uint16_t onid;
uint16_t tsid;
uint16_t sid;
uint32_t sec[8];
@ -54,7 +55,8 @@ typedef struct eit_status
} eit_status_t;
static eit_table_status_t *eit_status_find
( eit_status_t *status, int tableid, uint16_t tsid, uint16_t sid,
( eit_status_t *status, int tableid,
uint16_t onid, uint16_t tsid, uint16_t sid,
uint8_t sec, uint8_t lst, uint8_t seg, uint8_t ver )
{
int i, sec_index;
@ -63,7 +65,8 @@ static eit_table_status_t *eit_status_find
/* Find */
LIST_FOREACH(sta, &status->tables, link)
if (sta->tid == tableid && sta->tsid == tsid && sta->sid == sid)
if (sta->tid == tableid && sta->tsid == tsid && sta->onid == onid &&
sta->sid == sid)
break;
/* Already complete */
@ -74,6 +77,7 @@ static eit_table_status_t *eit_status_find
sta = calloc(1, sizeof(eit_table_status_t));
LIST_INSERT_HEAD(&status->tables, sta, link);
sta->tid = tableid;
sta->onid = onid;
sta->tsid = tsid;
sta->sid = sid;
sta->ver = 255; // Note: force update below
@ -651,7 +655,7 @@ static int _eit_callback
eit_status_t *sta;
eit_table_status_t *tsta;
int resched = 0, save = 0;
uint16_t tsid, sid;
uint16_t onid, tsid, sid;
uint16_t sec, lst, seg, ver;
/* Invalid */
@ -673,21 +677,22 @@ static int _eit_callback
/* Get table info */
sid = ptr[0] << 8 | ptr[1];
tsid = ptr[5] << 8 | ptr[6];
onid = ptr[7] << 8 | ptr[8];
sec = ptr[3];
lst = ptr[4];
seg = ptr[9];
ver = (ptr[2] >> 1) & 0x1f;
#ifdef EPG_EIT_TRACE
tvhlog(LOG_DEBUG, mod->id,
"tid=0x%02X, tsid=0x%04X, sid=0x%04X, sec=%3d/%3d, seg=%3d, ver=%2d, cur=%d",
tableid, tsid, sid, sec, lst, seg, ver, ptr[2] & 1);
"tid=0x%02X, onid=0x%04X, tsid=0x%04X, sid=0x%04X, sec=%3d/%3d, seg=%3d, ver=%2d, cur=%d",
tableid, onid, tsid, sid, sec, lst, seg, ver, ptr[2] & 1);
#endif
/* Don't process */
if((ptr[2] & 1) == 0) return 0;
/* Current status */
tsta = eit_status_find(sta, tableid, tsid, sid, sec, lst, seg, ver);
tsta = eit_status_find(sta, tableid, onid, tsid, sid, sec, lst, seg, ver);
#ifdef EPG_EIT_TRACE
tvhlog(LOG_DEBUG, mod->id, tsta && tsta->state != EIT_STATUS_DONE ? "section process" : "section seen");
#endif
@ -700,13 +705,16 @@ static int _eit_callback
if(tableid == 0x4f || tableid >= 0x60) {
tda = tdmi->tdmi_adapter;
LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link)
if(tdmi->tdmi_transport_stream_id == tsid)
if(tdmi->tdmi_transport_stream_id == tsid &&
tdmi->tdmi_network_id == onid)
break;
} else {
if (tdmi->tdmi_transport_stream_id != tsid) {
if (tdmi->tdmi_transport_stream_id != tsid ||
tdmi->tdmi_network_id != onid) {
tvhlog(LOG_DEBUG, mod->id,
"invalid transport id found (tid 0x%02X, tsid %d != %d",
tableid, tdmi->tdmi_transport_stream_id, tsid);
"invalid transport id found tid 0x%02X, onid:tsid %d:%d != %d:%d",
tableid, tdmi->tdmi_network_id, tdmi->tdmi_transport_stream_id,
onid, tsid);
tdmi = NULL;
}
}
@ -762,9 +770,9 @@ done:
LIST_FOREACH(tsta, &sta->tables, link) {
total++;
tvhlog(LOG_DEBUG, mod->id,
" tid=0x%02X, tsid=0x%04X, sid=0x%04X, ver=%02d, done=%d, "
" tid=0x%02X, onid=0x%04X, tsid=0x%04X, sid=0x%04X, ver=%02d, done=%d, "
"mask=%08X|%08X|%08X|%08X|%08X|%08X|%08X|%08X",
tsta->tid, tsta->tsid, tsta->sid, tsta->ver,
tsta->tid, tsta->onid, tsta->tsid, tsta->sid, tsta->ver,
tsta->state == EIT_STATUS_DONE,
tsta->sec[7], tsta->sec[6], tsta->sec[5], tsta->sec[4],
tsta->sec[3], tsta->sec[2], tsta->sec[1], tsta->sec[0]);

View file

@ -131,7 +131,7 @@ typedef struct opentv_module_t
{
epggrab_module_ota_t ; ///< Base struct
int nid;
int onid;
int tsid;
int sid;
int *channel;
@ -189,7 +189,7 @@ static epggrab_channel_t *_opentv_find_epggrab_channel
(epggrab_module_t*)mod);
}
static service_t *_opentv_find_service ( int tsid, int sid )
static service_t *_opentv_find_service ( int onid, int tsid, int sid )
{
th_dvb_adapter_t *tda;
th_dvb_mux_instance_t *tdmi;
@ -197,6 +197,7 @@ static service_t *_opentv_find_service ( int tsid, int sid )
TAILQ_FOREACH(tda, &dvb_adapters, tda_global_link) {
LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) {
if (tdmi->tdmi_transport_stream_id != tsid) continue;
if (tdmi->tdmi_network_id != onid) continue;
LIST_FOREACH(t, &tdmi->tdmi_transports, s_group_link) {
if (t->s_dvb_service_id == sid) return t;
}
@ -427,7 +428,7 @@ static int _opentv_parse_event_section
* ***********************************************************************/
static void _opentv_parse_channels
( opentv_module_t *mod, uint8_t *buf, int len, uint16_t tsid )
( opentv_module_t *mod, uint8_t *buf, int len, uint16_t onid, uint16_t tsid )
{
epggrab_channel_t *ec;
epggrab_channel_link_t *ecl;
@ -441,7 +442,7 @@ static void _opentv_parse_channels
cnum = ((int)buf[i+5] << 8) | buf[i+6];
/* Find the service */
svc = _opentv_find_service(tsid, sid);
svc = _opentv_find_service(onid, tsid, sid);
if (svc && svc->s_ch && service_is_primary_epg(svc)) {
ec =_opentv_find_epggrab_channel(mod, cid, 1, &save);
ecl = LIST_FIRST(&ec->channels);
@ -457,13 +458,13 @@ static void _opentv_parse_channels
}
static int _opentv_parse_ts_desc
( opentv_module_t *mod, uint8_t *buf, int len, uint16_t tsid )
( opentv_module_t *mod, uint8_t *buf, int len, uint16_t onid, uint16_t tsid )
{
int dtag = buf[0];
int dlen = buf[1];
if (dlen+2 > len) return -1;
if (dtag == 0xb1)
_opentv_parse_channels(mod, buf+2, dlen, tsid);
_opentv_parse_channels(mod, buf+2, dlen, onid, tsid);
return dlen + 2;
}
@ -472,7 +473,7 @@ static int _opentv_bat_section
{
int i, r;
int bdlen, tllen, tdlen;
uint16_t bid, tsid;
uint16_t bid, tsid, onid;
uint8_t sec;
/* Skip (not yet applicable) */
@ -508,14 +509,14 @@ static int _opentv_bat_section
if (tllen > len) return -1;
while (len > 0) {
tsid = ((int)buf[0] << 8) | buf[1];
//nid = ((int)buf[2] << 8) | buf[3];
onid = ((int)buf[2] << 8) | buf[3];
tdlen = ((int)buf[4] & 0xf) << 8 | buf[5];
buf += 6;
len -= 6;
if (tdlen > len) return -1;
i = 0;
while (i < tdlen) {
r = _opentv_parse_ts_desc(mod, buf+i, tdlen-i, tsid);
r = _opentv_parse_ts_desc(mod, buf+i, tdlen-i, onid, tsid);
if (r < 0) return -1;
i += r;
}
@ -725,7 +726,7 @@ static int _opentv_enable ( void *m, uint8_t e )
/* Register interest */
if (e) {
epggrab_ota_create_and_register_by_id((epggrab_module_ota_t*)mod,
mod->nid, mod->tsid,
mod->onid, mod->tsid,
600, 3600, NULL);
/* Remove all links */
} else {
@ -837,7 +838,7 @@ static int _opentv_prov_load_one ( const char *id, htsmsg_t *m )
{
char ibuf[100], nbuf[1000];
htsmsg_t *cl, *tl, *sl;
uint32_t tsid, sid, nid;
uint32_t tsid, sid, onid;
const char *str, *name;
opentv_dict_t *dict;
opentv_genre_t *genre;
@ -850,7 +851,8 @@ static int _opentv_prov_load_one ( const char *id, htsmsg_t *m )
if (!(cl = htsmsg_get_list(m, "channel"))) return -1;
if (!(tl = htsmsg_get_list(m, "title"))) return -1;
if (!(sl = htsmsg_get_list(m, "summary"))) return -1;
if (htsmsg_get_u32(m, "nid", &nid)) return -1;
if (htsmsg_get_u32(m, "onid", &onid))
if (htsmsg_get_u32(m, "nid", &onid)) return -1;
if (htsmsg_get_u32(m, "tsid", &tsid)) return -1;
if (htsmsg_get_u32(m, "sid", &sid)) return -1;
@ -877,7 +879,7 @@ static int _opentv_prov_load_one ( const char *id, htsmsg_t *m )
/* Add provider details */
mod->dict = dict;
mod->genre = genre;
mod->nid = nid;
mod->onid = onid;
mod->tsid = tsid;
mod->sid = sid;
mod->channel = _pid_list_to_array(cl);

View file

@ -104,19 +104,19 @@ static void _epggrab_ota_load_one ( epggrab_module_ota_t *mod, htsmsg_t *m )
{
htsmsg_t *e;
htsmsg_field_t *f;
int nid, tsid, period, interval;
int onid, tsid, period, interval;
const char *netname;
HTSMSG_FOREACH(f, m) {
if ((e = htsmsg_get_map_by_field(f))) {
nid = htsmsg_get_u32_or_default(m, "nid", 0);
onid = htsmsg_get_u32_or_default(m, "onid", 0);
tsid = htsmsg_get_u32_or_default(m, "tsid", 0);
period = htsmsg_get_u32_or_default(m, "period", 0);
interval = htsmsg_get_u32_or_default(m, "interval", 0);
netname = htsmsg_get_str(m, "networkname");
if (tsid)
epggrab_ota_create_and_register_by_id(mod, nid, tsid,
epggrab_ota_create_and_register_by_id(mod, onid, tsid,
period, interval,
netname);
}
@ -146,7 +146,7 @@ static void _epggrab_ota_save_one ( htsmsg_t *m, epggrab_module_ota_t *mod )
TAILQ_FOREACH(ota, &mod->muxes, grab_link) {
if (!l) l = htsmsg_create_list();
e = htsmsg_create_map();
//htsmsg_add_u32(e, "nid", );
htsmsg_add_u32(e, "onid", ota->tdmi->tdmi_network_id);
htsmsg_add_u32(e, "tsid", ota->tdmi->tdmi_transport_stream_id);
htsmsg_add_u32(e, "period", ota->timeout);
htsmsg_add_u32(e, "interval", ota->interval);
@ -246,15 +246,16 @@ epggrab_ota_mux_t *epggrab_ota_create
* Create and register using mux ID
*/
void epggrab_ota_create_and_register_by_id
( epggrab_module_ota_t *mod, int nid, int tsid, int period, int interval, const char *networkname )
( epggrab_module_ota_t *mod, int onid, int tsid, int period, int interval,
const char *networkname )
{
th_dvb_adapter_t *tda;
th_dvb_mux_instance_t *tdmi;
epggrab_ota_mux_t *ota;
TAILQ_FOREACH(tda, &dvb_adapters, tda_global_link) {
//TODO: if (tda->nitoid != nid) continue;
LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) {
if (tdmi->tdmi_transport_stream_id != tsid) continue;
if (onid && tdmi->tdmi_network_id != onid) continue;
if (networkname && (!tdmi->tdmi_network || strcmp(networkname, tdmi->tdmi_network))) continue;
ota = epggrab_ota_create(mod, tdmi);
epggrab_ota_register(ota, period, interval);

View file

@ -76,6 +76,10 @@ tvheadend.dvb_muxes = function(adapterData, satConfStore) {
}
cmlist.push({
header : "NetworkID",
dataIndex : 'onid',
width : 50
}, {
header : "MuxID",
dataIndex : 'muxid',
width : 50
@ -86,7 +90,7 @@ tvheadend.dvb_muxes = function(adapterData, satConfStore) {
defaultSortable: true});
var rec = Ext.data.Record.create([ 'id', 'enabled', 'network', 'freq',
'pol', 'satconf', 'muxid', 'quality', 'fe_status', 'mod' ]);
'pol', 'satconf', 'onid', 'muxid', 'quality', 'fe_status', 'mod' ]);
var store = new Ext.data.JsonStore({
root : 'entries',