From 79c443206c1ad54f843e1be8976e9dda89e12d6e Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Mon, 21 Mar 2016 14:07:22 +0100 Subject: [PATCH] epggrab: ota - sort muxes to improve scan algorithm --- src/epggrab/otamux.c | 14 ++++++++++++-- src/input/mpegts.h | 2 ++ src/input/mpegts/mpegts_mux.c | 25 +++++++++++++++++++++++++ src/input/mpegts/mpegts_network_scan.c | 19 ++----------------- 4 files changed, 41 insertions(+), 19 deletions(-) diff --git a/src/epggrab/otamux.c b/src/epggrab/otamux.c index 0d4d33dc0..d9f3cc23c 100644 --- a/src/epggrab/otamux.c +++ b/src/epggrab/otamux.c @@ -81,6 +81,16 @@ om_id_cmp ( epggrab_ota_mux_t *a, epggrab_ota_mux_t *b ) return strcmp(a->om_mux_uuid, b->om_mux_uuid); } +static int +om_mux_cmp ( epggrab_ota_mux_t *a, epggrab_ota_mux_t *b ) +{ + mpegts_mux_t *a1 = mpegts_mux_find(a->om_mux_uuid); + mpegts_mux_t *b1 = mpegts_mux_find(b->om_mux_uuid); + assert(a1); + assert(b1); + return mpegts_mux_compare(a1, b1); +} + static int om_svcl_cmp ( epggrab_ota_svc_link_t *a, epggrab_ota_svc_link_t *b ) { @@ -107,7 +117,7 @@ epggrab_ota_queue_one( epggrab_ota_mux_t *om ) om->om_requeue = 1; if (om->om_q_type != EPGGRAB_OTA_MUX_IDLE) return 0; - TAILQ_INSERT_TAIL(&epggrab_ota_pending, om, om_q_link); + TAILQ_INSERT_SORTED(&epggrab_ota_pending, om, om_q_link, om_mux_cmp); om->om_q_type = EPGGRAB_OTA_MUX_PENDING; return 1; } @@ -346,7 +356,7 @@ epggrab_ota_register ota = epggrab_ota_mux_skel; SKEL_USED(epggrab_ota_mux_skel); ota->om_mux_uuid = strdup(uuid); - TAILQ_INSERT_TAIL(&epggrab_ota_pending, ota, om_q_link); + TAILQ_INSERT_SORTED(&epggrab_ota_pending, ota, om_q_link, om_mux_cmp); ota->om_q_type = EPGGRAB_OTA_MUX_PENDING; if (TAILQ_FIRST(&epggrab_ota_pending) == ota) epggrab_ota_kick(1); diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 0642d0b45..0e37a2386 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -917,6 +917,8 @@ mpegts_mux_find_pid(mpegts_mux_t *mm, int pid, int create) void mpegts_mux_update_pids ( mpegts_mux_t *mm ); +int mpegts_mux_compare ( mpegts_mux_t *a, mpegts_mux_t *b ); + void mpegts_input_recv_packets (mpegts_input_t *mi, mpegts_mux_instance_t *mmi, sbuf_t *sb, int flags, mpegts_pcr_t *pcr); diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index c4ff822a2..b1a364643 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -1403,6 +1403,31 @@ mpegts_mux_find_pid_ ( mpegts_mux_t *mm, int pid, int create ) return mp; } +/* ************************************************************************** + * Misc + * *************************************************************************/ + +int +mpegts_mux_compare ( mpegts_mux_t *a, mpegts_mux_t *b ) +{ + int r = uuid_cmp(&a->mm_network->mn_id.in_uuid, + &b->mm_network->mn_id.in_uuid); + if (r) + return r; + if (idnode_is_instance(&a->mm_id, &dvb_mux_dvbs_class) && + idnode_is_instance(&b->mm_id, &dvb_mux_dvbs_class)) { + dvb_mux_conf_t *mc1 = &((dvb_mux_t *)a)->lm_tuning; + dvb_mux_conf_t *mc2 = &((dvb_mux_t *)b)->lm_tuning; + assert(mc1->dmc_fe_type == DVB_TYPE_S); + assert(mc2->dmc_fe_type == DVB_TYPE_S); + r = (int)mc1->u.dmc_fe_qpsk.polarisation - + (int)mc2->u.dmc_fe_qpsk.polarisation; + if (r == 0) + r = mc1->dmc_fe_freq - mc2->dmc_fe_freq; + } + return r; +} + /****************************************************************************** * Editor Configuration * diff --git a/src/input/mpegts/mpegts_network_scan.c b/src/input/mpegts/mpegts_network_scan.c index 45db6f358..870515b9a 100644 --- a/src/input/mpegts/mpegts_network_scan.c +++ b/src/input/mpegts/mpegts_network_scan.c @@ -35,23 +35,8 @@ static int mm_cmp ( mpegts_mux_t *a, mpegts_mux_t *b ) { int r = b->mm_scan_weight - a->mm_scan_weight; - if (r == 0) { - r = uuid_cmp(&a->mm_network->mn_id.in_uuid, - &b->mm_network->mn_id.in_uuid); - if (r) - return r; - if (idnode_is_instance(&a->mm_id, &dvb_mux_dvbs_class) && - idnode_is_instance(&b->mm_id, &dvb_mux_dvbs_class)) { - dvb_mux_conf_t *mc1 = &((dvb_mux_t *)a)->lm_tuning; - dvb_mux_conf_t *mc2 = &((dvb_mux_t *)b)->lm_tuning; - assert(mc1->dmc_fe_type == DVB_TYPE_S); - assert(mc2->dmc_fe_type == DVB_TYPE_S); - r = (int)mc1->u.dmc_fe_qpsk.polarisation - - (int)mc2->u.dmc_fe_qpsk.polarisation; - if (r == 0) - r = mc1->dmc_fe_freq - mc2->dmc_fe_freq; - } - } + if (r == 0) + return mpegts_mux_compare(a, b); return r; } -- 2.47.3