From: Jaroslav Kysela Date: Tue, 20 Feb 2018 19:53:17 +0000 (+0100) Subject: SAT>IP server: second fix for the multiple subcribers to one service, issue #4957 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=370b1703ff75745f00decac7b51994d729e1bfa8;p=thirdparty%2Ftvheadend.git SAT>IP server: second fix for the multiple subcribers to one service, issue #4957 --- diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 68261433f..d2fa41431 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -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); } diff --git a/src/input/mpegts/mpegts_input.c b/src/input/mpegts/mpegts_input.c index cb7df25b1..a7da2dd11 100644 --- a/src/input/mpegts/mpegts_input.c +++ b/src/input/mpegts/mpegts_input.c @@ -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); diff --git a/src/input/mpegts/mpegts_service.c b/src/input/mpegts/mpegts_service.c index a4afa495a..b43f9fb91 100644 --- a/src/input/mpegts/mpegts_service.c +++ b/src/input/mpegts/mpegts_service.c @@ -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))