]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts dvb service: add CA PID filter (lock) mode 2 to force CA PID
authorJaroslav Kysela <perex@perex.cz>
Wed, 30 Jul 2014 16:19:46 +0000 (18:19 +0200)
committerJaroslav Kysela <perex@perex.cz>
Wed, 30 Jul 2014 16:19:55 +0000 (18:19 +0200)
- works for both cwc and capmt

src/descrambler/capmt.c
src/descrambler/cwc.c
src/input/mpegts/mpegts_service.c

index e60ce7a49adcec3d83cadb1816552693e7407b83..babd1a81473ca8019b7d12f79d4102b42229dde8 100644 (file)
@@ -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;
index cd7406e8eb91ce5aed2e214b3235c3efb035c93a..8261ef0420cfc41e0a1aa6609e5b6d9bbcdd15b3 100755 (executable)
@@ -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;
index f7e53b2dab995d947777a336deb21b78f0cc478f..e4dc026beb9e864f2bfd9153f835cf49e2a55896 100644 (file)
@@ -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,
     },
     {},
   }