From: Jaroslav Kysela Date: Tue, 6 Mar 2018 08:36:05 +0000 (+0100) Subject: linuxdvb: implement correctly PID overlimit X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=65a44a5a7218454e3096e2d22395accb97caa50b;p=thirdparty%2Ftvheadend.git linuxdvb: implement correctly PID overlimit --- 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