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 ) { };