]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
IPTV: autonet - fix the service detection when SID is set, fixes #4347
authorJaroslav Kysela <perex@perex.cz>
Thu, 4 May 2017 11:17:56 +0000 (13:17 +0200)
committerJaroslav Kysela <perex@perex.cz>
Thu, 4 May 2017 11:17:56 +0000 (13:17 +0200)
src/input/mpegts/iptv/iptv_mux.c
src/input/mpegts/mpegts_input.c
src/input/mpegts/mpegts_service.c
src/service.h

index 4e7794b6e91613b451146f491662cd34a0a058ac..eadbe613325d8958d43b5b5a59d501bf617df93d 100644 (file)
@@ -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);
index b7f9cae3b268aa4ead2396d1a73572821d21d942..4c5e738aa25639ec85ea2a257268676b62f158f0 100644 (file)
@@ -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);
 
index d95b78faf2ef49f143c550391ff3c91b1d276d26..f4f9153b5547e1c558ffddf760d7c1234cdb0a5a 100644 (file)
@@ -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);
index 9290e570c40587a1feef79d56b76fc7dc8ac1df9..d85e49762f4eee2c55642e166119933ee4a748bd 100644 (file)
@@ -209,6 +209,8 @@ typedef struct service_lcn {
 #define SERVICE_AUTO_OFF          1
 #define SERVICE_AUTO_PAT_MISSING  2
 
+#define SERVICE_PMT_AUTO         0xffff
+
 /**
  *
  */