]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
linuxdvb: fix the pid management (full mux to pid filter transition), fixes #4895
authorJaroslav Kysela <perex@perex.cz>
Mon, 29 Jan 2018 14:50:05 +0000 (15:50 +0100)
committerJaroslav Kysela <perex@perex.cz>
Mon, 29 Jan 2018 14:54:31 +0000 (15:54 +0100)
src/input/mpegts/linuxdvb/linuxdvb_frontend.c

index 9679467cb35571eaae51d5c21bf15fc8a02f22ae..e733c4dadfc6e9bcab34804cb6822224a883439a 100644 (file)
@@ -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);