]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts pid: fix the weighted and compare functions (change semantics)
authorJaroslav Kysela <perex@perex.cz>
Sun, 4 Mar 2018 23:12:20 +0000 (00:12 +0100)
committerJaroslav Kysela <perex@perex.cz>
Sun, 4 Mar 2018 23:12:33 +0000 (00:12 +0100)
src/input/mpegts.h
src/input/mpegts/linuxdvb/linuxdvb_frontend.c
src/input/mpegts/mpegts_pid.c

index c6991505e0d343ef95e655f2cac77337aa0abdae..d607fbde10da295225305a441d49e10006a15fb0 100644 (file)
@@ -113,6 +113,8 @@ int mpegts_pid_copy ( mpegts_apids_t *dst, mpegts_apids_t *src );
 int mpegts_pid_cmp ( mpegts_apids_t *a, mpegts_apids_t *b );
 int mpegts_pid_compare ( mpegts_apids_t *dst, mpegts_apids_t *src,
                          mpegts_apids_t *add, mpegts_apids_t *del );
+int mpegts_pid_compare_weight ( mpegts_apids_t *dst, mpegts_apids_t *src,
+                                mpegts_apids_t *add, mpegts_apids_t *del );
 int mpegts_pid_weighted ( mpegts_apids_t *dst, mpegts_apids_t *src, int limit );
 int mpegts_pid_dump ( mpegts_apids_t *pids, char *buf, int len, int wflag, int raw );
 
index e7b25093f568e2128c409715dfe0b770f6bcf706..6ed254faf564396aebfb5c3e7dff3f48d443ac49 100644 (file)
@@ -1327,15 +1327,14 @@ linuxdvb_update_pids ( linuxdvb_frontend_t *lfe, const char *name,
       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);
+      mpegts_pid_copy(tuned, &wpid);
+      mpegts_pid_done(&wpid);
     }
   }
 
index cb98896e5b176469db84476134b48178385c3e26..e864de2fdcdd68dd9006abeb4eabc8a942b1d74e 100644 (file)
@@ -268,6 +268,35 @@ mpegts_pid_compare(mpegts_apids_t *dst, mpegts_apids_t *src,
   mpegts_apid_t *p;
   int i;
 
+  assert(dst);
+  assert(add);
+  assert(del);
+  if (mpegts_pid_init(add) || mpegts_pid_init(del))
+    return -1;
+  if (src == NULL) {
+    mpegts_pid_copy(add, dst);
+    return add->count > 0;
+  }
+  for (i = 0; i < src->count; i++) {
+    p = &src->pids[i];
+    if (mpegts_pid_find_rindex(dst, p->pid) < 0)
+      mpegts_pid_add(del, p->pid, p->weight);
+  }
+  for (i = 0; i < dst->count; i++) {
+    p = &dst->pids[i];
+    if (mpegts_pid_find_rindex(src, p->pid) < 0)
+      mpegts_pid_add(add, p->pid, p->weight);
+  }
+  return add->count || del->count;
+}
+
+int
+mpegts_pid_compare_weight(mpegts_apids_t *dst, mpegts_apids_t *src,
+                          mpegts_apids_t *add, mpegts_apids_t *del)
+{
+  mpegts_apid_t *p;
+  int i;
+
   assert(dst);
   assert(add);
   assert(del);
@@ -295,14 +324,18 @@ mpegts_pid_weighted(mpegts_apids_t *dst, mpegts_apids_t *pids, int limit)
 {
   int i, j;
   mpegts_apids_t sorted;
+  uint16_t pid;
 
   mpegts_pid_init(&sorted);
   mpegts_pid_copy(&sorted, pids);
   qsort(sorted.pids, sorted.count, sizeof(mpegts_apid_t), pid_wcmp);
 
   mpegts_pid_init(dst);
-  for (i = j = 0; i < sorted.count && dst->count < limit; i++)
-    mpegts_pid_add(dst, sorted.pids[i].pid, 0);
+  for (i = j = 0; i < sorted.count && dst->count < limit; i++) {
+    pid = sorted.pids[i].pid;
+    if (mpegts_pid_find_rindex(dst, pid) < 0)
+      mpegts_pid_add(dst, pid, sorted.pids[i].weight);
+  }
   dst->all = pids->all;
 
   mpegts_pid_done(&sorted);