]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
SAT>IP server: second fix for the multiple subcribers to one service, issue #4957
authorJaroslav Kysela <perex@perex.cz>
Tue, 20 Feb 2018 19:53:17 +0000 (20:53 +0100)
committerJaroslav Kysela <perex@perex.cz>
Tue, 20 Feb 2018 19:53:17 +0000 (20:53 +0100)
src/input/mpegts.h
src/input/mpegts/mpegts_input.c
src/input/mpegts/mpegts_service.c

index 68261433f63627ea6e36b4594e184d02628a9456..d2fa41431f70a8ea6e338eebfbfb9fbfbb8b7d87 100644 (file)
@@ -1137,7 +1137,8 @@ mpegts_service_find_e2
 mpegts_service_t *
 mpegts_service_find_by_pid ( mpegts_mux_t *mm, int pid );
 
-void mpegts_service_update_slave_pids ( mpegts_service_t *t, int del );
+void mpegts_service_update_slave_pids
+  ( mpegts_service_t *t, mpegts_service_t *master_filter, int del );
 
 static inline mpegts_service_t *mpegts_service_find_by_uuid0(tvh_uuid_t *uuid)
   { return idnode_find0(uuid, &mpegts_service_class, NULL); }
index cb7df25b10564b7d3f683525a516465510382210..a7da2dd113cd13046ac32fa9e10c879d0db7521e 100644 (file)
@@ -820,7 +820,7 @@ mpegts_input_open_service
         mpegts_input_open_pid(mi, mm, st->es_pid, MPS_SERVICE, mpegts_mps_weight(st), s, reopen);
       }
 
-    mpegts_service_update_slave_pids(s, 0);
+    mpegts_service_update_slave_pids(s, NULL, 0);
 
   } else {
     if ((pids = s->s_pids) != NULL) {
@@ -899,7 +899,7 @@ mpegts_input_close_service ( mpegts_input_t *mi, mpegts_service_t *s )
       }
     }
 
-    mpegts_service_update_slave_pids(s, 1);
+    mpegts_service_update_slave_pids(s, NULL, 1);
 
   } else {
     mpegts_input_close_pids(mi, mm, s, 1);
index a4afa495af71562d02d2f94ad47f9216e4d4bab2..b43f9fb919b89c10834c74d46dbb8aac9a32bebd 100644 (file)
@@ -1014,7 +1014,8 @@ mpegts_service_raw_update_pids(mpegts_service_t *t, mpegts_apids_t *pids)
 }
 
 void
-mpegts_service_update_slave_pids ( mpegts_service_t *s, int del )
+mpegts_service_update_slave_pids
+  ( mpegts_service_t *s, mpegts_service_t *master, int del )
 {
   mpegts_service_t *s2;
   mpegts_apids_t *pids;
@@ -1040,6 +1041,7 @@ mpegts_service_update_slave_pids ( mpegts_service_t *s, int del )
 
   for (i = 0; i < s->s_masters.is_count; i++) {
     s2 = (mpegts_service_t *)s->s_masters.is_array[i];
+    if (master && master != s2) continue;
     pthread_mutex_lock(&s2->s_stream_mutex);
     if (!del)
       mpegts_pid_add_group(s2->s_slaves_pids, pids);
@@ -1062,7 +1064,7 @@ mpegts_service_link ( mpegts_service_t *master, mpegts_service_t *slave )
   idnode_set_alloc(&master->s_slaves, 16);
   idnode_set_add(&master->s_slaves, &slave->s_id, NULL, NULL);
   pthread_mutex_unlock(&master->s_stream_mutex);
-  mpegts_service_update_slave_pids(slave, 0);
+  mpegts_service_update_slave_pids(slave, master, 0);
   pthread_mutex_unlock(&slave->s_stream_mutex);
   return 0;
 }
@@ -1071,7 +1073,7 @@ static int
 mpegts_service_unlink ( mpegts_service_t *master, mpegts_service_t *slave )
 {
   pthread_mutex_lock(&slave->s_stream_mutex);
-  mpegts_service_update_slave_pids(slave, 1);
+  mpegts_service_update_slave_pids(slave, master, 1);
   pthread_mutex_lock(&master->s_stream_mutex);
   idnode_set_remove(&slave->s_masters, &master->s_id);
   if (idnode_set_empty(&slave->s_masters))