]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
capmt: fix for the oscam r11520+, fixes #5649
authorJaroslav Kysela <perex@perex.cz>
Wed, 12 Jun 2019 14:43:58 +0000 (16:43 +0200)
committerJaroslav Kysela <perex@perex.cz>
Wed, 12 Jun 2019 15:06:56 +0000 (17:06 +0200)
- allow to force the PMT composing, too

src/descrambler/capmt.c

index 4bd8047ce5660a74c9e7152b2c3bd1f0cb8dd853..162a2193e5d7115f711c10126c0cf47fbe3ae6ad 100644 (file)
@@ -99,6 +99,11 @@ typedef struct dmx_filter {
 #define CAPMT_CWMODE_OE22SW    2  // CA_SET_DESCR_MODE follows CA_SET_DESCR
 #define CAPMT_CWMODE_OE20      3  // DES signalled through PID index
 
+// pmt modes
+#define CAPMT_PMTMODE_AUTO      0
+#define CAPMT_PMTMODE_INDEX     1  // mix enigma2 / PC boxtype messages
+#define CAPMT_PMTMODE_UNIVERSAL 2  // use fixed PC boxtype messages
+
 // limits
 #define MAX_CA       16
 #define MAX_INDEX    128
@@ -254,6 +259,8 @@ typedef struct capmt {
   int   capmt_port;
   int   capmt_oscam;
   int   capmt_cwmode;
+  int   capmt_pmtmode;
+  int   capmt_oscam_rev;
 
   /* capmt sockets */
   int   sids[MAX_SOCKETS];
@@ -1502,8 +1509,11 @@ capmt_analyze_cmd(capmt_t *capmt, uint32_t cmd, int adapter, sbuf_t *sb, int off
     uint16_t protover = sbuf_peek_u16(sb, offset);
     int offset2       = offset + 2;
     char *info        = capmt_peek_str(sb, &offset2);
+    char *rev         = info ? strstr(info, "build r") : NULL;
 
     tvhinfo(LS_CAPMT, "%s: Connected to server '%s' (protocol version %d)", capmt_name(capmt), info, protover);
+    if (rev)
+      capmt->capmt_oscam_rev = strtol(rev + 7, NULL, 10);
 
     free(info);
 
@@ -1732,6 +1742,7 @@ handle_single(capmt_t *capmt)
             } else {
               cmd_size -= 4;
               offset = 4;
+              break;
             }
           } else if (cmd_size == 0)
             break;
@@ -2219,8 +2230,22 @@ capmt_send_request(capmt_service_t *ct, int lm)
   uint16_t onid = t->s_dvb_mux->mm_onid;
   const int adapter_num = ct->ct_adapter;
   const int wrapper = capmt_oscam_so_wrapper(capmt);
-  const int pc_desc = !wrapper && adapter_num >= 8;
-  int i;
+  int i, pc_desc = 0;
+
+  /* choose the PMT composing mode */
+  if (!wrapper) {
+    switch (capmt->capmt_pmtmode) {
+    case CAPMT_PMTMODE_INDEX:
+      pc_desc = 0;
+      break;
+    case CAPMT_PMTMODE_UNIVERSAL:
+      pc_desc = 1;
+      break;
+    default:
+      pc_desc = adapter_num >= 8 || capmt->capmt_oscam_rev >= 11396;
+      break;
+    }
+  }
 
   /* buffer for capmt */
   int pos = 0, pos2;
@@ -2662,6 +2687,17 @@ caclient_capmt_class_cwmode_list ( void *o, const char *lang )
   return strtab2htsmsg(tab, 1, lang);
 }
 
+static htsmsg_t *
+caclient_capmt_class_pmtmode_list ( void *o, const char *lang )
+{
+  static const struct strtab tab[] = {
+    { N_("Auto"),                               CAPMT_PMTMODE_AUTO },
+    { N_("Byte index tag order"),                CAPMT_PMTMODE_INDEX },
+    { N_("Universal tag order"),                 CAPMT_PMTMODE_UNIVERSAL },
+  };
+  return strtab2htsmsg(tab, 1, lang);
+}
+
 CLASS_DOC(caclient)
 
 const idclass_t caclient_capmt_class =
@@ -2707,6 +2743,16 @@ const idclass_t caclient_capmt_class =
       .def.i    = CAPMT_CWMODE_AUTO,
       .opts     = PO_DOC_NLIST,
     },
+    {
+      .type     = PT_INT,
+      .id       = "pmtmode",
+      .name     = N_("PMT Mode"),
+      .desc     = N_("PMT mode."),
+      .off      = offsetof(capmt_t, capmt_pmtmode),
+      .list     = caclient_capmt_class_pmtmode_list,
+      .def.i    = CAPMT_PMTMODE_AUTO,
+      .opts     = PO_DOC_NLIST,
+    },
     { }
   }
 };