]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
epggrab: ota - sort muxes to improve scan algorithm
authorJaroslav Kysela <perex@perex.cz>
Mon, 21 Mar 2016 13:07:22 +0000 (14:07 +0100)
committerJaroslav Kysela <perex@perex.cz>
Mon, 21 Mar 2016 13:07:22 +0000 (14:07 +0100)
src/epggrab/otamux.c
src/input/mpegts.h
src/input/mpegts/mpegts_mux.c
src/input/mpegts/mpegts_network_scan.c

index 0d4d33dc0430162c8730582170c9eb17e0c7fe7e..d9f3cc23c559394cfba47703b2bfbfb0bedf1474 100644 (file)
@@ -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);
index 0642d0b45a1d2075f5646f6a23a9f70c0e3a7af8..0e37a2386498b72a953d866fd028a08ba63e4df6 100644 (file)
@@ -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);
index c4ff822a2476e3e95c75535f9e377e0d54b6c108..b1a36464307ddac6d39da55a58a77b6a03f435f3 100644 (file)
@@ -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
  *
index 45db6f358b21c45a9de7a9edf4ca6e0733b047b5..870515b9a718b8bb7d078f49d6cf10f95cc7f120 100644 (file)
@@ -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;
 }