From 3332f8614b3c2ed4f7c1bd1193da6f183a43d3be Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Mon, 23 Mar 2015 21:06:38 +0100 Subject: [PATCH] mpegts: fix the mpegts_input_close_pids() - fullmux/tables subscriptions --- src/input/mpegts.h | 2 +- src/input/mpegts/mpegts_input.c | 17 +++++++++++++---- src/input/mpegts/mpegts_service.c | 4 ++-- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/input/mpegts.h b/src/input/mpegts.h index 3c075695..21726c85 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -866,7 +866,7 @@ int mpegts_input_close_pid ( mpegts_input_t *mi, mpegts_mux_t *mm, int pid, int type, void *owner ); void mpegts_input_close_pids - ( mpegts_input_t *mi, mpegts_mux_t *mm, void *owner ); + ( mpegts_input_t *mi, mpegts_mux_t *mm, void *owner, int all ); static inline void tsdebug_write(mpegts_mux_t *mm, uint8_t *buf, size_t len) diff --git a/src/input/mpegts/mpegts_input.c b/src/input/mpegts/mpegts_input.c index 36e6b104..dcd781a3 100644 --- a/src/input/mpegts/mpegts_input.c +++ b/src/input/mpegts/mpegts_input.c @@ -408,11 +408,20 @@ mpegts_mps_cmp ( mpegts_pid_sub_t *a, mpegts_pid_sub_t *b ) void mpegts_input_close_pids - ( mpegts_input_t *mi, mpegts_mux_t *mm, void *owner ) + ( mpegts_input_t *mi, mpegts_mux_t *mm, void *owner, int all ) { mpegts_pid_t *mp, *mp_next; mpegts_pid_sub_t *mps, *mps_next; + int pid; + if (all) + for (mps = LIST_FIRST(&mm->mm_all_subs); mps; mps = mps_next) { + mps_next = LIST_NEXT(mps, mps_svcraw_link); + if (mps->mps_owner != owner) continue; + pid = MPEGTS_FULLMUX_PID; + if (mps->mps_type & MPS_TABLES) pid = MPEGTS_TABLES_PID; + mi->mi_close_pid(mi, mm, pid, mps->mps_type, mps->mps_owner); + } for (mp = RB_FIRST(&mm->mm_pids); mp; mp = mp_next) { mp_next = RB_NEXT(mp, mp_link); for (mps = RB_FIRST(&mp->mp_subs); mps; mps = mps_next) { @@ -438,7 +447,7 @@ mpegts_input_open_pid lock_assert(&mi->mi_output_lock); if (pid == MPEGTS_FULLMUX_PID) - mpegts_input_close_pids(mi, mm, owner); + mpegts_input_close_pids(mi, mm, owner, 1); if ((mp = mpegts_mux_find_pid(mm, pid, 1))) { mps = calloc(1, sizeof(*mps)); @@ -490,7 +499,7 @@ mpegts_input_close_pid buf, pid == MPEGTS_TABLES_PID ? "tables" : "fullmux", type, owner); if (pid == MPEGTS_FULLMUX_PID) - mpegts_input_close_pids(mi, mm, owner); + mpegts_input_close_pids(mi, mm, owner, 0); LIST_REMOVE(mps, mps_svcraw_link); free(mps); mask = pid == MPEGTS_FULLMUX_PID ? MPS_ALL : MPS_TABLES; @@ -648,7 +657,7 @@ mpegts_input_close_service ( mpegts_input_t *mi, mpegts_service_t *s ) mpegts_pid_destroy(&pids); } else { - mpegts_input_close_pids(mi, s->s_dvb_mux, s); + mpegts_input_close_pids(mi, s->s_dvb_mux, s, 1); } diff --git a/src/input/mpegts/mpegts_service.c b/src/input/mpegts/mpegts_service.c index d7995590..b8478170 100644 --- a/src/input/mpegts/mpegts_service.c +++ b/src/input/mpegts/mpegts_service.c @@ -725,12 +725,12 @@ mpegts_service_raw_update_pids(mpegts_service_t *t, mpegts_apids_t *pids) t->s_pids = p; if (!pids->all && x && x->all) { mi->mi_close_pid(mi, mm, MPEGTS_FULLMUX_PID, MPS_RAW, t); - mpegts_input_close_pids(mi, mm, t); + mpegts_input_close_pids(mi, mm, t, 1); for (i = 0; i < x->count; i++) mi->mi_open_pid(mi, mm, x->pids[i], MPS_RAW, t); } else { if (pids->all) { - mpegts_input_close_pids(mi, mm, t); + mpegts_input_close_pids(mi, mm, t, 1); mi->mi_open_pid(mi, mm, MPEGTS_FULLMUX_PID, MPS_RAW, t); } else { mpegts_pid_compare(p, x, &add, &del);