From: Jaroslav Kysela Date: Thu, 4 May 2017 11:17:56 +0000 (+0200) Subject: IPTV: autonet - fix the service detection when SID is set, fixes #4347 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f156a38f6150353e4177b8b3691fedce5c7ec1aa;p=thirdparty%2Ftvheadend.git IPTV: autonet - fix the service detection when SID is set, fixes #4347 --- diff --git a/src/input/mpegts/iptv/iptv_mux.c b/src/input/mpegts/iptv/iptv_mux.c index 4e7794b6e..eadbe6133 100644 --- a/src/input/mpegts/iptv/iptv_mux.c +++ b/src/input/mpegts/iptv/iptv_mux.c @@ -370,6 +370,7 @@ iptv_mux_create0 ( iptv_network_t *in, const char *uuid, htsmsg_t *conf ) htsmsg_add_u32(conf, "sid", in->in_service_id); htsmsg_add_u32(conf, "dvb_servicetype", 1); /* SDTV */ ms = iptv_service_create0(im, 0, 0, NULL, conf); + ms->s_pmt_pid = SERVICE_PMT_AUTO; htsmsg_destroy(conf); if (ms) iptv_bouquet_trigger(in, 0); diff --git a/src/input/mpegts/mpegts_input.c b/src/input/mpegts/mpegts_input.c index b7f9cae3b..4c5e738aa 100644 --- a/src/input/mpegts/mpegts_input.c +++ b/src/input/mpegts/mpegts_input.c @@ -722,6 +722,9 @@ mpegts_input_open_service pthread_mutex_lock(&s->s_stream_mutex); if (s->s_type == STYPE_STD) { + if (s->s_pmt_pid == SERVICE_PMT_AUTO) + goto no_pids; + mpegts_input_open_pid(mi, mm, s->s_pmt_pid, MPS_SERVICE, MPS_WEIGHT_PMT, s, reopen); mpegts_input_open_pid(mi, mm, s->s_pcr_pid, MPS_SERVICE, MPS_WEIGHT_PCR, s, reopen); if (s->s_scrambled_pass) @@ -753,6 +756,7 @@ mpegts_input_open_service } } +no_pids: pthread_mutex_unlock(&s->s_stream_mutex); pthread_mutex_unlock(&mi->mi_output_lock); @@ -799,6 +803,9 @@ mpegts_input_close_service ( mpegts_input_t *mi, mpegts_service_t *s ) pthread_mutex_lock(&s->s_stream_mutex); if (s->s_type == STYPE_STD) { + if (s->s_pmt_pid == SERVICE_PMT_AUTO) + goto no_pids; + mpegts_input_close_pid(mi, mm, s->s_pmt_pid, MPS_SERVICE, MPS_WEIGHT_PMT, s); mpegts_input_close_pid(mi, mm, s->s_pcr_pid, MPS_SERVICE, MPS_WEIGHT_PCR, s); if (s->s_scrambled_pass) @@ -817,6 +824,7 @@ mpegts_input_close_service ( mpegts_input_t *mi, mpegts_service_t *s ) mpegts_input_close_pids(mi, mm, s, 1); } +no_pids: pthread_mutex_unlock(&s->s_stream_mutex); pthread_mutex_unlock(&mi->mi_output_lock); diff --git a/src/input/mpegts/mpegts_service.c b/src/input/mpegts/mpegts_service.c index d95b78faf..f4f9153b5 100644 --- a/src/input/mpegts/mpegts_service.c +++ b/src/input/mpegts/mpegts_service.c @@ -354,7 +354,8 @@ mpegts_service_enlist int flags, int weight ) { /* invalid PMT */ - if (t->s_pmt_pid <= 0 || t->s_pmt_pid >= 8191) + if (t->s_pmt_pid != SERVICE_PMT_AUTO && + (t->s_pmt_pid <= 0 || t->s_pmt_pid >= 8191)) return SM_CODE_INVALID_SERVICE; return mpegts_service_enlist_raw(t, ti, sil, flags, weight); @@ -986,6 +987,9 @@ mpegts_service_update_slave_pids ( mpegts_service_t *s, int del ) lock_assert(&s->s_stream_mutex); + if (s->s_pmt_pid == SERVICE_PMT_AUTO) + return; + pids = mpegts_pid_alloc(); mpegts_pid_add(pids, s->s_pmt_pid, MPS_WEIGHT_PMT); diff --git a/src/service.h b/src/service.h index 9290e570c..d85e49762 100644 --- a/src/service.h +++ b/src/service.h @@ -209,6 +209,8 @@ typedef struct service_lcn { #define SERVICE_AUTO_OFF 1 #define SERVICE_AUTO_PAT_MISSING 2 +#define SERVICE_PMT_AUTO 0xffff + /** * */