From 6a6d3f65e45c2151f25931d5f6d313842ead7d55 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Sun, 29 Jun 2014 16:24:04 +0200 Subject: [PATCH] epggrab: ota - move service lists from ota to map - also use service filter for uk_freesat / viasat_baltic --- src/epggrab.h | 10 ++-- src/epggrab/module/eit.c | 32 +++++----- src/epggrab/module/opentv.c | 12 ++-- src/epggrab/otamux.c | 116 ++++++++++++++++++++---------------- src/epggrab/private.h | 13 ++-- 5 files changed, 98 insertions(+), 85 deletions(-) diff --git a/src/epggrab.h b/src/epggrab.h index 1555520f..64776668 100644 --- a/src/epggrab.h +++ b/src/epggrab.h @@ -202,12 +202,9 @@ struct epggrab_ota_mux int om_timeout; ///< User configurable int om_interval; time_t om_when; ///< Next event time - int om_first; - uint64_t om_tune_count; ///< Tune counter LIST_ENTRY(epggrab_ota_mux) om_q_link; RB_ENTRY(epggrab_ota_mux) om_global_link; - RB_HEAD(,epggrab_ota_svc_link) om_svcs; ///< Muxes we carry data for }; /* @@ -220,6 +217,9 @@ struct epggrab_ota_map int om_timeout; int om_interval; int om_complete; + int om_first; + uint64_t om_tune_count; + RB_HEAD(,epggrab_ota_svc_link) om_svcs; ///< Muxes we carry data for }; /* @@ -232,9 +232,9 @@ struct epggrab_module_ota //TAILQ_HEAD(, epggrab_ota_mux) muxes; ///< List of related muxes /* Transponder tuning */ - void (*start) ( epggrab_module_ota_t *m, struct mpegts_mux *mm ); + void (*start) ( epggrab_ota_map_t *map, struct mpegts_mux *mm ); void (*done) ( epggrab_module_ota_t *m ); - int (*tune) ( epggrab_module_ota_t *m, epggrab_ota_mux_t *om, + int (*tune) ( epggrab_ota_map_t *map, epggrab_ota_mux_t *om, struct mpegts_mux *mm ); }; diff --git a/src/epggrab/module/eit.c b/src/epggrab/module/eit.c index 778aa05a..fcc86fe7 100644 --- a/src/epggrab/module/eit.c +++ b/src/epggrab/module/eit.c @@ -555,7 +555,8 @@ _eit_callback uint32_t extraid; mpegts_service_t *svc; mpegts_mux_t *mm = mt->mt_mux; - epggrab_module_t *mod = mt->mt_opaque; + epggrab_ota_map_t *map = mt->mt_opaque; + epggrab_module_t *mod = (epggrab_module_t *)map->om_module; epggrab_ota_mux_t *ota = NULL; mpegts_table_state_t *st; @@ -573,7 +574,7 @@ _eit_callback /* Register interest */ if (tableid >= 0x50) - ota = epggrab_ota_register((epggrab_module_ota_t*)mod, mm); + ota = epggrab_ota_register((epggrab_module_ota_t*)mod, NULL, mm); /* Begin */ r = dvb_table_begin(mt, ptr, len, tableid, extraid, 11, &st, §, &last, &ver); @@ -607,9 +608,9 @@ _eit_callback if(!mm) goto done; - if (ota && ota->om_first) { - ota->om_tune_count++; - ota->om_first = 0; + if (map->om_first) { + map->om_tune_count++; + map->om_first = 0; } /* Get service */ @@ -619,7 +620,7 @@ _eit_callback /* Register this */ if (ota) - epggrab_ota_service_add(ota, idnode_uuid_as_str(&svc->s_id), 1); + epggrab_ota_service_add(map, ota, idnode_uuid_as_str(&svc->s_id), 1); /* No point processing */ if (!LIST_FIRST(&svc->s_channels)) @@ -655,8 +656,9 @@ done: * ***********************************************************************/ static void _eit_start - ( epggrab_module_ota_t *m, mpegts_mux_t *dm ) + ( epggrab_ota_map_t *map, mpegts_mux_t *dm ) { + epggrab_module_ota_t *m = map->om_module; int pid, opts = 0; /* Disabled */ @@ -683,15 +685,16 @@ static void _eit_start pid = 0x12; opts = MT_RECORD; } - mpegts_table_add(dm, 0, 0, _eit_callback, m, m->id, MT_CRC | opts, pid); + mpegts_table_add(dm, 0, 0, _eit_callback, map, m->id, MT_CRC | opts, pid); // TODO: might want to limit recording to EITpf only tvhlog(LOG_DEBUG, m->id, "installed table handlers"); } static int _eit_tune - ( epggrab_module_ota_t *m, epggrab_ota_mux_t *om, mpegts_mux_t *mm ) + ( epggrab_ota_map_t *map, epggrab_ota_mux_t *om, mpegts_mux_t *mm ) { int r = 0; + epggrab_module_ota_t *m = map->om_module; mpegts_service_t *s; epggrab_ota_svc_link_t *osl, *nxt; @@ -704,20 +707,15 @@ static int _eit_tune if (!om->om_complete) return 1; - /* Non-standard (known to carry FULL network info) */ - if (!strcmp(m->id, "uk_freesat") || - !strcmp(m->id, "viasat_baltic")) - return 1; - /* Check if any services are mapped */ // TODO: using indirect ref's like this is inefficient, should // consider changeing it? - for (osl = RB_FIRST(&om->om_svcs); osl != NULL; osl = nxt) { + for (osl = RB_FIRST(&map->om_svcs); osl != NULL; osl = nxt) { nxt = RB_NEXT(osl, link); /* rule: if 5 mux scans fails for this service, remove it */ - if (osl->last_tune_count + 5 <= om->om_tune_count || + if (osl->last_tune_count + 5 <= map->om_tune_count || !(s = mpegts_service_find_by_uuid(osl->uuid))) { - epggrab_ota_service_del(om, osl, 1); + epggrab_ota_service_del(map, om, osl, 1); } else { if (LIST_FIRST(&s->s_channels)) r = 1; diff --git a/src/epggrab/module/opentv.c b/src/epggrab/module/opentv.c index a4f3b750..a83a4d81 100644 --- a/src/epggrab/module/opentv.c +++ b/src/epggrab/module/opentv.c @@ -504,7 +504,7 @@ opentv_bat_callback /* Register */ if (!ota) { sta->os_ota = ota - = epggrab_ota_register((epggrab_module_ota_t*)mod, mt->mt_mux); + = epggrab_ota_register((epggrab_module_ota_t*)mod, NULL, mt->mt_mux); } /* Complete */ @@ -539,10 +539,11 @@ opentv_bat_callback * ***********************************************************************/ static void _opentv_start - ( epggrab_module_ota_t *m, mpegts_mux_t *mm ) + ( epggrab_ota_map_t *map, mpegts_mux_t *mm ) { int *t; - opentv_module_t *mod = (opentv_module_t*)m; + opentv_module_t *mod = (opentv_module_t*)map->om_module; + epggrab_module_ota_t *m = map->om_module; opentv_status_t *sta = NULL; mpegts_table_t *mt; static struct mpegts_table_mux_cb bat_desc[] = { @@ -551,7 +552,7 @@ static void _opentv_start }; /* Ignore */ - if (!m->enabled) return; + if (!m->enabled) return; if (mod->tsid != mm->mm_tsid) return; /* Install tables */ @@ -693,8 +694,9 @@ static void _opentv_done( epggrab_module_ota_t *m ) } static int _opentv_tune - ( epggrab_module_ota_t *m, epggrab_ota_mux_t *om, mpegts_mux_t *mm ) + ( epggrab_ota_map_t *map, epggrab_ota_mux_t *om, mpegts_mux_t *mm ) { + epggrab_module_ota_t *m = map->om_module; opentv_module_t *mod = (opentv_module_t*)m; /* Ignore */ diff --git a/src/epggrab/otamux.c b/src/epggrab/otamux.c index 312997de..e1efc082 100644 --- a/src/epggrab/otamux.c +++ b/src/epggrab/otamux.c @@ -141,11 +141,11 @@ epggrab_ota_start ( epggrab_ota_mux_t *om, int grace ) epggrab_ota_map_t *map; om->om_when = dispatch_clock + epggrab_ota_timeout(om) + grace; om->om_active = 1; - om->om_first = 1; LIST_INSERT_SORTED(&epggrab_ota_active, om, om_q_link, om_time_cmp); if (LIST_FIRST(&epggrab_ota_active) == om) epggrab_ota_active_timer_cb(NULL); LIST_FOREACH(map, &om->om_modules, om_link) { + map->om_first = 1; map->om_complete = 0; tvhdebug(map->om_module->id, "grab started"); } @@ -158,22 +158,31 @@ epggrab_ota_start ( epggrab_ota_mux_t *om, int grace ) static void epggrab_mux_start ( mpegts_mux_t *mm, void *p ) { - epggrab_module_t *m; - epggrab_module_ota_t *om; - epggrab_ota_mux_t *ota; + epggrab_module_t *m; + epggrab_ota_map_t *map; + epggrab_ota_mux_t *ota, ota_skel; + const char *uuid = idnode_uuid_as_str(&mm->mm_id); /* Already started */ LIST_FOREACH(ota, &epggrab_ota_active, om_q_link) - if (!strcmp(ota->om_mux_uuid, idnode_uuid_as_str(&mm->mm_id))) + if (!strcmp(ota->om_mux_uuid, uuid)) return; - /* Check if already active */ + /* Find the configuration */ + ota_skel.om_mux_uuid = (char *)uuid; + ota = RB_FIND(&epggrab_ota_all, &ota_skel, om_global_link, om_id_cmp); + if (!ota) + return; + + /* Register all modules */ LIST_FOREACH(m, &epggrab_modules, link) { - if (m->type == EPGGRAB_OTA) { - om = (epggrab_module_ota_t*)m; - if (om->start) om->start(om, mm); - } + if (m->type == EPGGRAB_OTA && m->enabled) + epggrab_ota_register((epggrab_module_ota_t *)m, ota, mm); } + + /* Check if already active */ + LIST_FOREACH(map, &ota->om_modules, om_link) + map->om_module->start(map, mm); } static void @@ -190,34 +199,34 @@ epggrab_mux_stop ( mpegts_mux_t *mm, void *p ) epggrab_ota_mux_t * epggrab_ota_register - ( epggrab_module_ota_t *mod, mpegts_mux_t *mm ) + ( epggrab_module_ota_t *mod, epggrab_ota_mux_t *ota, mpegts_mux_t *mm ) { int save = 0; int interval = 3600; int timeout = 240; epggrab_ota_map_t *map; - epggrab_ota_mux_t *ota; - /* Find mux entry */ - const char *uuid = idnode_uuid_as_str(&mm->mm_id); - SKEL_ALLOC(epggrab_ota_mux_skel); - epggrab_ota_mux_skel->om_mux_uuid = (char*)uuid; + if (ota == NULL) { + /* Find mux entry */ + const char *uuid = idnode_uuid_as_str(&mm->mm_id); + SKEL_ALLOC(epggrab_ota_mux_skel); + epggrab_ota_mux_skel->om_mux_uuid = (char*)uuid; - ota = RB_INSERT_SORTED(&epggrab_ota_all, epggrab_ota_mux_skel, om_global_link, om_id_cmp); - if (!ota) { - char buf[256]; - mm->mm_display_name(mm, buf, sizeof(buf)); - tvhinfo(mod->id, "registering mux %s", buf); - ota = epggrab_ota_mux_skel; - SKEL_USED(epggrab_ota_mux_skel); - RB_INIT(&ota->om_svcs); - ota->om_mux_uuid = strdup(uuid); - ota->om_when = dispatch_clock + epggrab_ota_timeout(ota); - ota->om_active = 1; - LIST_INSERT_SORTED(&epggrab_ota_active, ota, om_q_link, om_time_cmp); - if (LIST_FIRST(&epggrab_ota_active) == ota) - epggrab_ota_active_timer_cb(NULL); - save = 1; + ota = RB_INSERT_SORTED(&epggrab_ota_all, epggrab_ota_mux_skel, om_global_link, om_id_cmp); + if (!ota) { + char buf[256]; + mm->mm_display_name(mm, buf, sizeof(buf)); + tvhinfo(mod->id, "registering mux %s", buf); + ota = epggrab_ota_mux_skel; + SKEL_USED(epggrab_ota_mux_skel); + ota->om_mux_uuid = strdup(uuid); + ota->om_when = dispatch_clock + epggrab_ota_timeout(ota); + ota->om_active = 1; + LIST_INSERT_SORTED(&epggrab_ota_active, ota, om_q_link, om_time_cmp); + if (LIST_FIRST(&epggrab_ota_active) == ota) + epggrab_ota_active_timer_cb(NULL); + save = 1; + } } /* Find module entry */ @@ -226,6 +235,7 @@ epggrab_ota_register break; if (!map) { map = calloc(1, sizeof(epggrab_ota_map_t)); + RB_INIT(&map->om_svcs); map->om_module = mod; map->om_timeout = timeout; map->om_interval = interval; @@ -332,7 +342,7 @@ next_one: /* Check we have modules attached and enabled */ LIST_FOREACH(map, &om->om_modules, om_link) { - if (map->om_module->tune(map->om_module, om, mm)) + if (map->om_module->tune(map, om, mm)) break; } if (!map) { @@ -368,7 +378,8 @@ done: } void -epggrab_ota_service_add ( epggrab_ota_mux_t *ota, const char *uuid, int save ) +epggrab_ota_service_add ( epggrab_ota_map_t *map, epggrab_ota_mux_t *ota, + const char *uuid, int save ) { epggrab_ota_svc_link_t *svcl; @@ -376,7 +387,7 @@ epggrab_ota_service_add ( epggrab_ota_mux_t *ota, const char *uuid, int save ) return; SKEL_ALLOC(epggrab_svc_link_skel); epggrab_svc_link_skel->uuid = (char *)uuid; - svcl = RB_INSERT_SORTED(&ota->om_svcs, epggrab_svc_link_skel, link, om_svcl_cmp); + svcl = RB_INSERT_SORTED(&map->om_svcs, epggrab_svc_link_skel, link, om_svcl_cmp); if (svcl == NULL) { svcl = epggrab_svc_link_skel; SKEL_USED(epggrab_svc_link_skel); @@ -384,16 +395,15 @@ epggrab_ota_service_add ( epggrab_ota_mux_t *ota, const char *uuid, int save ) if (save && ota->om_complete) epggrab_ota_save(ota); } - svcl->last_tune_count = ota->om_tune_count; } void -epggrab_ota_service_del ( epggrab_ota_mux_t *ota, epggrab_ota_svc_link_t *svcl, - int save ) +epggrab_ota_service_del ( epggrab_ota_map_t *map, epggrab_ota_mux_t *ota, + epggrab_ota_svc_link_t *svcl, int save ) { if (svcl == NULL) return; - RB_REMOVE(&ota->om_svcs, svcl, link); + RB_REMOVE(&map->om_svcs, svcl, link); free(svcl->uuid); free(svcl); if (save) @@ -409,22 +419,22 @@ epggrab_ota_save ( epggrab_ota_mux_t *ota ) { epggrab_ota_map_t *map; epggrab_ota_svc_link_t *svcl; - htsmsg_t *e, *l, *c = htsmsg_create_map(); + htsmsg_t *e, *l, *l2, *c = htsmsg_create_map(); htsmsg_add_u32(c, "complete", ota->om_complete); htsmsg_add_u32(c, "timeout", ota->om_timeout); htsmsg_add_u32(c, "interval", ota->om_interval); l = htsmsg_create_list(); - RB_FOREACH(svcl, &ota->om_svcs, link) - if (svcl->uuid) - htsmsg_add_str(l, NULL, svcl->uuid); - htsmsg_add_msg(c, "services", l); - l = htsmsg_create_list(); LIST_FOREACH(map, &ota->om_modules, om_link) { e = htsmsg_create_map(); htsmsg_add_str(e, "id", map->om_module->id); htsmsg_add_u32(e, "timeout", map->om_timeout); htsmsg_add_u32(e, "interval", map->om_interval); + l2 = htsmsg_create_list(); + RB_FOREACH(svcl, &map->om_svcs, link) + if (svcl->uuid) + htsmsg_add_str(l2, NULL, svcl->uuid); + htsmsg_add_msg(e, "services", l2); htsmsg_add_msg(l, NULL, e); } htsmsg_add_msg(c, "modules", l); @@ -436,8 +446,8 @@ static void epggrab_ota_load_one ( const char *uuid, htsmsg_t *c ) { - htsmsg_t *l, *e; - htsmsg_field_t *f; + htsmsg_t *l, *l2, *e; + htsmsg_field_t *f, *f2; mpegts_mux_t *mm; epggrab_module_ota_t *mod; epggrab_ota_mux_t *ota; @@ -451,14 +461,9 @@ epggrab_ota_load_one } ota = calloc(1, sizeof(epggrab_ota_mux_t)); - RB_INIT(&ota->om_svcs); ota->om_mux_uuid = strdup(uuid); ota->om_timeout = htsmsg_get_u32_or_default(c, "timeout", 0); ota->om_interval = htsmsg_get_u32_or_default(c, "interval", 0); - if ((l = htsmsg_get_list(c, "services")) != NULL) { - HTSMSG_FOREACH(f, l) - epggrab_ota_service_add(ota, htsmsg_field_get_str(f), 0); - } if (RB_INSERT_SORTED(&epggrab_ota_all, ota, om_global_link, om_id_cmp)) { free(ota->om_mux_uuid); free(ota); @@ -474,9 +479,14 @@ epggrab_ota_load_one continue; map = calloc(1, sizeof(epggrab_ota_map_t)); + RB_INIT(&map->om_svcs); map->om_module = mod; map->om_timeout = htsmsg_get_u32_or_default(e, "timeout", 0); map->om_interval = htsmsg_get_u32_or_default(e, "interval", 0); + if ((l2 = htsmsg_get_list(e, "services")) != NULL) { + HTSMSG_FOREACH(f2, l2) + epggrab_ota_service_add(map, ota, htsmsg_field_get_str(f2), 0); + } LIST_INSERT_HEAD(&ota->om_modules, map, om_link); } } @@ -526,10 +536,10 @@ epggrab_ota_free ( epggrab_ota_mux_t *ota ) LIST_REMOVE(ota, om_q_link); while ((map = LIST_FIRST(&ota->om_modules)) != NULL) { LIST_REMOVE(map, om_link); + while ((svcl = RB_FIRST(&map->om_svcs)) != NULL) + epggrab_ota_service_del(map, ota, svcl, 0); free(map); } - while ((svcl = RB_FIRST(&ota->om_svcs)) != NULL) - epggrab_ota_service_del(ota, svcl, 0); free(ota->om_mux_uuid); free(ota); } diff --git a/src/epggrab/private.h b/src/epggrab/private.h index 90ed628d..73ede82f 100644 --- a/src/epggrab/private.h +++ b/src/epggrab/private.h @@ -86,10 +86,10 @@ epggrab_module_ext_t *epggrab_module_ext_create * *************************************************************************/ typedef struct epggrab_ota_module_ops { - void (*start) (epggrab_module_ota_t *m, struct mpegts_mux *mm); + void (*start) (epggrab_ota_map_t *map, struct mpegts_mux *mm); int (*enable) (void *m, uint8_t e ); void (*done) (epggrab_module_ota_t*m); - int (*tune) (epggrab_module_ota_t *m, epggrab_ota_mux_t *om, + int (*tune) (epggrab_ota_map_t *map, epggrab_ota_mux_t *om, struct mpegts_mux *mm); } epggrab_ota_module_ops_t; @@ -136,7 +136,8 @@ void epggrab_ota_destroy_by_dm ( struct dvb_mux *dm ); */ epggrab_ota_mux_t *epggrab_ota_register - ( epggrab_module_ota_t *mod, struct mpegts_mux *mux ); + ( epggrab_module_ota_t *mod, epggrab_ota_mux_t *ota, + struct mpegts_mux *mux ); /* * State change @@ -149,10 +150,12 @@ void epggrab_ota_complete */ void epggrab_ota_service_add - ( epggrab_ota_mux_t *ota, const char *uuid, int save ); + ( epggrab_ota_map_t *map, epggrab_ota_mux_t *ota, + const char *uuid, int save ); void epggrab_ota_service_del - ( epggrab_ota_mux_t *ota, epggrab_ota_svc_link_t *svcl, int save ); + ( epggrab_ota_map_t *map, epggrab_ota_mux_t *ota, + epggrab_ota_svc_link_t *svcl, int save ); /* ************************************************************************** * Miscellaneous