From a326371cf98905bf722d5de5ba880009632e3908 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Sun, 8 Jun 2014 21:13:09 +0200 Subject: [PATCH] descrambler: filter equal ECM/EMM requests --- src/descrambler.h | 4 +++- src/descrambler/descrambler.c | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/descrambler.h b/src/descrambler.h index 3e9065be..ccc855e8 100755 --- a/src/descrambler.h +++ b/src/descrambler.h @@ -61,7 +61,9 @@ typedef void (*descrambler_section_callback_t) typedef struct descrambler_section { TAILQ_ENTRY(descrambler_section) link; descrambler_section_callback_t callback; - void *opaque; + void *opaque; + uint8_t *last_data; + int last_data_len; } descrambler_section_t; typedef struct descrambler_table { diff --git a/src/descrambler/descrambler.c b/src/descrambler/descrambler.c index 69ec696a..6ebf975e 100755 --- a/src/descrambler/descrambler.c +++ b/src/descrambler/descrambler.c @@ -216,7 +216,18 @@ descrambler_table_callback pthread_mutex_lock(&mt->mt_mux->mm_descrambler_lock); TAILQ_FOREACH(ds, &dt->sections, link) - ds->callback(ds->opaque, mt->mt_pid, ptr, len); + if (ds->last_data == NULL || len != ds->last_data_len || + memcmp(ds->last_data, ptr, len)) { + free(ds->last_data); + ds->last_data = malloc(len); + if (ds->last_data) { + memcpy(ds->last_data, ptr, len); + ds->last_data_len = len; + } else { + ds->last_data_len = 0; + } + ds->callback(ds->opaque, mt->mt_pid, ptr, len); + } pthread_mutex_unlock(&mt->mt_mux->mm_descrambler_lock); return 0; } @@ -283,6 +294,7 @@ descrambler_close_pid_( mpegts_mux_t *mux, void *opaque, int pid ) if (ds->opaque == opaque) { TAILQ_REMOVE(&dt->sections, ds, link); ds->callback(ds->opaque, -1, NULL, 0); + free(ds->last_data); free(ds); if (TAILQ_FIRST(&dt->sections) == NULL) { TAILQ_REMOVE(&mux->mm_descrambler_tables, dt, link); @@ -324,6 +336,7 @@ descrambler_flush_tables( mpegts_mux_t *mux ) while ((ds = TAILQ_FIRST(&dt->sections)) != NULL) { TAILQ_REMOVE(&dt->sections, ds, link); ds->callback(ds->opaque, -1, NULL, 0); + free(ds->last_data); free(ds); } TAILQ_REMOVE(&mux->mm_descrambler_tables, dt, link);