101 lines
4.0 KiB
Diff
101 lines
4.0 KiB
Diff
diff --git a/src/descrambler/descrambler.c b/src/descrambler/descrambler.c
|
|
index 71cc9ebd6..b5c46e329 100644
|
|
--- a/src/descrambler/descrambler.c
|
|
+++ b/src/descrambler/descrambler.c
|
|
@@ -966,12 +966,12 @@ key_flush( th_descrambler_runtime_t *dr, th_descrambler_key_t *tk, uint8_t chang
|
|
/* update the keys */
|
|
if (changed & 1) {
|
|
debug2("%p: even key[%d] set for decoder", dr, tk->key_pid);
|
|
- tvhcsa_set_key_even(&tk->key_csa, tk->key_data[0]);
|
|
+ tvhcsa_set_key_even(&tk->key_csa, tk->key_data[0], dr->dr_ecm);
|
|
tk->key_valid |= 0x40;
|
|
}
|
|
if (changed & 2) {
|
|
debug2("%p: odd key[%d] set for decoder", dr, tk->key_pid);
|
|
- tvhcsa_set_key_odd(&tk->key_csa, tk->key_data[1]);
|
|
+ tvhcsa_set_key_odd(&tk->key_csa, tk->key_data[1], dr->dr_ecm);
|
|
tk->key_valid |= 0x80;
|
|
}
|
|
}
|
|
@@ -1371,6 +1371,7 @@ descrambler_table_callback
|
|
}
|
|
}
|
|
}
|
|
+ dr->dr_ecm = (ptr[2] - ptr[4]) == 4 ? ptr[0x15] : 0;
|
|
tvhtrace(LS_DESCRAMBLER, "ECM message %02x:%02x (section %d, len %d, pid %d) for service \"%s\"",
|
|
ptr[0], ptr[1], des->number, len, mt->mt_pid, t->s_dvb_svcname);
|
|
}
|
|
diff --git a/src/descrambler/descrambler.h b/src/descrambler/descrambler.h
|
|
index ac5ff312c..697adfe04 100644
|
|
--- a/src/descrambler/descrambler.h
|
|
+++ b/src/descrambler/descrambler.h
|
|
@@ -103,6 +103,7 @@ typedef struct th_descrambler_runtime {
|
|
int64_t dr_ecm_start[2];
|
|
int64_t dr_ecm_last_key_time;
|
|
int64_t dr_ecm_key_margin;
|
|
+ uint8_t dr_ecm;
|
|
int64_t dr_last_err;
|
|
int64_t dr_force_skip;
|
|
th_descrambler_key_t dr_keys[DESCRAMBLER_MAX_KEYS];
|
|
diff --git a/src/descrambler/tvhcsa.c b/src/descrambler/tvhcsa.c
|
|
index 942ce92b5..664523665 100644
|
|
--- a/src/descrambler/tvhcsa.c
|
|
+++ b/src/descrambler/tvhcsa.c
|
|
@@ -220,12 +220,12 @@ tvhcsa_set_type( tvhcsa_t *csa, struct mpegts_service *s, int type )
|
|
}
|
|
|
|
|
|
-void tvhcsa_set_key_even( tvhcsa_t *csa, const uint8_t *even )
|
|
+void tvhcsa_set_key_even( tvhcsa_t *csa, const uint8_t *even, const uint8_t ecm)
|
|
{
|
|
switch (csa->csa_type) {
|
|
case DESCRAMBLER_CSA_CBC:
|
|
#if ENABLE_DVBCSA
|
|
- dvbcsa_bs_key_set(even, csa->csa_key_even);
|
|
+ dvbcsa_bs_key_set_ecm(ecm, even, csa->csa_key_even);
|
|
#endif
|
|
break;
|
|
case DESCRAMBLER_DES_NCB:
|
|
@@ -241,13 +241,13 @@ void tvhcsa_set_key_even( tvhcsa_t *csa, const uint8_t *even )
|
|
}
|
|
}
|
|
|
|
-void tvhcsa_set_key_odd( tvhcsa_t *csa, const uint8_t *odd )
|
|
+void tvhcsa_set_key_odd( tvhcsa_t *csa, const uint8_t *odd, const uint8_t ecm )
|
|
{
|
|
assert(csa->csa_type);
|
|
switch (csa->csa_type) {
|
|
case DESCRAMBLER_CSA_CBC:
|
|
#if ENABLE_DVBCSA
|
|
- dvbcsa_bs_key_set(odd, csa->csa_key_odd);
|
|
+ dvbcsa_bs_key_set_ecm(ecm, odd, csa->csa_key_odd);
|
|
#endif
|
|
break;
|
|
case DESCRAMBLER_DES_NCB:
|
|
diff --git a/src/descrambler/tvhcsa.h b/src/descrambler/tvhcsa.h
|
|
index 855de5acc..24eb729cb 100644
|
|
--- a/src/descrambler/tvhcsa.h
|
|
+++ b/src/descrambler/tvhcsa.h
|
|
@@ -66,8 +66,8 @@ typedef struct tvhcsa
|
|
|
|
int tvhcsa_set_type( tvhcsa_t *csa, struct mpegts_service *s, int type );
|
|
|
|
-void tvhcsa_set_key_even( tvhcsa_t *csa, const uint8_t *even );
|
|
-void tvhcsa_set_key_odd ( tvhcsa_t *csa, const uint8_t *odd );
|
|
+void tvhcsa_set_key_even( tvhcsa_t *csa, const uint8_t *even, const uint8_t ecm );
|
|
+void tvhcsa_set_key_odd ( tvhcsa_t *csa, const uint8_t *odd, const uint8_t ecm );
|
|
|
|
void tvhcsa_init ( tvhcsa_t *csa );
|
|
void tvhcsa_destroy ( tvhcsa_t *csa );
|
|
@@ -76,8 +76,8 @@ void tvhcsa_destroy ( tvhcsa_t *csa );
|
|
|
|
static inline int tvhcsa_set_type( tvhcsa_t *csa, struct mpegts_service *s, int type ) { return -1; }
|
|
|
|
-static inline void tvhcsa_set_key_even( tvhcsa_t *csa, const uint8_t *even ) { };
|
|
-static inline void tvhcsa_set_key_odd ( tvhcsa_t *csa, const uint8_t *odd ) { };
|
|
+static inline void tvhcsa_set_key_even( tvhcsa_t *csa, const uint8_t *even, const uint8_t ecm ) { };
|
|
+static inline void tvhcsa_set_key_odd ( tvhcsa_t *csa, const uint8_t *odd, const uint8_t ecm ) { };
|
|
|
|
static inline void tvhcsa_init ( tvhcsa_t *csa ) { };
|
|
static inline void tvhcsa_destroy ( tvhcsa_t *csa ) { };
|