Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
descrambler: added buffer flush based on key interval time
  • Loading branch information
perexg committed Oct 20, 2015
1 parent cbcf66d commit 242f0ef
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 2 deletions.
1 change: 1 addition & 0 deletions src/descrambler.h
Expand Up @@ -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];
Expand Down
20 changes: 18 additions & 2 deletions src/descrambler/descrambler.c
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 242f0ef

Please sign in to comment.