From 718418b83bdbac76cf3d2373d4b4bb10c6580ce9 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Mon, 19 Jun 2017 09:29:19 +0200 Subject: [PATCH] linuxdvb: use MPEGTS_FULLMUX_PID (8192) when the PID filter overflows, fixes #4442 --- src/input/mpegts/linuxdvb/linuxdvb_frontend.c | 38 +++++++++++++------ src/input/mpegts/linuxdvb/linuxdvb_private.h | 1 + 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c index c1a02361f..63c7d6d3c 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c @@ -131,6 +131,15 @@ const idclass_t linuxdvb_frontend_class = .opts = PO_ADVANCED, .def.i = 32 }, + { + .type = PT_BOOL, + .id = "pids_use_all", + .name = N_("Allow all PIDs"), + .desc = N_("Allow all PIDs (no filter) when the 'Maximum PIDs' limit is reached."), + .off = offsetof(linuxdvb_frontend_t, lfe_pids_use_all), + .opts = PO_ADVANCED, + .def.i = 1 + }, { .type = PT_BOOL, .id = "powersave", @@ -1273,24 +1282,30 @@ linuxdvb_update_pids ( linuxdvb_frontend_t *lfe, const char *name, { mpegts_apids_t wpid, padd, pdel; int i, max = MAX(14, lfe->lfe_pids_max); + int all = lfe->lfe_pids.all; pthread_mutex_lock(&lfe->lfe_dvr_lock); - if (!lfe->lfe_pids.all) { + if (!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); + } } - if (lfe->lfe_pids.all && !linuxdvb_pid_exists(pids, pids_size, MPEGTS_FULLMUX_PID)) + if (all && !linuxdvb_pid_exists(pids, pids_size, MPEGTS_FULLMUX_PID)) linuxdvb_frontend_open_pid0(lfe, name, pids, pids_size, MPEGTS_FULLMUX_PID); - else if (!lfe->lfe_pids.all && linuxdvb_pid_exists(pids, pids_size, MPEGTS_FULLMUX_PID)) + else if (!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); @@ -2082,6 +2097,7 @@ linuxdvb_frontend_create lfe->lfe_ibuf_size = 188000; lfe->lfe_status_period = 1000; lfe->lfe_pids_max = 32; + lfe->lfe_pids_use_all = 1; lfe = (linuxdvb_frontend_t*)mpegts_input_create0((mpegts_input_t*)lfe, idc, uuid, conf); if (!lfe) return NULL; diff --git a/src/input/mpegts/linuxdvb/linuxdvb_private.h b/src/input/mpegts/linuxdvb/linuxdvb_private.h index daeb1e258..41b9845b8 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_private.h +++ b/src/input/mpegts/linuxdvb/linuxdvb_private.h @@ -128,6 +128,7 @@ struct linuxdvb_frontend tvh_cond_t lfe_dvr_cond; mpegts_apids_t lfe_pids; int lfe_pids_max; + int lfe_pids_use_all; /* * Tuning -- 2.47.3