typedef struct eit_private
{
- LIST_ENTRY(eit_private) link;
+ TAILQ_ENTRY(eit_private) link;
+ epggrab_module_ota_t *module;
uint16_t pid;
uint16_t bat_pid;
int conv;
eit_pattern_list_t p_is_new; ///< Is programme new to air
} eit_module_t;
+static TAILQ_HEAD(, eit_private) eit_private_list;
+
/* ************************************************************************
* Status handling
* ***********************************************************************/
void eit_nit_callback(mpegts_table_t *mt, uint16_t nbid, const char *name, uint32_t nitpriv)
{
mpegts_mux_t *dm = mt->mt_mux;
- epggrab_ota_mux_t *om = epggrab_ota_find_mux(dm);
+ epggrab_ota_mux_t *om;
epggrab_ota_map_t *map;
epggrab_module_ota_t *m = NULL;
eit_nit_t *nit;
tvhtrace(LS_TBL_EIT, "NIT - tsid %04X (%d) onid %04X (%d) nbid %04X (%d) network name '%s' private %08X",
dm->mm_tsid, dm->mm_tsid, dm->mm_onid, dm->mm_onid, nbid, nbid, name, nitpriv);
- LIST_FOREACH(map, &om->om_modules, om_link) {
- m = map->om_module;
- priv = m->opaque;
- if (priv == NULL)
- continue;
+ TAILQ_FOREACH(priv, &eit_private_list, link) {
+ m = priv->module;
if (priv->nitpriv && priv->nitpriv != nitpriv)
continue;
if (LIST_FIRST(&priv->nit)) {
}
}
- if (map && priv->bat_pid) {
+ if (!priv)
+ return;
+
+ if (priv->bat_pid) {
mpegts_table_add(dm, DVB_BAT_BASE, DVB_BAT_MASK, dvb_bat_callback, NULL,
"ebat", LS_TBL_BASE, MT_CRC, priv->bat_pid, MPS_WEIGHT_EIT);
}
- if (!map)
+ om = epggrab_ota_find_mux(dm);
+ if (!om)
return;
-
- m = map->om_module;
- if (!m->enabled && !map->om_forced)
+ LIST_FOREACH(map, &om->om_modules, om_link) {
+ if (map->om_module == m)
+ break;
+ }
+ if (!map || (!m->enabled && !map->om_forced)) {
+ tvhtrace(m->subsys, "NIT - module '%s' not enabled", m->id);
return;
+ }
tvhtrace(m->subsys, "NIT - detected module '%s'", m->id);
priv = (eit_private_t *)m->opaque;
free(generic_name);
}
-void _eit_done ( void *m )
+static void _eit_done0( eit_private_t *priv )
{
- eit_module_t *mod = m;
eit_nit_t *nit;
- eit_private_t *priv = mod->opaque;
- _eit_scrape_clear(mod);
- mod->opaque = NULL;
while ((nit = LIST_FIRST(&priv->nit)) != NULL) {
LIST_REMOVE(nit, link);
free(nit->name);
free(priv);
}
+void _eit_done ( void *m )
+{
+ eit_module_t *mod = m;
+ eit_private_t *priv = mod->opaque;
+ _eit_scrape_clear(mod);
+ mod->opaque = NULL;
+ TAILQ_REMOVE(&eit_private_list, priv, link);
+ _eit_done0(priv);
+}
+
static htsmsg_t *
epggrab_mod_eit_class_short_list ( void *o, const char *lang )
{
if (map) {
HTSMSG_FOREACH(f, map) {
nit = calloc(1, sizeof(*nit));
- nit->name = strdup(f->hmf_name);
+ nit->name = f->hmf_name[0] ? strdup(f->hmf_name) : NULL;
if ((e = htsmsg_field_get_map(f)) != NULL) {
eit_parse_list(e, "onid", nit->onid, ARRAY_SIZE(nit->onid), &nit->onid_count);
eit_parse_list(e, "tsid", nit->tsid, ARRAY_SIZE(nit->tsid), &nit->tsid_count);
}
}
if (name_str) {
- eit_module_ota_create(id, LS_TBL_EIT, NULL,
- lang_str_get(name_str, NULL),
- prio, ops);
+ priv->module = (epggrab_module_ota_t *)
+ eit_module_ota_create(id, LS_TBL_EIT, NULL,
+ lang_str_get(name_str, NULL),
+ prio, ops);
+ TAILQ_INSERT_TAIL(&eit_private_list, priv, link);
} else {
tvherror(LS_TBL_EIT, "missing name for '%s' in config", id);
+ _eit_done0(priv);
}
lang_str_destroy(name_str);
}
htsmsg_field_t *f;
htsmsg_t *c, *e;
+ TAILQ_INIT(&eit_private_list);
+
c = hts_settings_load("epggrab/eit/config");
if (!c) {
tvhwarn(LS_TBL_EIT, "EIT configuration file missing");
return !LIST_EMPTY(&mm->mm_services) && mm->mm_scan_result != MM_SCAN_FAIL;
}
+static uint32_t
+dvb_priv_lookup(mpegts_table_t *mt, const uint8_t *lptr, int llen)
+{
+ uint32_t priv = 0;
+ uint8_t dtag;
+ int dllen, dlen;
+ const uint8_t *dlptr, *dptr;
+
+ DVB_DESC_FOREACH(mt, lptr, llen, 4, dlptr, dllen, dtag, dlen, dptr) {
+ if (dtag == DVB_DESC_PRIVATE_DATA) {
+ if (dlen == 4) {
+ priv = extract_4byte(dptr);
+ if (priv)
+ break;
+ }
+ }
+ }}
+dvberr:
+ return priv;
+}
+
static void
dvb_bouquet_comment ( bouquet_t *bq, mpegts_mux_t *mm )
{
{
int save = 0, retry = 0;
int r, sect, last, ver;
- uint32_t priv = 0;
+ uint32_t priv = 0, priv2 = 0;
uint8_t dtag;
int llen, dlen;
const uint8_t *lptr, *dptr;
r = dvb_nit_mux(mt, mux, mm, onid, tsid, lptr, llen, tableid, bi, 0);
if (r < 0)
return r;
+ if (priv == 0 && priv2)
+ priv = priv2;
}
if (mm == mux && mux->mm_onid == 0xffff && mux->mm_tsid == tsid)
retry = 1; /* keep rolling - perhaps SDT was not parsed yet */
}
+
+ if (priv == 0) {
+ priv2 = dvb_priv_lookup(mt, lptr, llen);
+ if (priv2) {
+ tvhtrace(mt->mt_subsys, "%s: using private2 data 0x%08x", mt->mt_name, priv2);
+ priv = priv2;
+ }
+ }
lptr += r;
llen -= r;