]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
descrambler: filter equal ECM/EMM requests
authorJaroslav Kysela <perex@perex.cz>
Sun, 8 Jun 2014 19:13:09 +0000 (21:13 +0200)
committerJaroslav Kysela <perex@perex.cz>
Tue, 10 Jun 2014 12:02:36 +0000 (14:02 +0200)
src/descrambler.h
src/descrambler/descrambler.c

index 3e9065bede74c37e6e29103135b5c107aa469307..ccc855e88c012f52edc0ee0d73e08b38f4ff220e 100755 (executable)
@@ -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 {
index 69ec696a9b7e7bfe0bc7c0f57fff1430195cd9f9..6ebf975e90b5a2a2f8738185b4059e99777effdf 100755 (executable)
@@ -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);