From: Jaroslav Kysela Date: Tue, 20 Oct 2015 18:24:51 +0000 (+0200) Subject: descrambler: added buffer flush based on key interval time X-Git-Tag: v4.2.1~1854 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=242f0efddf14157fb511a248ee2392e30c677b16;p=thirdparty%2Ftvheadend.git descrambler: added buffer flush based on key interval time --- diff --git a/src/descrambler.h b/src/descrambler.h index e989e9bda..235c817ae 100644 --- a/src/descrambler.h +++ b/src/descrambler.h @@ -69,6 +69,7 @@ typedef struct th_descrambler_runtime { uint8_t dr_key_index; uint8_t dr_key_valid; uint8_t dr_key_changed; + uint32_t dr_key_interval; time_t dr_key_start; time_t dr_key_timestamp[2]; time_t dr_ecm_start[2]; diff --git a/src/descrambler/descrambler.c b/src/descrambler/descrambler.c index 1ca857d2b..bd3622b25 100644 --- a/src/descrambler/descrambler.c +++ b/src/descrambler/descrambler.c @@ -60,6 +60,17 @@ descrambler_data_destroy(th_descrambler_runtime_t *dr, th_descrambler_data_t *dd } } +static void +descrambler_data_time_flush(th_descrambler_runtime_t *dr, time_t oldest) +{ + th_descrambler_data_t *dd; + + while ((dd = TAILQ_FIRST(&dr->dr_queue)) != NULL) { + if (dd->dd_timestamp >= oldest) break; + descrambler_data_destroy(dr, dd); + } +} + static void descrambler_data_append(th_descrambler_runtime_t *dr, const uint8_t *tsb, int len) { @@ -222,6 +233,7 @@ descrambler_service_start ( service_t *t ) t->s_descramble = dr = calloc(1, sizeof(th_descrambler_runtime_t)); TAILQ_INIT(&dr->dr_queue); dr->dr_key_index = 0xff; + dr->dr_key_interval = 10; tvhcsa_init(&dr->dr_csa); } caclient_start(t); @@ -482,11 +494,14 @@ key_update( th_descrambler_runtime_t *dr, uint8_t key, time_t timestamp ) { /* set the even (0) or odd (0x40) key index */ dr->dr_key_index = key & 0x40; - if (dr->dr_key_start) + if (dr->dr_key_start) { + dr->dr_key_interval = dr->dr_key_start + 50 < timestamp ? + 10 : timestamp - dr->dr_key_start; dr->dr_key_start = timestamp; - else + } else { /* We don't know the exact start key switch time */ dr->dr_key_start = timestamp - 60; + } } static inline int @@ -602,6 +617,7 @@ descrambler_descramble ( service_t *t, /* process the queued TS packets */ if (dr->dr_queue_total > 0) { + descrambler_data_time_flush(dr, dispatch_clock - (dr->dr_key_interval - 2)); for (dd = TAILQ_FIRST(&dr->dr_queue); dd; dd = dd_next) { dd_next = TAILQ_NEXT(dd, dd_link); sb = &dd->dd_sbuf;