From 43a7a077e6fa31d6680cd6671635b319ac254aee Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Tue, 21 Oct 2014 16:07:59 +0200 Subject: [PATCH] mpegts mux: the mm_pids flush must be protected by mi_output_lock --- src/input/mpegts/mpegts_mux.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index 37123947..c8411005 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -713,19 +713,26 @@ mpegts_mux_stop ( mpegts_mux_t *mm, int force ) mpegts_input_flush_mux(mi, mm); /* Ensure PIDs are cleared */ - mm->mm_last_pid = -1; - mm->mm_last_mp = NULL; - while ((mp = RB_FIRST(&mm->mm_pids))) { - while ((mps = RB_FIRST(&mp->mp_subs))) { - RB_REMOVE(&mp->mp_subs, mps, mps_link); - free(mps); + if (mi) { + pthread_mutex_lock(&mi->mi_output_lock); + mm->mm_last_pid = -1; + mm->mm_last_mp = NULL; + while ((mp = RB_FIRST(&mm->mm_pids))) { + assert(mi); + while ((mps = RB_FIRST(&mp->mp_subs))) { + RB_REMOVE(&mp->mp_subs, mps, mps_link); + free(mps); + } + RB_REMOVE(&mm->mm_pids, mp, mp_link); + if (mp->mp_fd != -1) { + tvhdebug("mpegts", "%s - close PID %04X (%d)", buf, mp->mp_pid, mp->mp_pid); + close(mp->mp_fd); + } + free(mp); } - RB_REMOVE(&mm->mm_pids, mp, mp_link); - if (mp->mp_fd != -1) { - tvhdebug("mpegts", "%s - close PID %04X (%d)", buf, mp->mp_pid, mp->mp_pid); - close(mp->mp_fd); - } - free(mp); + pthread_mutex_unlock(&mi->mi_output_lock); + } else { + assert(RB_FIRST(&mm->mm_pids) == NULL); } /* Scanning */