]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
dvb psi: change PMT monitor when PMT PID changes for SID, issue #4942
authorJaroslav Kysela <perex@perex.cz>
Thu, 18 Oct 2018 18:36:59 +0000 (20:36 +0200)
committerJaroslav Kysela <perex@perex.cz>
Thu, 18 Oct 2018 18:36:59 +0000 (20:36 +0200)
src/input/mpegts.h
src/input/mpegts/dvb_psi.c
src/input/mpegts/mpegts_input.c
src/input/mpegts/mpegts_service.c

index 9d29d56ca270db6e91a7472c77ff8ccd57cc4dd5..0372359646cde456387593b75ce75842df77c299 100644 (file)
@@ -1022,6 +1022,7 @@ elementary_stream_t *mpegts_input_open_service_pid
   ( mpegts_input_t *mi, mpegts_mux_t *mm, service_t *s,
     streaming_component_type_t stype, int pid, int weight, int create );
 
+void mpegts_input_open_pmt_monitor ( mpegts_mux_t *mm, mpegts_service_t *s );
 void mpegts_input_open_cat_monitor ( mpegts_mux_t *mm, mpegts_service_t *s );
 
 void tsdebug_encode_keys
index a90fc6fcb1acfba407b1b337b8a5cc51adc9f6c9..4dfffe26aeaec083a372a289c2d4ac0da560e329 100644 (file)
@@ -1017,7 +1017,8 @@ dvb_pat_callback
                          NULL, "pmt", LS_TBL_BASE,
                          MT_CRC | MT_QUICKREQ | MT_ONESHOT | MT_SCANSUBS,
                          pid, MPS_WEIGHT_PMT_SCAN);
-
+        if (save & 2) /* PMT PID change? */
+          mpegts_input_open_pmt_monitor(mm, s);
         if (save)
           service_request_save((service_t*)s);
       }
index ddfc5257fa1d6ac0acee87ff64c59fdf6e497b93..0bcc603dbf7ac149c504ade5e7e560aff3060de5 100644 (file)
@@ -809,10 +809,23 @@ fin:
   return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
 }
 
+void
+mpegts_input_open_pmt_monitor
+  ( mpegts_mux_t *mm, mpegts_service_t *s )
+{
+    if (s->s_pmt_mon)
+      mpegts_table_destroy(s->s_pmt_mon);
+    s->s_pmt_mon =
+      mpegts_table_add(mm, DVB_PMT_BASE, DVB_PMT_MASK,
+                       dvb_pmt_callback, s, "pmt", LS_TBL_BASE,
+                       MT_CRC, s->s_components.set_pmt_pid, MPS_WEIGHT_PMT);
+}
+
 void
 mpegts_input_open_cat_monitor
   ( mpegts_mux_t *mm, mpegts_service_t *s )
 {
+  assert(s->s_cat_mon == NULL);
   s->s_cat_mon =
     mpegts_table_add(mm, DVB_CAT_BASE, DVB_CAT_MASK,
                      mpegts_input_cat_pass_callback, s, "cat",
@@ -885,11 +898,8 @@ no_pids:
   pthread_mutex_unlock(&mi->mi_output_lock);
 
   /* Add PMT monitor */
-  if(s->s_type == STYPE_STD) {
-    s->s_pmt_mon =
-      mpegts_table_add(mm, DVB_PMT_BASE, DVB_PMT_MASK,
-                       dvb_pmt_callback, s, "pmt", LS_TBL_BASE,
-                       MT_CRC, s->s_components.set_pmt_pid, MPS_WEIGHT_PMT);
+  if (s->s_type == STYPE_STD) {
+    mpegts_input_open_pmt_monitor(mm, s);
     if (s->s_scrambled_pass && (flags & SUBSCRIPTION_EMM) != 0)
       mpegts_input_open_cat_monitor(mm, s);
   }
index b8da15ff712cb38973dc3b2c6d7cc6568e4e9a1e..a04686fda48a22b9114e2dcfd2dcb5bd45f8c6e7 100644 (file)
@@ -922,7 +922,7 @@ mpegts_service_find
     if (service_id16(s) == sid) {
       if (pmt_pid && pmt_pid != s->s_components.set_pmt_pid) {
         s->s_components.set_pmt_pid = pmt_pid;
-        if (save) *save = 1;
+        if (save) *save = 3;
       }
       if (create) {
         if ((save && *save) || s->s_dvb_last_seen + 3600 < gclk()) {