From: Jaroslav Kysela Date: Sat, 24 Nov 2018 18:05:29 +0000 (+0100) Subject: pass muxer: add possibitity to continue streaming even if the service is changing... X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e6d3dbaa7d214b6e0c4cccb3b551dbfbd0e34080;p=thirdparty%2Ftvheadend.git pass muxer: add possibitity to continue streaming even if the service is changing, issue #5344 --- diff --git a/src/channels.c b/src/channels.c index 996d81250..57822ec02 100644 --- a/src/channels.c +++ b/src/channels.c @@ -2002,3 +2002,19 @@ channel_has_correct_service_filter(const channel_t *ch, int svf) } return 0; } + +int channel_multi_services_active(const channel_t *ch) +{ + const idnode_list_mapping_t *ilm; + const service_t *service; + int cnt = 0; + if (!ch) return 0; + LIST_FOREACH(ilm, &ch->ch_services, ilm_in2_link) { + service = (const service_t*)ilm->ilm_in1; + if (service->s_enabled) { + if (++cnt > 1) + return 1; + } + } + return 0; +} diff --git a/src/channels.h b/src/channels.h index 5d4bd79fb..97e8579d4 100644 --- a/src/channels.h +++ b/src/channels.h @@ -221,5 +221,6 @@ channel_t **channel_get_sorted_list_for_tag channel_tag_t **channel_tag_get_sorted_list ( const char *sort_type, int *_count ); int channel_has_correct_service_filter(const channel_t *ch, int svf); +int channel_multi_services_active(const channel_t *ch); #endif /* CHANNELS_H */ diff --git a/src/muxer.h b/src/muxer.h index 9801f9b78..d20af8bdd 100644 --- a/src/muxer.h +++ b/src/muxer.h @@ -24,6 +24,8 @@ #define MC_IS_EOS_ERROR(e) ((e) == EPIPE || (e) == ECONNRESET) +#define MC_CAP_ANOTHER_SERVICE (1<<0) /* I can stream another service (SID must match!) */ + typedef enum { MC_UNKNOWN = 0, MC_MATROSKA = 1, @@ -120,6 +122,7 @@ typedef struct muxer { int m_eos; /* End of stream */ int m_errors; /* Number of errors */ + int m_caps; /* Capabilities */ muxer_config_t m_config; /* general configuration */ muxer_hints_t *m_hints; /* other hints */ } muxer_t; diff --git a/src/muxer/muxer_pass.c b/src/muxer/muxer_pass.c index 32f127787..89e673c2b 100644 --- a/src/muxer/muxer_pass.c +++ b/src/muxer/muxer_pass.c @@ -800,5 +800,8 @@ pass_muxer_create(const muxer_config_t *m_cfg, dvb_table_parse_init(&pm->pm_eit, "pass-eit", LS_TBL_PASS, DVB_EIT_PID, 0, 0, pm); + if (pm->m_config.u.pass.m_rewrite_sid > 0) + pm->m_caps |= MC_CAP_ANOTHER_SERVICE; + return (muxer_t *)pm; } diff --git a/src/webui/webui.c b/src/webui/webui.c index f8769f99d..63eb0d17a 100644 --- a/src/webui/webui.c +++ b/src/webui/webui.c @@ -450,6 +450,9 @@ http_stream_run(http_connection_t *hc, profile_chain_t *prch, break; case SMT_STOP: + if((mux->m_caps & MC_CAP_ANOTHER_SERVICE) != 0 && + channel_multi_services_active(s->ths_channel)) + break; if(sm->sm_code != SM_CODE_SOURCE_RECONFIGURED) { tvhwarn(LS_WEBUI, "Stop streaming %s, %s", hc->hc_url_orig, streaming_code2txt(sm->sm_code));