From: Jaroslav Kysela Date: Wed, 12 Jun 2019 14:43:58 +0000 (+0200) Subject: capmt: fix for the oscam r11520+, fixes #5649 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bc769bfa9260bad6e1caa0c95591b70ae25f47bf;p=thirdparty%2Ftvheadend.git capmt: fix for the oscam r11520+, fixes #5649 - allow to force the PMT composing, too --- diff --git a/src/descrambler/capmt.c b/src/descrambler/capmt.c index 4bd8047ce..162a2193e 100644 --- a/src/descrambler/capmt.c +++ b/src/descrambler/capmt.c @@ -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, + }, { } } };