Add the concept of onid into the DVB structures, this will help overcome a few minor issues.
This commit is contained in:
parent
16fdfd2547
commit
1cc67b75e8
8 changed files with 94 additions and 60 deletions
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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]);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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',
|
||||
|
|
Loading…
Add table
Reference in a new issue