From 405c612c10c3768948c12751424ea273ba61d820 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Tue, 20 Feb 2018 18:35:10 +0100 Subject: [PATCH] SAT>IP server: fix the problem when one service is subscribed twice, issue #4957 --- src/idnode.h | 2 ++ src/input/mpegts.h | 3 +-- src/input/mpegts/mpegts_service.c | 11 +++++++---- src/input/mpegts/tsdemux.c | 2 +- src/satip/rtsp.c | 12 +++++++----- 5 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/idnode.h b/src/idnode.h index 506518852..92e749620 100644 --- a/src/idnode.h +++ b/src/idnode.h @@ -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 ); diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 9a481f8e5..68261433f 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -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; /* diff --git a/src/input/mpegts/mpegts_service.c b/src/input/mpegts/mpegts_service.c index de4a55232..a4afa495a 100644 --- a/src/input/mpegts/mpegts_service.c +++ b/src/input/mpegts/mpegts_service.c @@ -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; diff --git a/src/input/mpegts/tsdemux.c b/src/input/mpegts/tsdemux.c index 3b1ac1b02..36a9a9959 100644 --- a/src/input/mpegts/tsdemux.c +++ b/src/input/mpegts/tsdemux.c @@ -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) */ diff --git a/src/satip/rtsp.c b/src/satip/rtsp.c index 47627a53a..50086d156 100644 --- a/src/satip/rtsp.c +++ b/src/satip/rtsp.c @@ -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 */ -- 2.47.3