Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
perexg committed Oct 11, 2015
1 parent 1f7b660 commit cb78b6f
Showing 1 changed file with 48 additions and 27 deletions.
75 changes: 48 additions & 27 deletions src/input/mpegts/mpegts_network_dvb.c
Expand Up @@ -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,
Expand Down Expand Up @@ -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;
Expand All @@ -491,54 +510,56 @@ 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)
goto save;
/* 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:
Expand Down

0 comments on commit cb78b6f

Please sign in to comment.