]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts dvb network: ignore roll-off only changes (do not save mux)
authorJaroslav Kysela <perex@perex.cz>
Sun, 11 Oct 2015 15:30:16 +0000 (17:30 +0200)
committerJaroslav Kysela <perex@perex.cz>
Sun, 11 Oct 2015 15:31:18 +0000 (17:31 +0200)
It seems that rolloff is inconsistent in many network and the (all?)
modernDVB-S2 demodulators can detect the right value themselves. So,
ignore rolloff only changes for now, but make code more robust for
further detections/workarounds using a bit list.

src/input/mpegts/mpegts_network_dvb.c

index 47007c3187653462a35e3e05fb07d67b707217fc..8cd4e3f62d462d34afecc5a1f93db5471a9c35de 100644 (file)
@@ -413,6 +413,25 @@ dvb_network_mux_class
   return NULL;
 }
 
+#define CBIT_ORBITAL_POS        (1<<0)
+#define CBIT_POLARISATION       (1<<1)
+#define CBIT_FREQ               (1<<2)
+#define CBIT_RATE               (1<<3)
+#define CBIT_RATE_HP            (1<<4)
+#define CBIT_RATE_LP            (1<<5)
+#define CBIT_MODULATION         (1<<6)
+#define CBIT_INVERSION          (1<<7)
+#define CBIT_ROLLOFF            (1<<8)
+#define CBIT_PILOT              (1<<9)
+#define CBIT_STREAM_ID          (1<<10)
+#define CBIT_BANDWIDTH          (1<<11)
+#define CBIT_TRANS_MODE         (1<<12)
+#define CBIT_GUARD              (1<<13)
+#define CBIT_HIERARCHY          (1<<14)
+#define CBIT_PLS_MODE           (1<<15)
+#define CBIT_PLS_CODE           (1<<16)
+#define CBIT_FEC_INNER          (1<<17)
+
 static mpegts_mux_t *
 dvb_network_create_mux
   ( mpegts_network_t *mn, void *origin, uint16_t onid, uint16_t tsid,
@@ -469,20 +488,20 @@ dvb_network_create_mux
     /* accept information only from one origin mux */
     if (mm->mm_dmc_origin_expire > dispatch_clock && mm->mm_dmc_origin && mm->mm_dmc_origin != origin)
       goto noop;
-    #define COMPARE(x) ({ \
+    #define COMPARE(x, cbit) ({ \
       int xr = dmc->x != lm->lm_tuning.x; \
       if (xr) { \
         tvhtrace("mpegts", "create mux dmc->" #x " (%li) != lm->lm_tuning." #x \
                  " (%li)", (long)dmc->x, (long)lm->lm_tuning.x); \
         lm->lm_tuning.x = dmc->x; \
-      } xr; })
-    #define COMPAREN(x) ({ \
+      } xr ? cbit : 0; })
+    #define COMPAREN(x, cbit) ({ \
       int xr = dmc->x != 0 && dmc->x != 1 && dmc->x != lm->lm_tuning.x; \
       if (xr) { \
         tvhtrace("mpegts", "create mux dmc->" #x " (%li) != lm->lm_tuning." #x \
                  " (%li)", (long)dmc->x, (long)lm->lm_tuning.x); \
         lm->lm_tuning.x = dmc->x; \
-      } xr; })
+      } xr ? cbit : 0; })
     dvb_mux_conf_t tuning_old;
     char buf[128];
     tuning_old = lm->lm_tuning;
@@ -491,7 +510,7 @@ dvb_network_create_mux
       if (lm->lm_tuning.u.dmc_fe_qpsk.orbital_pos == INT_MAX ||
           dvb_network_check_orbital_pos(lm->lm_tuning.u.dmc_fe_qpsk.orbital_pos,
                                         dmc->u.dmc_fe_qpsk.orbital_pos))
-        save |= COMPARE(u.dmc_fe_qpsk.orbital_pos);
+        save |= COMPARE(u.dmc_fe_qpsk.orbital_pos, CBIT_ORBITAL_POS);
     }
     /* Do not change anything else without autodiscovery flag */
     if (!ln->mn_autodiscovery)
@@ -499,46 +518,48 @@ dvb_network_create_mux
     /* Handle big diffs that have been allowed through for DVB-S */
     if (deltaU32(dmc->dmc_fe_freq, lm->lm_tuning.dmc_fe_freq) > 4000) {
       lm->lm_tuning.dmc_fe_freq = dmc->dmc_fe_freq;
-      save = 1;
+      save |= CBIT_FREQ;
     }
