]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
linuxdvb_ca: add option to send CAPT query and to adjust CAPMT intervals
authorDamjan Marion <damjan.marion@gmail.com>
Wed, 20 May 2015 00:33:55 +0000 (02:33 +0200)
committerJaroslav Kysela <perex@perex.cz>
Wed, 20 May 2015 10:24:56 +0000 (12:24 +0200)
src/input/mpegts/linuxdvb/linuxdvb_ca.c
src/input/mpegts/linuxdvb/linuxdvb_private.h

index bb6a54788b1628c1d39a7fa8a6d6a2c14749aa62..52914725f05a0547012653ad0b58a818d37d92e5 100644 (file)
@@ -218,6 +218,29 @@ const idclass_t linuxdvb_ca_class =
       .opts     = PO_ADVANCED,
       .def.s    = "PIN",
     },
+    {
+      .type     = PT_INT,
+      .id       = "capmt_interval",
+      .name     = "CAPMT Interval (ms)",
+      .off      = offsetof(linuxdvb_ca_t, lca_capmt_interval),
+      .opts     = PO_ADVANCED,
+      .def.i    = 100,
+    },
+    {
+      .type     = PT_INT,
+      .id       = "capmt_query_interval",
+      .name     = "CAPMT Query Interval (ms)",
+      .off      = offsetof(linuxdvb_ca_t, lca_capmt_query_interval),
+      .opts     = PO_ADVANCED,
+      .def.i    = 1200,
+    },
+    {
+      .type     = PT_BOOL,
+      .id       = "query_before_ok_descrambling",
+      .name     = "Send CAPMT Query",
+      .off      = offsetof(linuxdvb_ca_t, lca_capmt_query),
+      .opts     = PO_ADVANCED,
+    },
     {
       .type     = PT_STR,
       .id       = "ca_path",
@@ -747,6 +770,8 @@ linuxdvb_ca_create
   lca->lca_number = number;
   lca->lca_ca_path  = strdup(ca_path);
   lca->lca_ca_fd = -1;
+  lca->lca_capmt_interval = 100;
+  lca->lca_capmt_query_interval = 1200;
 
   /* Internal config ID */
   snprintf(id, sizeof(id), "ca%u", number);
@@ -784,7 +809,7 @@ linuxdvb_ca_process_capmt_queue ( void *aux )
   struct section_ext *result;
   struct mpeg_pmt_section *pmt;
   uint8_t capmt[4096];
-  int size;
+  int size, i;
 
   lcc = TAILQ_FIRST(&lca->lca_capmt_queue);
 
@@ -823,6 +848,8 @@ linuxdvb_ca_process_capmt_queue ( void *aux )
   tvhlog_hexdump("en50221", capmt, size);
 
 done:
+  i = (lcc->cmd_id == CA_PMT_CMD_ID_QUERY) ?
+    lca->lca_capmt_query_interval : lca->lca_capmt_interval;
 
   TAILQ_REMOVE(&lca->lca_capmt_queue, lcc, lcc_link);
 
@@ -831,7 +858,7 @@ done:
 
   if (!TAILQ_EMPTY(&lca->lca_capmt_queue)) {
     gtimer_arm_ms(&lca->lca_capmt_queue_timer,
-                  linuxdvb_ca_process_capmt_queue, lca, 1000);
+                  linuxdvb_ca_process_capmt_queue, lca, i);
   }
 }
 
@@ -840,26 +867,32 @@ linuxdvb_ca_enqueue_capmt(linuxdvb_ca_t *lca, uint8_t slot, const uint8_t *ptr,
                           int len, uint8_t list_mgmt, uint8_t cmd_id)
 {
   linuxdvb_ca_capmt_t *lcc;
+  int c = 1;
 
   if (!lca)
     return;
 
-  lcc = calloc(1, sizeof(*lcc));
+  if (lca->lca_capmt_query && cmd_id == CA_PMT_CMD_ID_OK_DESCRAMBLING)
+    c = 2;
 
-  if (!lcc)
-    return;
+  while (c--) {
+    lcc = calloc(1, sizeof(*lcc));
 
-  lcc->data = malloc(len);
-  lcc->len = len;
-  lcc->slot = slot;
-  lcc->list_mgmt = list_mgmt;
-  lcc->cmd_id = cmd_id;
-  memcpy(lcc->data, ptr, len);
+    if (!lcc)
+      return;
 
-  TAILQ_INSERT_TAIL(&lca->lca_capmt_queue, lcc, lcc_link);
+    lcc->data = malloc(len);
+    lcc->len = len;
+    lcc->slot = slot;
+    lcc->list_mgmt = list_mgmt;
+    lcc->cmd_id = (c ? CA_PMT_CMD_ID_QUERY : cmd_id);
+    memcpy(lcc->data, ptr, len);
 
-  tvhtrace("en50221", "%s CAPMT enqueued (%s)", ca_pmt_cmd_id2str(lcc->cmd_id),
-           ca_pmt_list_mgmt2str(lcc->list_mgmt));
+    TAILQ_INSERT_TAIL(&lca->lca_capmt_queue, lcc, lcc_link);
+
+    tvhtrace("en50221", "%s CAPMT enqueued (%s)", ca_pmt_cmd_id2str(lcc->cmd_id),
+             ca_pmt_list_mgmt2str(lcc->list_mgmt));
+  }
 
   gtimer_arm_ms(&lca->lca_capmt_queue_timer,
                 linuxdvb_ca_process_capmt_queue, lca, 50);
index b88ae94cecfaedb7493d78c3ba99f3d8c320f5cc..6ba2cf694cddaa90871b3a25f5993444439cc69d 100644 (file)
@@ -175,8 +175,11 @@ struct linuxdvb_ca
   int                       lca_ca_fd;
   int                       lca_enabled;
   int                       lca_high_bitrate_mode;
+  int                       lca_capmt_query;
   gtimer_t                  lca_monitor_timer;
   gtimer_t                  lca_capmt_queue_timer;
+  int                       lca_capmt_interval;
+  int                       lca_capmt_query_interval;
   pthread_t                 lca_en50221_thread;
   int                       lca_en50221_thread_running;