From 65a44a5a7218454e3096e2d22395accb97caa50b Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Tue, 6 Mar 2018 09:36:05 +0100 Subject: [PATCH] linuxdvb: implement correctly PID overlimit --- src/input/mpegts/linuxdvb/linuxdvb_frontend.c | 8 +++++--- src/input/mpegts/mpegts_pid.c | 9 +++++++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c index e0838d664..6406b0cd3 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c @@ -1315,22 +1315,24 @@ linuxdvb_update_pids ( linuxdvb_frontend_t *lfe, const char *name, int pids_size ) { mpegts_apids_t wpid, padd, pdel; - int i, max = MAX(14, lfe->lfe_pids_max); + int i, max = MAX(14, lfe->lfe_pids_max), overlimit; int all = lfe->lfe_pids.all; char buf[512]; pthread_mutex_lock(&lfe->lfe_dvr_lock); if (!all) { - mpegts_pid_weighted(&wpid, &lfe->lfe_pids, max); + overlimit = mpegts_pid_weighted(&wpid, &lfe->lfe_pids, max); if (tvhtrace_enabled()) { mpegts_pid_dump(&wpid, buf, sizeof(buf), 1, 1); tvhtrace(LS_LINUXDVB, "%s - weighted PIDs %s", name, buf); } - if (wpid.count > max && lfe->lfe_pids_use_all) { + if (overlimit && lfe->lfe_pids_use_all) { all = 1; mpegts_pid_done(&wpid); } else { + if (overlimit) + tvhwarn(LS_LINUXDVB, "%s - unable to set filter for %d PIDs", name, overlimit); mpegts_pid_compare(&wpid, tuned, &padd, &pdel); for (i = 0; i < pdel.count; i++) linuxdvb_frontend_close_pid0(lfe, name, pids, pids_size, pdel.pids[i].pid); diff --git a/src/input/mpegts/mpegts_pid.c b/src/input/mpegts/mpegts_pid.c index dcd06abc3..0e11261bc 100644 --- a/src/input/mpegts/mpegts_pid.c +++ b/src/input/mpegts/mpegts_pid.c @@ -340,7 +340,7 @@ mpegts_pid_compare_weight(mpegts_apids_t *dst, mpegts_apids_t *src, int mpegts_pid_weighted(mpegts_apids_t *dst, mpegts_apids_t *pids, int limit) { - int i, j; + int i, j, overlimit = 0; mpegts_apids_t sorted; mpegts_apid_t *p; @@ -357,10 +357,15 @@ mpegts_pid_weighted(mpegts_apids_t *dst, mpegts_apids_t *pids, int limit) else mpegts_pid_update_max_weight_by_index(dst, j, p->weight); } + for ( ; i < sorted.count; i++) { + p = &sorted.pids[i]; + if (mpegts_pid_find_rindex(dst, sorted.pids[i].pid) < 0) + overlimit++; + } dst->all = pids->all; mpegts_pid_done(&sorted); - return 0; + return overlimit; } int -- 2.47.3