From b611d69fdc7826e605fe26ced184e04537dcaddb Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Wed, 30 Jul 2014 18:19:46 +0200 Subject: [PATCH] mpegts dvb service: add CA PID filter (lock) mode 2 to force CA PID - works for both cwc and capmt --- src/descrambler/capmt.c | 6 ++++++ src/descrambler/cwc.c | 3 +++ src/input/mpegts/mpegts_service.c | 14 +++++++++++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/descrambler/capmt.c b/src/descrambler/capmt.c index e60ce7a4..babd1a81 100644 --- a/src/descrambler/capmt.c +++ b/src/descrambler/capmt.c @@ -1530,6 +1530,9 @@ capmt_caid_change(th_descrambler_t *td) lock_assert(&t->s_stream_mutex); TAILQ_FOREACH(st, &t->s_filt_components, es_filt_link) { + if (t->s_dvb_prefcapid_lock == 2 && + t->s_dvb_prefcapid != st->es_pid) + continue; LIST_FOREACH(c, &st->es_caids, link) { /* search ecmpid in list */ LIST_FOREACH(cce, &ct->ct_caid_ecm, cce_link) @@ -1809,6 +1812,9 @@ capmt_service_start(service_t *s) pthread_mutex_lock(&t->s_stream_mutex); TAILQ_FOREACH(st, &t->s_filt_components, es_filt_link) { caid_t *c; + if (t->s_dvb_prefcapid_lock == 2 && + t->s_dvb_prefcapid != st->es_pid) + continue; LIST_FOREACH(c, &st->es_caids, link) { if(c == NULL || c->use == 0) continue; diff --git a/src/descrambler/cwc.c b/src/descrambler/cwc.c index cd7406e8..8261ef04 100755 --- a/src/descrambler/cwc.c +++ b/src/descrambler/cwc.c @@ -1992,6 +1992,9 @@ cwc_service_start(service_t *t) LIST_FOREACH(pcard, &cwc->cwc_cards, cs_card) { if (pcard->cwc_caid == 0) continue; TAILQ_FOREACH(st, &t->s_filt_components, es_filt_link) { + if (((mpegts_service_t *)t)->s_dvb_prefcapid_lock == 2 && + ((mpegts_service_t *)t)->s_dvb_prefcapid != st->es_pid) + continue; LIST_FOREACH(c, &st->es_caids, link) { if (c->use && c->caid == pcard->cwc_caid) break; diff --git a/src/input/mpegts/mpegts_service.c b/src/input/mpegts/mpegts_service.c index f7e53b2d..e4dc026b 100644 --- a/src/input/mpegts/mpegts_service.c +++ b/src/input/mpegts/mpegts_service.c @@ -55,6 +55,17 @@ mpegts_service_class_get_network ( void *ptr ) return &s; } +static htsmsg_t * +mpegts_service_pref_capid_lock_list ( void *o ) +{ + static const struct strtab tab[] = { + { "Off", 0 }, + { "On", 1 }, + { "Only Pref. CA PID", 2 }, + }; + return strtab2htsmsg(tab); +} + const idclass_t mpegts_service_class = { .ic_super = &service_class, @@ -134,11 +145,12 @@ const idclass_t mpegts_service_class = .opts = PO_ADVANCED, }, { - .type = PT_BOOL, + .type = PT_INT, .id = "prefcapid_lock", .name = "Lock Pref. CA PID", .off = offsetof(mpegts_service_t, s_dvb_prefcapid_lock), .opts = PO_ADVANCED, + .list = mpegts_service_pref_capid_lock_list, }, {}, }