From 48f82ed0a046752ae58c8d51c8c33e41fb77c320 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Mon, 5 Mar 2018 00:12:20 +0100 Subject: [PATCH] mpegts pid: fix the weighted and compare functions (change semantics) --- src/input/mpegts.h | 2 + src/input/mpegts/linuxdvb/linuxdvb_frontend.c | 5 +-- src/input/mpegts/mpegts_pid.c | 37 ++++++++++++++++++- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/input/mpegts.h b/src/input/mpegts.h index c6991505e..d607fbde1 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -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 ); diff --git a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c index e7b25093f..6ed254faf 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c @@ -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); } } diff --git a/src/input/mpegts/mpegts_pid.c b/src/input/mpegts/mpegts_pid.c index cb98896e5..e864de2fd 100644 --- a/src/input/mpegts/mpegts_pid.c +++ b/src/input/mpegts/mpegts_pid.c @@ -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); -- 2.47.3