From: Jaroslav Kysela Date: Thu, 17 Mar 2016 12:39:53 +0000 (+0100) Subject: SAT>IP client: add all tuners mode (experimental) X-Git-Tag: v4.2.1~844 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=608bbe262e39b9a2b9758938e5662aa2a4fa3709;p=thirdparty%2Ftvheadend.git SAT>IP client: add all tuners mode (experimental) --- diff --git a/src/input/mpegts/satip/satip.c b/src/input/mpegts/satip/satip.c index f67ac9252..6a20a598f 100644 --- a/src/input/mpegts/satip/satip.c +++ b/src/input/mpegts/satip/satip.c @@ -331,6 +331,14 @@ const idclass_t satip_device_class = .opts = PO_EXPERT, .off = offsetof(satip_device_t, sd_skip_ts), }, + { + .type = PT_BOOL, + .id = "all_tuners", + .name = N_("All tuners (limited networks)"), + .desc = N_("Try to use all tuners for the limited networks mode."), + .opts = PO_EXPERT, + .off = offsetof(satip_device_t, sd_all_tuners), + }, { .type = PT_BOOL, .id = "disableworkarounds", diff --git a/src/input/mpegts/satip/satip_frontend.c b/src/input/mpegts/satip/satip_frontend.c index e0d5dd6d2..462145d8d 100644 --- a/src/input/mpegts/satip/satip_frontend.c +++ b/src/input/mpegts/satip/satip_frontend.c @@ -454,7 +454,7 @@ static int satip_frontend_match_satcfg ( satip_frontend_t *lfe2, mpegts_mux_t *mm2 ) { satip_frontend_t *lfe_master; - mpegts_mux_t *mm1; + mpegts_mux_t *mm1 = NULL; dvb_mux_conf_t *mc1, *mc2; int position, high1, high2; @@ -466,7 +466,7 @@ satip_frontend_match_satcfg ( satip_frontend_t *lfe2, mpegts_mux_t *mm2 ) lfe_master = satip_frontend_find_by_number(lfe2->sf_device, lfe2->sf_master) ?: lfe2; mm1 = lfe2->sf_req->sf_mmi->mmi_mux; - position = satip_satconf_get_position(lfe2, mm2, 0); + position = satip_satconf_get_position(lfe2, mm2, NULL, 0); if (position <= 0 || lfe_master->sf_position != position) return 0; mc1 = &((dvb_mux_t *)mm1)->lm_tuning; @@ -487,18 +487,31 @@ satip_frontend_is_enabled ( mpegts_input_t *mi, mpegts_mux_t *mm, int flags ) { satip_frontend_t *lfe = (satip_frontend_t*)mi; satip_frontend_t *lfe2; - int position; + int position, netlimit; lock_assert(&global_lock); if (!mpegts_input_is_enabled(mi, mm, flags)) return 0; if (lfe->sf_device->sd_dbus_allow <= 0) return 0; if (lfe->sf_type != DVB_TYPE_S) return 1; + /* try to reuse any input for limited networks if allowed */ + if (lfe->sf_device->sd_all_tuners) { + position = satip_satconf_get_position(lfe, mm, &netlimit, 0); + if (position <= 0) return 0; + if (netlimit <= 0) goto cont; + /* try to reuse any tuner input as slave */ + TAILQ_FOREACH(lfe2, &lfe->sf_device->sd_frontends, sf_link) { + if (lfe2 == lfe) continue; + if (satip_frontend_match_satcfg(lfe2, mm)) + return 1; + } + } /* check if the position is enabled */ - position = satip_satconf_get_position(lfe, mm, 1); + position = satip_satconf_get_position(lfe, mm, NULL, 1); if (position <= 0) return 0; /* check if any "blocking" tuner is running */ +cont: TAILQ_FOREACH(lfe2, &lfe->sf_device->sd_frontends, sf_link) { if (lfe2 == lfe) continue; if (lfe2->sf_type != DVB_TYPE_S) continue; @@ -555,7 +568,7 @@ satip_frontend_start_mux char buf1[256], buf2[256]; if (lfe->sf_positions > 0) { - lfe->sf_position = satip_satconf_get_position(lfe, mmi->mmi_mux, 1); + lfe->sf_position = satip_satconf_get_position(lfe, mmi->mmi_mux, NULL, 0); if (lfe->sf_position <= 0) return SM_CODE_TUNING_FAILED; } diff --git a/src/input/mpegts/satip/satip_private.h b/src/input/mpegts/satip/satip_private.h index 0db9a4a0f..59a6d1c62 100644 --- a/src/input/mpegts/satip/satip_private.h +++ b/src/input/mpegts/satip/satip_private.h @@ -95,6 +95,7 @@ struct satip_device int sd_can_weight; int sd_dbus_allow; int sd_skip_ts; + int sd_all_tuners; int sd_disable_workarounds; pthread_mutex_t sd_tune_mutex; }; @@ -235,7 +236,7 @@ int satip_satconf_get_grace ( satip_frontend_t *lfe, mpegts_mux_t *mm ); int satip_satconf_get_position - ( satip_frontend_t *lfe, mpegts_mux_t *mm, int check ); + ( satip_frontend_t *lfe, mpegts_mux_t *mm, int *netlimit, int check ); /* * RTSP part diff --git a/src/input/mpegts/satip/satip_satconf.c b/src/input/mpegts/satip/satip_satconf.c index fc046c3c5..7fd96c9f6 100644 --- a/src/input/mpegts/satip/satip_satconf.c +++ b/src/input/mpegts/satip/satip_satconf.c @@ -76,7 +76,7 @@ satip_satconf_check_network_limit count = 0; TAILQ_FOREACH(lfe2, &lfe->sf_device->sd_frontends, sf_link) TAILQ_FOREACH(sfc2, &lfe2->sf_satconf, sfc_link) - if (idnode_set_exists(sfc->sfc_networks, mn)) + if (idnode_set_exists(sfc->sfc_networks, mn) && lfe2->sf_running) count++; return count <= sfc->sfc_network_limit; @@ -84,15 +84,20 @@ satip_satconf_check_network_limit int satip_satconf_get_position - ( satip_frontend_t *lfe, mpegts_mux_t *mm, int check ) + ( satip_frontend_t *lfe, mpegts_mux_t *mm, int *netlimit, int check ) { satip_satconf_t *sfc; sfc = satip_satconf_find_ele(lfe, mm); if (sfc && sfc->sfc_enabled) { + if (netlimit) + *netlimit = sfc->sfc_network_limit; if (!check || sfc->sfc_network_limit <= 0) return sfc->sfc_position; if (satip_satconf_check_network_limit(lfe, sfc, &mm->mm_network->mn_id)) return sfc->sfc_position; + } else { + if (netlimit) + *netlimit = 0; } return 0; }