]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
linuxdvb: implement correctly PID overlimit
authorJaroslav Kysela <perex@perex.cz>
Tue, 6 Mar 2018 08:36:05 +0000 (09:36 +0100)
committerJaroslav Kysela <perex@perex.cz>
Tue, 6 Mar 2018 08:36:05 +0000 (09:36 +0100)
src/input/mpegts/linuxdvb/linuxdvb_frontend.c
src/input/mpegts/mpegts_pid.c

index e0838d664995880668e0adb2d93b99c86c013852..6406b0cd36564c995d13b9a2393aad61cb178c63 100644 (file)
@@ -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);
index dcd06abc3def32189132529f954e331b30e98192..0e11261bceedd43d062c5c645035c952a0ecd12d 100644 (file)
@@ -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