]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
SAT>IP server: fix the problem when one service is subscribed twice, issue #4957
authorJaroslav Kysela <perex@perex.cz>
Tue, 20 Feb 2018 17:35:10 +0000 (18:35 +0100)
committerJaroslav Kysela <perex@perex.cz>
Tue, 20 Feb 2018 17:35:10 +0000 (18:35 +0100)
src/idnode.h
src/input/mpegts.h
src/input/mpegts/mpegts_service.c
src/input/mpegts/tsdemux.c
src/satip/rtsp.c

index 506518852a29e01b15d1bdf8220356f46c9af829..92e7496200a0d929ac71e8ddf0122594b5127ae4 100644 (file)
@@ -318,6 +318,8 @@ int idnode_set_remove ( idnode_set_t *is, idnode_t *in );
 ssize_t idnode_set_find_index( idnode_set_t *is, idnode_t *in );
 static inline int idnode_set_exists ( idnode_set_t *is, idnode_t *in )
   { return idnode_set_find_index(is, in) >= 0; }
+static inline int idnode_set_empty ( idnode_set_t *is )
+  { return is->is_count == 0; }
 void idnode_set_sort ( idnode_set_t *is, idnode_sort_t *s );
 void idnode_set_sort_by_title ( idnode_set_t *is, const char *lang );
 htsmsg_t *idnode_set_as_htsmsg ( idnode_set_t *is );
index 9a481f8e57d4681da61d0d61491f4b1ccc406769..68261433f63627ea6e36b4594e184d02628a9456 100644 (file)
@@ -567,8 +567,7 @@ struct mpegts_service
 
   mpegts_apids_t             *s_pids;
   idnode_set_t                s_masters;
-  LIST_HEAD(, mpegts_service) s_slaves;
-  LIST_ENTRY(mpegts_service)  s_slaves_link;
+  idnode_set_t                s_slaves;
   mpegts_apids_t             *s_slaves_pids;
 
   /*
index de4a55232e48754e863c5335dbc58d4ca02a2309..a4afa495af71562d02d2f94ad47f9216e4d4bab2 100644 (file)
@@ -744,6 +744,7 @@ mpegts_service_delete ( service_t *t, int delconf )
     mms->s_unlink(mms, ms);
   }
   idnode_set_clear(&ms->s_masters);
+  idnode_set_clear(&ms->s_slaves);
 
   /* Remove PID lists */
   mpegts_pid_destroy(&ms->s_pids);
@@ -1056,10 +1057,10 @@ mpegts_service_link ( mpegts_service_t *master, mpegts_service_t *slave )
   pthread_mutex_lock(&slave->s_stream_mutex);
   pthread_mutex_lock(&master->s_stream_mutex);
   assert(!idnode_set_exists(&slave->s_masters, &master->s_id));
-  assert(LIST_SAFE_ENTRY(slave, s_slaves_link));
   idnode_set_alloc(&slave->s_masters, 16);
   idnode_set_add(&slave->s_masters, &master->s_id, NULL, NULL);
-  LIST_INSERT_HEAD(&master->s_slaves, slave, s_slaves_link);
+  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);
   pthread_mutex_unlock(&slave->s_stream_mutex);
@@ -1073,9 +1074,11 @@ mpegts_service_unlink ( mpegts_service_t *master, mpegts_service_t *slave )
   mpegts_service_update_slave_pids(slave, 1);
   pthread_mutex_lock(&master->s_stream_mutex);
   idnode_set_remove(&slave->s_masters, &master->s_id);
-  if (slave->s_masters.is_count == 0)
+  if (idnode_set_empty(&slave->s_masters))
     idnode_set_clear(&slave->s_masters);
-  LIST_SAFE_REMOVE(slave, s_slaves_link);
+  idnode_set_remove(&master->s_slaves, &slave->s_id);
+  if (idnode_set_empty(&master->s_slaves))
+    idnode_set_clear(&master->s_slaves);
   pthread_mutex_unlock(&master->s_stream_mutex);
   pthread_mutex_unlock(&slave->s_stream_mutex);
   return 0;
index 3b1ac1b02e87f5a9cd188610587bdc5bc4154f2e..36a9a9959a9a8dbb1b0ecbe3fd10062bebc4f0ee 100644 (file)
@@ -405,7 +405,7 @@ ts_recv_raw(mpegts_service_t *t, const uint8_t *tsb, int len)
 
   pthread_mutex_lock(&t->s_stream_mutex);
   service_set_streaming_status_flags((service_t*)t, TSS_MUX_PACKETS);
-  if (!LIST_EMPTY(&t->s_slaves)) {
+  if (!idnode_set_empty(&t->s_slaves)) {
     /* If PID is owned by a slave service, let parent service to
      * deliver this PID (decrambling)
      */
index 47627a53a07237d841e7a44d1c9af3b191ee9f29..50086d15668779464b9976a6df7d0baa72006877 100644 (file)
@@ -514,7 +514,7 @@ static void
 rtsp_manage_descramble(session_t *rs)
 {
   idnode_set_t *found;
-  mpegts_service_t *s, *snext, *master;
+  mpegts_service_t *s, *master;
   slave_subscription_t *sub;
   mpegts_apids_t pmt_pids;
   size_t si;
@@ -544,12 +544,14 @@ rtsp_manage_descramble(session_t *rs)
   }
 
   /* Remove already used or no-longer required services */
-  for (s = LIST_FIRST(&master->s_slaves); s; s = snext) {
-    snext = LIST_NEXT(s, s_slaves_link);
-    if (idnode_set_remove(found, &s->s_id))
+  for (si = 0; si < master->s_slaves.is_count; si++) {
+    s = (mpegts_service_t *)master->s_slaves.is_array[si];
+    if (idnode_set_remove(found, &s->s_id)) {
       used++;
-    else if (!idnode_set_exists(found, &s->s_id))
+    } else if (!idnode_set_exists(found, &s->s_id)) {
       rtsp_slave_remove(rs, master, s);
+      si--;
+    }
   }
 
   /* Add new ones */