]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
dvb network: improve satellite position check for auto discovery
authorJaroslav Kysela <perex@perex.cz>
Wed, 14 May 2014 08:29:37 +0000 (10:29 +0200)
committerJaroslav Kysela <perex@perex.cz>
Wed, 14 May 2014 09:54:26 +0000 (11:54 +0200)
src/input/mpegts/mpegts_network_dvb.c

index 63209eef422d95df05e01222ceeb064d59db681f..f22563fe27600cf6481bf6ad6cc6870142613441 100644 (file)
@@ -211,26 +211,35 @@ const idclass_t dvb_network_atsc_class =
  * Class methods
  * ***************************************************************************/
 
+static int
+dvb_network_check_orbital_pos ( dvb_mux_t *lm, dvb_mux_conf_t *dmc )
+{
+  if (lm->lm_tuning.u.dmc_fe_qpsk.orbital_dir) {
+    if (lm->lm_tuning.u.dmc_fe_qpsk.orbital_dir !=
+                 dmc->u.dmc_fe_qpsk.orbital_dir)
+      return 1;
+    /* 1W and 0.8W */
+    if (abs(lm->lm_tuning.u.dmc_fe_qpsk.orbital_pos -
+                     dmc->u.dmc_fe_qpsk.orbital_pos) > 2)
+      return 1;
+  }
+  return 0;
+}
+
 static mpegts_mux_t *
 dvb_network_find_mux
   ( dvb_network_t *ln, dvb_mux_conf_t *dmc )
 {
   mpegts_mux_t *mm;
+
   LIST_FOREACH(mm, &ln->mn_muxes, mm_network_link) {
     dvb_mux_t *lm = (dvb_mux_t*)mm;
-    /* Note: Thor 0.8W
-         onid 1111 (4369) tsid 000B (11)
-           dvb-s  pos 8W freq 12090000 H sym 280000 fec 7/8 mod QPSK roff 35
-         onid 1111 (4369) tsid 0063 (99)
-           dvb-s  pos 8W freq 12092000 H sym 280000 fec 7/8 mod QPSK roff 35
-     */
-    if (abs(lm->lm_tuning.dmc_fe_freq - dmc->dmc_fe_freq) > 1999) continue;
+    if (abs(lm->lm_tuning.dmc_fe_freq - dmc->dmc_fe_freq) > 2000) continue;
     if (lm->lm_tuning.dmc_fe_modulation != dmc->dmc_fe_modulation) continue;
     if (lm->lm_tuning.dmc_fe_type == DVB_TYPE_S) {
       if (lm->lm_tuning.u.dmc_fe_qpsk.polarisation != dmc->u.dmc_fe_qpsk.polarisation) continue;
-      if (lm->lm_tuning.u.dmc_fe_qpsk.orbital_pos != dmc->u.dmc_fe_qpsk.orbital_pos) continue;
-      if (lm->lm_tuning.u.dmc_fe_qpsk.orbital_dir != dmc->u.dmc_fe_qpsk.orbital_dir) continue;
       if (lm->lm_tuning.u.dmc_fe_qpsk.symbol_rate != dmc->u.dmc_fe_qpsk.symbol_rate) continue;
+      if (dvb_network_check_orbital_pos(lm, dmc)) continue;
     }
     if (lm->lm_tuning.dmc_fe_type != dmc->dmc_fe_type) continue;
     break;
@@ -280,11 +289,15 @@ dvb_network_create_mux
     save |= cls == &dvb_mux_dvbs_class && dmc->dmc_fe_type == DVB_TYPE_S;
     save |= cls == &dvb_mux_atsc_class && dmc->dmc_fe_type == DVB_TYPE_ATSC;
     if (save && dmc->dmc_fe_type == DVB_TYPE_S) {
-      dvb_mux_t *lm = (dvb_mux_t *)LIST_FIRST(&ln->mn_muxes);
+      mpegts_mux_t *mm2;
+      dvb_mux_t *lm;
+      LIST_FOREACH(mm2, &ln->mn_muxes, mm_network_link) {
+       lm = (dvb_mux_t *)mm2;
+       if (lm->lm_tuning.u.dmc_fe_qpsk.orbital_dir)
+         break;
+      }
       /* do not allow to mix sattelite positions */
-      if (lm &&
-          (lm->lm_tuning.u.dmc_fe_qpsk.orbital_pos != dmc->u.dmc_fe_qpsk.orbital_pos ||
-           lm->lm_tuning.u.dmc_fe_qpsk.orbital_dir != dmc->u.dmc_fe_qpsk.orbital_dir))
+      if (mm2 && dvb_network_check_orbital_pos(lm, dmc))
         save = 0;
     }
     if (save)
@@ -332,7 +345,9 @@ dvb_network_create_mux
       break;
     case DVB_TYPE_S:
       save |= COMPARE(u.dmc_fe_qpsk.polarisation);
-      save |= COMPARE(u.dmc_fe_qpsk.orbital_pos);
+      if (lm->lm_tuning.u.dmc_fe_qpsk.orbital_dir == 0 ||
+          dvb_network_check_orbital_pos(lm, dmc))
+        save |= COMPARE(u.dmc_fe_qpsk.orbital_pos);
       save |= COMPARE(u.dmc_fe_qpsk.orbital_dir);
       save |= COMPARE(u.dmc_fe_qpsk.symbol_rate);
       save |= COMPAREN(u.dmc_fe_qpsk.fec_inner);