From 57854645def4258f3da6c969bbf626f6112c87d6 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Mon, 29 Jan 2018 15:50:05 +0100 Subject: [PATCH] linuxdvb: fix the pid management (full mux to pid filter transition), fixes #4895 --- src/input/mpegts/linuxdvb/linuxdvb_frontend.c | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c index 9679467cb..e733c4dad 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c @@ -1281,14 +1281,21 @@ linuxdvb_update_pids ( linuxdvb_frontend_t *lfe, const char *name, if (!lfe->lfe_pids.all) { mpegts_pid_weighted(&wpid, &lfe->lfe_pids, max); - mpegts_pid_compare(&wpid, tuned, &padd, &pdel); - mpegts_pid_done(&wpid); - for (i = 0; i < pdel.count; i++) - linuxdvb_frontend_close_pid0(lfe, name, pids, pids_size, pdel.pids[i].pid); - for (i = 0; i < padd.count; i++) - linuxdvb_frontend_open_pid0(lfe, name, pids, pids_size, padd.pids[i].pid); - mpegts_pid_done(&padd); - mpegts_pid_done(&pdel); + if (wpid.count > max && lfe->lfe_pids_use_all) { + all = 1; + mpegts_pid_done(&wpid); + } else { + mpegts_pid_compare(&wpid, tuned, &padd, &pdel); + mpegts_pid_done(&wpid); + for (i = 0; i < pdel.count; i++) + linuxdvb_frontend_close_pid0(lfe, name, pids, pids_size, pdel.pids[i].pid); + for (i = 0; i < padd.count; i++) + linuxdvb_frontend_open_pid0(lfe, name, pids, pids_size, padd.pids[i].pid); + mpegts_pid_done(&padd); + mpegts_pid_done(&pdel); + mpegts_pid_done(tuned); + mpegts_pid_weighted(tuned, &lfe->lfe_pids, max); + } } if (lfe->lfe_pids.all && !linuxdvb_pid_exists(pids, pids_size, MPEGTS_FULLMUX_PID)) @@ -1296,8 +1303,6 @@ linuxdvb_update_pids ( linuxdvb_frontend_t *lfe, const char *name, else if (!lfe->lfe_pids.all && linuxdvb_pid_exists(pids, pids_size, MPEGTS_FULLMUX_PID)) linuxdvb_frontend_close_pid0(lfe, name, pids, pids_size, MPEGTS_FULLMUX_PID); - mpegts_pid_done(tuned); - mpegts_pid_weighted(tuned, &lfe->lfe_pids, max); tuned->all = lfe->lfe_pids.all; pthread_mutex_unlock(&lfe->lfe_dvr_lock); -- 2.47.3