-    save |= COMPAREN(dmc_fe_modulation);
-    save |= COMPAREN(dmc_fe_inversion);
-    save |= COMPAREN(dmc_fe_rolloff);
-    save |= COMPAREN(dmc_fe_pilot);
+    save |= COMPAREN(dmc_fe_modulation, CBIT_MODULATION);
+    save |= COMPAREN(dmc_fe_inversion, CBIT_INVERSION);
+    save |= COMPAREN(dmc_fe_rolloff, CBIT_ROLLOFF);
+    save |= COMPAREN(dmc_fe_pilot, CBIT_PILOT);
     switch (dmc->dmc_fe_type) {
     case DVB_TYPE_T:
-      save |= COMPARE(dmc_fe_stream_id);
-      save |= COMPAREN(u.dmc_fe_ofdm.bandwidth);
-      save |= COMPAREN(u.dmc_fe_ofdm.code_rate_HP);
-      save |= COMPAREN(u.dmc_fe_ofdm.code_rate_LP);
-      save |= COMPAREN(u.dmc_fe_ofdm.transmission_mode);
-      save |= COMPAREN(u.dmc_fe_ofdm.guard_interval);
-      save |= COMPAREN(u.dmc_fe_ofdm.hierarchy_information);
+      save |= COMPARE(dmc_fe_stream_id, CBIT_STREAM_ID);
+      save |= COMPAREN(u.dmc_fe_ofdm.bandwidth, CBIT_BANDWIDTH);
+      save |= COMPAREN(u.dmc_fe_ofdm.code_rate_HP, CBIT_RATE_HP);
+      save |= COMPAREN(u.dmc_fe_ofdm.code_rate_LP, CBIT_RATE_LP);
+      save |= COMPAREN(u.dmc_fe_ofdm.transmission_mode, CBIT_TRANS_MODE);
+      save |= COMPAREN(u.dmc_fe_ofdm.guard_interval, CBIT_GUARD);
+      save |= COMPAREN(u.dmc_fe_ofdm.hierarchy_information, CBIT_HIERARCHY);
       break;
     case DVB_TYPE_S:
-      save |= COMPARE(u.dmc_fe_qpsk.polarisation);
-      save |= COMPARE(u.dmc_fe_qpsk.symbol_rate);
-      save |= COMPARE(dmc_fe_stream_id);
-      save |= COMPAREN(dmc_fe_pls_mode);
-      save |= COMPAREN(dmc_fe_pls_code);
-      save |= COMPAREN(u.dmc_fe_qpsk.fec_inner);
+      save |= COMPARE(u.dmc_fe_qpsk.polarisation, CBIT_POLARISATION);
+      save |= COMPARE(u.dmc_fe_qpsk.symbol_rate, CBIT_RATE);
+      save |= COMPARE(dmc_fe_stream_id, CBIT_STREAM_ID);
+      save |= COMPAREN(dmc_fe_pls_mode, CBIT_PLS_MODE);
+      save |= COMPAREN(dmc_fe_pls_code, CBIT_PLS_CODE);
+      save |= COMPAREN(u.dmc_fe_qpsk.fec_inner, CBIT_FEC_INNER);
       break;
     case DVB_TYPE_C:
-      save |= COMPARE(u.dmc_fe_qam.symbol_rate);
-      save |= COMPAREN(u.dmc_fe_qam.fec_inner);
+      save |= COMPARE(u.dmc_fe_qam.symbol_rate, CBIT_RATE);
+      save |= COMPAREN(u.dmc_fe_qam.fec_inner, CBIT_FEC_INNER);
       break;
     default:
       abort();
     }
     #undef COMPARE
     #undef COMPAREN
+    /* ignore rolloff only changes (don't save) */
+    save &= ~CBIT_ROLLOFF;
     if (save) {
       char muxname[128];
       mpegts_mux_nice_name((mpegts_mux_t *)mm, muxname, sizeof(muxname));
       dvb_mux_conf_str(&tuning_old, buf, sizeof(buf));
-      tvhwarn("mpegts", "mux %s changed from %s", muxname, buf);
+      tvhwarn("mpegts", "mux %s changed from %s (%08x)", muxname, buf, save);
       dvb_mux_conf_str(&lm->lm_tuning, buf, sizeof(buf));
-      tvhwarn("mpegts", "mux %s changed to   %s", muxname, buf);
+      tvhwarn("mpegts", "mux %s changed to   %s (%08x)", muxname, buf, save);
     }
   }
 save: