From: Jaroslav Kysela Date: Sun, 11 Oct 2015 15:30:16 +0000 (+0200) Subject: mpegts dvb network: ignore roll-off only changes (do not save mux) X-Git-Tag: v4.2.1~1944 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=cb78b6f9eca8e99de2df4bc64a2caf743c1fce8e;p=thirdparty%2Ftvheadend.git mpegts dvb network: ignore roll-off only changes (do not save mux) 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. --- diff --git a/src/input/mpegts/mpegts_network_dvb.c b/src/input/mpegts/mpegts_network_dvb.c index 47007c318..8cd4e3f62 100644 --- a/src/input/mpegts/mpegts_network_dvb.c +++ b/src/input/mpegts/mpegts_network_dvb.c @@ -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: