From 89a5ca49143e365a6e0f904c215ae25a2502ba20 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Wed, 11 Feb 2015 14:25:44 +0100 Subject: [PATCH] dvb: mux discovery - add forced muxes also to another DVB-S networks, fixes #2674 --- src/input/mpegts/mpegts_network_dvb.c | 46 ++++++++++++++++----------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/src/input/mpegts/mpegts_network_dvb.c b/src/input/mpegts/mpegts_network_dvb.c index ff4b5db1..97974d26 100644 --- a/src/input/mpegts/mpegts_network_dvb.c +++ b/src/input/mpegts/mpegts_network_dvb.c @@ -318,13 +318,11 @@ dvb_network_check_symbol_rate( dvb_mux_t *lm, dvb_mux_conf_t *dmc, int deltar ) } static int -dvb_network_check_orbital_pos ( dvb_mux_t *lm, dvb_mux_conf_t *dmc ) +dvb_network_check_orbital_pos ( int satpos1, int satpos2 ) { - if (lm->lm_tuning.u.dmc_fe_qpsk.orbital_pos != INT_MAX && - dmc->u.dmc_fe_qpsk.orbital_pos != INT_MAX) { + if (satpos1 != INT_MAX && satpos2 != INT_MAX) { /* 1W and 0.8W */ - if (abs(lm->lm_tuning.u.dmc_fe_qpsk.orbital_pos - - dmc->u.dmc_fe_qpsk.orbital_pos) > 2) + if (abs(satpos1 - satpos2) > 2) return 1; } return 0; @@ -371,7 +369,8 @@ dvb_network_find_mux if (lm->lm_tuning.u.dmc_fe_qpsk.polarisation != dmc->u.dmc_fe_qpsk.polarisation) continue; /* Same orbital position */ - if (dvb_network_check_orbital_pos(lm, dmc)) continue; + if (dvb_network_check_orbital_pos(lm->lm_tuning.u.dmc_fe_qpsk.orbital_pos, + dmc->u.dmc_fe_qpsk.orbital_pos)) continue; } /* Same PLP/ISI */ @@ -424,29 +423,39 @@ static mpegts_mux_t * dvb_network_create_mux ( mpegts_mux_t *mm, uint16_t onid, uint16_t tsid, void *p, int force ) { - int save = 0; + int save = 0, satpos; mpegts_mux_t *mmo = mm; - dvb_network_t *ln = (dvb_network_t*)mm->mm_network; + mpegts_network_t *mn = mm->mm_network; + dvb_network_t *ln; dvb_mux_conf_t *dmc = p; + const idclass_t *cls = dvb_network_mux_class(mn); + /* when forced - try to look also to another DVB-S networks */ + if (force && cls == &dvb_mux_dvbs_class && dmc->dmc_fe_type == DVB_TYPE_S && + dmc->u.dmc_fe_qpsk.orbital_pos != INT_MAX) { + satpos = dvb_network_get_orbital_pos(mn); + if (dvb_network_check_orbital_pos(satpos, dmc->u.dmc_fe_qpsk.orbital_pos)) { + LIST_FOREACH(mn, &mpegts_network_all, mn_global_link) { + satpos = dvb_network_get_orbital_pos(mn); + if (satpos == INT_MAX) continue; + if (!dvb_network_check_orbital_pos(satpos, dmc->u.dmc_fe_qpsk.orbital_pos)) + break; + } + } + } + + ln = (dvb_network_t*)mn; mm = dvb_network_find_mux(ln, dmc, onid, tsid); if (!mm && (ln->mn_autodiscovery || force)) { - const idclass_t *cls; cls = dvb_network_mux_class((mpegts_network_t *)ln); save |= cls == &dvb_mux_dvbt_class && dmc->dmc_fe_type == DVB_TYPE_T; save |= cls == &dvb_mux_dvbc_class && dmc->dmc_fe_type == DVB_TYPE_C; 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) { - 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_pos != INT_MAX) - break; - } + satpos = dvb_network_get_orbital_pos(mn); /* do not allow to mix satellite positions */ - if (mm2 && dvb_network_check_orbital_pos(lm, dmc)) + if (dvb_network_check_orbital_pos(satpos, dmc->u.dmc_fe_qpsk.orbital_pos)) save = 0; } if (save) { @@ -498,7 +507,8 @@ dvb_network_create_mux /* Always save the orbital position */ if (dmc->dmc_fe_type == DVB_TYPE_S) { if (lm->lm_tuning.u.dmc_fe_qpsk.orbital_pos == INT_MAX || - dvb_network_check_orbital_pos(lm, dmc)) + 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); } /* Do not change anything else without autodiscovery flag */