]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
eit: another bunch of fixes, added back uk_freeview support
authorJaroslav Kysela <perex@perex.cz>
Tue, 6 Feb 2018 10:14:42 +0000 (11:14 +0100)
committerJaroslav Kysela <perex@perex.cz>
Tue, 6 Feb 2018 10:14:42 +0000 (11:14 +0100)
data/conf/epggrab/eit/config
src/epggrab/module/eit.c
src/htsmsg.c
src/input/mpegts/dvb_psi.c

index e4970076cee7c982d1fe6d6adbd8cead60c46050..5be540a9b7d8e6c23d34519a7814a36571b4005c 100644 (file)
@@ -22,8 +22,9 @@
       "eng": "UK: Freeview"
     },
     "nit": {
-      "FIXMEFIXME": 1
+      "": { "onid": 9018 }
     },
+    "priv": 9018,
     "prio": 5,
     "conv": "huffman"
   },
index be4420a4d0c515776b807c5b58faf8947c861de7..f5e3b09e62ff2f840dbe5fed5235a8d4973379c5 100644 (file)
@@ -46,7 +46,8 @@ typedef struct eit_nit {
 
 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;
@@ -90,6 +91,8 @@ typedef struct eit_module_t
   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
  * ***********************************************************************/
@@ -1187,7 +1190,7 @@ static int eit_nit_array_check(uint16_t val, uint16_t *array, int array_count)
 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;
@@ -1197,11 +1200,8 @@ void eit_nit_callback(mpegts_table_t *mt, uint16_t nbid, const char *name, uint3
   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)) {
@@ -1223,17 +1223,25 @@ void eit_nit_callback(mpegts_table_t *mt, uint16_t nbid, const char *name, uint3
     }
   }
 
-  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;
@@ -1338,13 +1346,9 @@ static void _eit_module_load_config(eit_module_t *mod)
     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);
@@ -1354,6 +1358,16 @@ void _eit_done ( void *m )
   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 )
 {
@@ -1462,7 +1476,7 @@ static void eit_init_one ( const char *id, htsmsg_t *conf )
   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);
@@ -1487,11 +1501,14 @@ static void eit_init_one ( const char *id, htsmsg_t *conf )
     }
   }
   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);
 }
@@ -1501,6 +1518,8 @@ void eit_init ( void )
   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");
index e29130a3674c5c2c04703e68493808dfdcfdf4da..52cd5ddd7ba1b1818803c6be388f5a3199eb1454 100644 (file)
@@ -126,7 +126,7 @@ htsmsg_field_add(htsmsg_t *msg, const char *name, int type, int flags, size_t es
   if(msg->hm_islist) {
     assert(name == NULL || *name == '\0');
   } else {
-    assert(name != NULL && *name);
+    assert(name != NULL);
   }
 
   if (name) {
index 85b5bf6f695dab7fa6f413c3795cdf41a790afcb..b818251fce663ac06bf809973777b6585b7cdf15 100644 (file)
@@ -148,6 +148,27 @@ mpegts_mux_alive(mpegts_mux_t *mm)
   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 )
 {
@@ -1423,7 +1444,7 @@ dvb_nit_callback
 {
   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;
@@ -1600,10 +1621,20 @@ dvb_nit_callback
         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;