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); }
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) {
}
}
- mpegts_service_update_slave_pids(s, 1);
+ mpegts_service_update_slave_pids(s, NULL, 1);
} else {
mpegts_input_close_pids(mi, mm, s, 1);
}
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;
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);
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;
}
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))