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 */ /* Linked if tdmi_conf.dmc_satconf != NULL */
LIST_ENTRY(th_dvb_mux_instance) tdmi_satconf_link; LIST_ENTRY(th_dvb_mux_instance) tdmi_satconf_link;
uint32_t tdmi_network_id;
uint16_t tdmi_transport_stream_id; uint16_t tdmi_transport_stream_id;
char *tdmi_identifier; 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, th_dvb_mux_instance_t *dvb_mux_create(th_dvb_adapter_t *tda,
const struct dvb_mux_conf *dmc, 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, const char *logprefix, int enabled,
int initialscan, const char *identifier, int initialscan, const char *identifier,
dvb_satconf_t *satconf); dvb_satconf_t *satconf);

View file

@ -153,7 +153,7 @@ tdmi_compare_conf(int adapter_type,
*/ */
th_dvb_mux_instance_t * th_dvb_mux_instance_t *
dvb_mux_create(th_dvb_adapter_t *tda, const struct dvb_mux_conf *dmc, 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, int enabled, int initialscan, const char *identifier,
dvb_satconf_t *satconf) 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; tdmi->tdmi_transport_stream_id = tsid;
save = 1; 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 */ /* HACK - load old transports and remove old mux config */
if(identifier) { 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); TAILQ_INIT(&tdmi->tdmi_table_queue);
tdmi->tdmi_network_id = onid;
tdmi->tdmi_transport_stream_id = tsid; tdmi->tdmi_transport_stream_id = tsid;
tdmi->tdmi_adapter = tda; tdmi->tdmi_adapter = tda;
tdmi->tdmi_network = network ? strdup(network) : NULL; 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_str(m, "status", dvb_mux_status(tdmi));
htsmsg_add_u32(m, "transportstreamid", tdmi->tdmi_transport_stream_id); htsmsg_add_u32(m, "transportstreamid", tdmi->tdmi_transport_stream_id);
htsmsg_add_u32(m, "originalnetworkid", tdmi->tdmi_network_id);
if(tdmi->tdmi_network != NULL) if(tdmi->tdmi_network != NULL)
htsmsg_add_str(m, "network", tdmi->tdmi_network); 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; struct dvb_mux_conf dmc;
const char *s; const char *s;
int r; int r;
unsigned int tsid, u32, enabled, initscan; unsigned int onid, tsid, u32, enabled, initscan;
memset(&dmc, 0, sizeof(dmc)); 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)) if(htsmsg_get_u32(m, "transportstreamid", &tsid))
tsid = 0xffff; tsid = 0xffff;
if(htsmsg_get_u32(m, "originalnetworkid", &onid))
onid = 0;
if(htsmsg_get_u32(m, "enabled", &enabled)) if(htsmsg_get_u32(m, "enabled", &enabled))
enabled = 1; enabled = 1;
@ -779,7 +787,7 @@ tdmi_create_by_msg(th_dvb_adapter_t *tda, htsmsg_t *m, const char *identifier)
initscan = 1; initscan = 1;
tdmi = dvb_mux_create(tda, &dmc, tdmi = dvb_mux_create(tda, &dmc,
tsid, htsmsg_get_str(m, "network"), NULL, enabled, onid, tsid, htsmsg_get_str(m, "network"), NULL, enabled,
initscan, initscan,
identifier, NULL); identifier, NULL);
if(tdmi != 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) if(tdmi->tdmi_transport_stream_id != 0xffff)
htsmsg_add_u32(m, "muxid", tdmi->tdmi_transport_stream_id); 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); htsmsg_add_u32(m, "quality", tdmi->tdmi_quality);
return m; return m;
} }
@ -1137,7 +1148,7 @@ dvb_mux_add_by_params(th_dvb_adapter_t *tda,
} }
dmc.dmc_polarisation = polarisation; 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) if(tdmi == NULL)
return "Mux already exist"; 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_dst = dvb_mux_create(dst,
&tdmi_src->tdmi_conf, &tdmi_src->tdmi_conf,
tdmi_src->tdmi_network_id,
tdmi_src->tdmi_transport_stream_id, tdmi_src->tdmi_transport_stream_id,
tdmi_src->tdmi_network, tdmi_src->tdmi_network,
"copy operation", tdmi_src->tdmi_enabled, "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); 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; int i, j, bdlen, tslen, tdlen;
uint8_t dtag, dlen; uint8_t dtag, dlen;
uint16_t tsid; uint16_t tsid, onid;
char crid[257]; char crid[257];
th_dvb_adapter_t *tda = tdmi->tdmi_adapter; 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; i = 0;
while (i+6 < tslen) { while (i+6 < tslen) {
tsid = buf[i] << 8 | buf[i+1]; tsid = buf[i] << 8 | buf[i+1];
onid = buf[i+2] << 8 | buf[i+3];
tdlen = ((buf[i+4] & 0xf) << 8) | buf[i+5]; tdlen = ((buf[i+4] & 0xf) << 8) | buf[i+5];
if (tdlen+i+6 > tslen) break; if (tdlen+i+6 > tslen) break;
i += 6; i += 6;
@ -398,7 +399,8 @@ dvb_bat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *buf, int len,
/* Find TDMI */ /* Find TDMI */
LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) 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; break;
/* Descriptors */ /* Descriptors */
@ -441,7 +443,7 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
{ {
service_t *t; service_t *t;
uint16_t service_id; uint16_t service_id;
uint16_t transport_stream_id; uint16_t tsid, onid;
int free_ca_mode; int free_ca_mode;
int dllen; int dllen;
uint8_t dtag, dlen; 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; 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 (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; return -1;
} else { } else {
LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) 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; break;
if (!tdmi) return 0; 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) LIST_FOREACH(other, &tda->tda_muxes, tdmi_adapter_link)
if(other != tdmi && if(other != tdmi &&
other->tdmi_conf.dmc_satconf == tdmi->tdmi_conf.dmc_satconf && 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; return -1;
if(tdmi->tdmi_transport_stream_id == 0xffff) if(tdmi->tdmi_transport_stream_id == 0xffff)
dvb_mux_set_tsid(tdmi, tsid); 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 return -1; // TSID mismatches, skip packet, may be from another mux
}
ptr += 5; ptr += 5;
len -= 5; len -= 5;
@ -740,7 +744,7 @@ static const fe_modulation_t qam_tab [6] = {
*/ */
static int static int
dvb_table_cable_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, 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; struct dvb_mux_conf dmc;
int freq, symrate; 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]; 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); "automatic mux discovery", 1, 1, NULL, NULL);
return 0; return 0;
} }
@ -787,7 +791,7 @@ dvb_table_cable_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
*/ */
static int static int
dvb_table_sat_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, 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; int freq, symrate;
// uint16_t orbital_pos; // uint16_t orbital_pos;
@ -862,7 +866,7 @@ dvb_table_sat_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
} }
#endif #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); "automatic mux discovery", 1, 1, NULL, tdmi->tdmi_conf.dmc_satconf);
return 0; return 0;
@ -874,14 +878,14 @@ dvb_table_sat_delivery(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
*/ */
static void static void
dvb_table_local_channel(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, 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; uint16_t sid, chan;
th_dvb_adapter_t *tda = tdmi->tdmi_adapter; th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
service_t *t; service_t *t;
LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) 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; break;
if(tdmi == NULL) 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; uint8_t tag, tlen;
int ntl; int ntl;
char networkname[256]; char networkname[256];
uint16_t tsid; uint16_t tsid, onid;
uint16_t network_id = (ptr[0] << 8) | ptr[1]; uint16_t network_id = (ptr[0] << 8) | ptr[1];
if(tdmi->tdmi_adapter->tda_nitoid) { 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) { while(len >= 6) {
tsid = ( ptr[0] << 8) | ptr[1]; tsid = ( ptr[0] << 8) | ptr[1];
onid = ( ptr[2] << 8) | ptr[3];
ntl = ((ptr[4] & 0xf) << 8) | ptr[5]; ntl = ((ptr[4] & 0xf) << 8) | ptr[5];
ptr += 6; ptr += 6;
@ -997,14 +1002,14 @@ dvb_nit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
switch(tag) { switch(tag) {
case DVB_DESC_SAT: case DVB_DESC_SAT:
if(tdmi->tdmi_adapter->tda_type == FE_QPSK) 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; break;
case DVB_DESC_CABLE: case DVB_DESC_CABLE:
if(tdmi->tdmi_adapter->tda_type == FE_QAM) 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; break;
case DVB_DESC_LOCAL_CHAN: case DVB_DESC_LOCAL_CHAN:
dvb_table_local_channel(tdmi, ptr, tlen, tsid); dvb_table_local_channel(tdmi, ptr, tlen, tsid, onid);
break; 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 atsc_stype;
uint8_t stype; uint8_t stype;
uint16_t service_id; uint16_t service_id;
uint16_t transport_stream_id; uint16_t tsid, onid;
int dlen, dl; int dlen, dl;
uint8_t *dptr; 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) if(dlen + 32 > len)
return -1; // Corrupt table 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 */ /* Search all muxes on adapter */
LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) 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; break;
if(tdmi == NULL) if(tdmi == NULL)

View file

@ -35,6 +35,7 @@ typedef struct eit_table_status
{ {
LIST_ENTRY(eit_table_status) link; LIST_ENTRY(eit_table_status) link;
int tid; int tid;
uint16_t onid;
uint16_t tsid; uint16_t tsid;
uint16_t sid; uint16_t sid;
uint32_t sec[8]; uint32_t sec[8];
@ -54,7 +55,8 @@ typedef struct eit_status
} eit_status_t; } eit_status_t;
static eit_table_status_t *eit_status_find 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 ) uint8_t sec, uint8_t lst, uint8_t seg, uint8_t ver )
{ {
int i, sec_index; int i, sec_index;
@ -63,7 +65,8 @@ static eit_table_status_t *eit_status_find
/* Find */ /* Find */
LIST_FOREACH(sta, &status->tables, link) 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; break;
/* Already complete */ /* Already complete */
@ -74,6 +77,7 @@ static eit_table_status_t *eit_status_find
sta = calloc(1, sizeof(eit_table_status_t)); sta = calloc(1, sizeof(eit_table_status_t));
LIST_INSERT_HEAD(&status->tables, sta, link); LIST_INSERT_HEAD(&status->tables, sta, link);
sta->tid = tableid; sta->tid = tableid;
sta->onid = onid;
sta->tsid = tsid; sta->tsid = tsid;
sta->sid = sid; sta->sid = sid;
sta->ver = 255; // Note: force update below sta->ver = 255; // Note: force update below
@ -651,7 +655,7 @@ static int _eit_callback
eit_status_t *sta; eit_status_t *sta;
eit_table_status_t *tsta; eit_table_status_t *tsta;
int resched = 0, save = 0; int resched = 0, save = 0;
uint16_t tsid, sid; uint16_t onid, tsid, sid;
uint16_t sec, lst, seg, ver; uint16_t sec, lst, seg, ver;
/* Invalid */ /* Invalid */
@ -673,21 +677,22 @@ static int _eit_callback
/* Get table info */ /* Get table info */
sid = ptr[0] << 8 | ptr[1]; sid = ptr[0] << 8 | ptr[1];
tsid = ptr[5] << 8 | ptr[6]; tsid = ptr[5] << 8 | ptr[6];
onid = ptr[7] << 8 | ptr[8];
sec = ptr[3]; sec = ptr[3];
lst = ptr[4]; lst = ptr[4];
seg = ptr[9]; seg = ptr[9];
ver = (ptr[2] >> 1) & 0x1f; ver = (ptr[2] >> 1) & 0x1f;
#ifdef EPG_EIT_TRACE #ifdef EPG_EIT_TRACE
tvhlog(LOG_DEBUG, mod->id, tvhlog(LOG_DEBUG, mod->id,
"tid=0x%02X, tsid=0x%04X, sid=0x%04X, sec=%3d/%3d, seg=%3d, ver=%2d, cur=%d", "tid=0x%02X, onid=0x%04X, 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); tableid, onid, tsid, sid, sec, lst, seg, ver, ptr[2] & 1);
#endif #endif
/* Don't process */ /* Don't process */
if((ptr[2] & 1) == 0) return 0; if((ptr[2] & 1) == 0) return 0;
/* Current status */ /* 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 #ifdef EPG_EIT_TRACE
tvhlog(LOG_DEBUG, mod->id, tsta && tsta->state != EIT_STATUS_DONE ? "section process" : "section seen"); tvhlog(LOG_DEBUG, mod->id, tsta && tsta->state != EIT_STATUS_DONE ? "section process" : "section seen");
#endif #endif
@ -700,13 +705,16 @@ static int _eit_callback
if(tableid == 0x4f || tableid >= 0x60) { if(tableid == 0x4f || tableid >= 0x60) {
tda = tdmi->tdmi_adapter; tda = tdmi->tdmi_adapter;
LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) 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; break;
} else { } 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, tvhlog(LOG_DEBUG, mod->id,
"invalid transport id found (tid 0x%02X, tsid %d != %d", "invalid transport id found tid 0x%02X, onid:tsid %d:%d != %d:%d",
tableid, tdmi->tdmi_transport_stream_id, tsid); tableid, tdmi->tdmi_network_id, tdmi->tdmi_transport_stream_id,
onid, tsid);
tdmi = NULL; tdmi = NULL;
} }
} }
@ -762,9 +770,9 @@ done:
LIST_FOREACH(tsta, &sta->tables, link) { LIST_FOREACH(tsta, &sta->tables, link) {
total++; total++;
tvhlog(LOG_DEBUG, mod->id, 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", "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->state == EIT_STATUS_DONE,
tsta->sec[7], tsta->sec[6], tsta->sec[5], tsta->sec[4], tsta->sec[7], tsta->sec[6], tsta->sec[5], tsta->sec[4],
tsta->sec[3], tsta->sec[2], tsta->sec[1], tsta->sec[0]); 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 epggrab_module_ota_t ; ///< Base struct
int nid; int onid;
int tsid; int tsid;
int sid; int sid;
int *channel; int *channel;
@ -189,7 +189,7 @@ static epggrab_channel_t *_opentv_find_epggrab_channel
(epggrab_module_t*)mod); (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_adapter_t *tda;
th_dvb_mux_instance_t *tdmi; 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) { TAILQ_FOREACH(tda, &dvb_adapters, tda_global_link) {
LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) { LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) {
if (tdmi->tdmi_transport_stream_id != tsid) continue; if (tdmi->tdmi_transport_stream_id != tsid) continue;
if (tdmi->tdmi_network_id != onid) continue;
LIST_FOREACH(t, &tdmi->tdmi_transports, s_group_link) { LIST_FOREACH(t, &tdmi->tdmi_transports, s_group_link) {
if (t->s_dvb_service_id == sid) return t; if (t->s_dvb_service_id == sid) return t;
} }
@ -427,7 +428,7 @@ static int _opentv_parse_event_section
* ***********************************************************************/ * ***********************************************************************/
static void _opentv_parse_channels 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_t *ec;
epggrab_channel_link_t *ecl; epggrab_channel_link_t *ecl;
@ -441,7 +442,7 @@ static void _opentv_parse_channels
cnum = ((int)buf[i+5] << 8) | buf[i+6]; cnum = ((int)buf[i+5] << 8) | buf[i+6];
/* Find the service */ /* 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)) { if (svc && svc->s_ch && service_is_primary_epg(svc)) {
ec =_opentv_find_epggrab_channel(mod, cid, 1, &save); ec =_opentv_find_epggrab_channel(mod, cid, 1, &save);
ecl = LIST_FIRST(&ec->channels); ecl = LIST_FIRST(&ec->channels);
@ -457,13 +458,13 @@ static void _opentv_parse_channels
} }
static int _opentv_parse_ts_desc 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 dtag = buf[0];
int dlen = buf[1]; int dlen = buf[1];
if (dlen+2 > len) return -1; if (dlen+2 > len) return -1;
if (dtag == 0xb1) if (dtag == 0xb1)
_opentv_parse_channels(mod, buf+2, dlen, tsid); _opentv_parse_channels(mod, buf+2, dlen, onid, tsid);
return dlen + 2; return dlen + 2;
} }
@ -472,7 +473,7 @@ static int _opentv_bat_section
{ {
int i, r; int i, r;
int bdlen, tllen, tdlen; int bdlen, tllen, tdlen;
uint16_t bid, tsid; uint16_t bid, tsid, onid;
uint8_t sec; uint8_t sec;
/* Skip (not yet applicable) */ /* Skip (not yet applicable) */
@ -508,14 +509,14 @@ static int _opentv_bat_section
if (tllen > len) return -1; if (tllen > len) return -1;
while (len > 0) { while (len > 0) {
tsid = ((int)buf[0] << 8) | buf[1]; 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]; tdlen = ((int)buf[4] & 0xf) << 8 | buf[5];
buf += 6; buf += 6;
len -= 6; len -= 6;
if (tdlen > len) return -1; if (tdlen > len) return -1;
i = 0; i = 0;
while (i < tdlen) { 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; if (r < 0) return -1;
i += r; i += r;
} }
@ -725,7 +726,7 @@ static int _opentv_enable ( void *m, uint8_t e )
/* Register interest */ /* Register interest */
if (e) { if (e) {
epggrab_ota_create_and_register_by_id((epggrab_module_ota_t*)mod, epggrab_ota_create_and_register_by_id((epggrab_module_ota_t*)mod,
mod->nid, mod->tsid, mod->onid, mod->tsid,
600, 3600, NULL); 600, 3600, NULL);
/* Remove all links */ /* Remove all links */
} else { } else {
@ -837,7 +838,7 @@ static int _opentv_prov_load_one ( const char *id, htsmsg_t *m )
{ {
char ibuf[100], nbuf[1000]; char ibuf[100], nbuf[1000];
htsmsg_t *cl, *tl, *sl; htsmsg_t *cl, *tl, *sl;
uint32_t tsid, sid, nid; uint32_t tsid, sid, onid;
const char *str, *name; const char *str, *name;
opentv_dict_t *dict; opentv_dict_t *dict;
opentv_genre_t *genre; 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 (!(cl = htsmsg_get_list(m, "channel"))) return -1;
if (!(tl = htsmsg_get_list(m, "title"))) return -1; if (!(tl = htsmsg_get_list(m, "title"))) return -1;
if (!(sl = htsmsg_get_list(m, "summary"))) 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, "tsid", &tsid)) return -1;
if (htsmsg_get_u32(m, "sid", &sid)) 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 */ /* Add provider details */
mod->dict = dict; mod->dict = dict;
mod->genre = genre; mod->genre = genre;
mod->nid = nid; mod->onid = onid;
mod->tsid = tsid; mod->tsid = tsid;
mod->sid = sid; mod->sid = sid;
mod->channel = _pid_list_to_array(cl); 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_t *e;
htsmsg_field_t *f; htsmsg_field_t *f;
int nid, tsid, period, interval; int onid, tsid, period, interval;
const char *netname; const char *netname;
HTSMSG_FOREACH(f, m) { HTSMSG_FOREACH(f, m) {
if ((e = htsmsg_get_map_by_field(f))) { 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); tsid = htsmsg_get_u32_or_default(m, "tsid", 0);
period = htsmsg_get_u32_or_default(m, "period", 0); period = htsmsg_get_u32_or_default(m, "period", 0);
interval = htsmsg_get_u32_or_default(m, "interval", 0); interval = htsmsg_get_u32_or_default(m, "interval", 0);
netname = htsmsg_get_str(m, "networkname"); netname = htsmsg_get_str(m, "networkname");
if (tsid) if (tsid)
epggrab_ota_create_and_register_by_id(mod, nid, tsid, epggrab_ota_create_and_register_by_id(mod, onid, tsid,
period, interval, period, interval,
netname); 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) { TAILQ_FOREACH(ota, &mod->muxes, grab_link) {
if (!l) l = htsmsg_create_list(); if (!l) l = htsmsg_create_list();
e = htsmsg_create_map(); 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, "tsid", ota->tdmi->tdmi_transport_stream_id);
htsmsg_add_u32(e, "period", ota->timeout); htsmsg_add_u32(e, "period", ota->timeout);
htsmsg_add_u32(e, "interval", ota->interval); htsmsg_add_u32(e, "interval", ota->interval);
@ -246,15 +246,16 @@ epggrab_ota_mux_t *epggrab_ota_create
* Create and register using mux ID * Create and register using mux ID
*/ */
void epggrab_ota_create_and_register_by_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_adapter_t *tda;
th_dvb_mux_instance_t *tdmi; th_dvb_mux_instance_t *tdmi;
epggrab_ota_mux_t *ota; epggrab_ota_mux_t *ota;
TAILQ_FOREACH(tda, &dvb_adapters, tda_global_link) { TAILQ_FOREACH(tda, &dvb_adapters, tda_global_link) {
//TODO: if (tda->nitoid != nid) continue;
LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) { LIST_FOREACH(tdmi, &tda->tda_muxes, tdmi_adapter_link) {
if (tdmi->tdmi_transport_stream_id != tsid) continue; 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; if (networkname && (!tdmi->tdmi_network || strcmp(networkname, tdmi->tdmi_network))) continue;
ota = epggrab_ota_create(mod, tdmi); ota = epggrab_ota_create(mod, tdmi);
epggrab_ota_register(ota, period, interval); epggrab_ota_register(ota, period, interval);

View file

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