]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
descrambler: add dr_descramble() callback
authorJaroslav Kysela <perex@perex.cz>
Mon, 16 Oct 2017 07:35:23 +0000 (09:35 +0200)
committerJaroslav Kysela <perex@perex.cz>
Mon, 16 Oct 2017 07:35:23 +0000 (09:35 +0200)
src/descrambler.h
src/descrambler/descrambler.c

index 61de6007cdda3862b70c7eedeb33ae713708a763..631b74c291ad4895ee5a43c08dc82ff3f9244cc8 100644 (file)
@@ -85,7 +85,9 @@ typedef struct th_descrambler_key {
 } th_descrambler_key_t;
 
 typedef struct th_descrambler_runtime {
+  th_descrambler_t *dr_descrambler;
   struct service *dr_service;
+  int    (*dr_descramble)(struct th_descrambler *d, const uint8_t *tsb, int len);
   int      dr_ca_count;
   int      dr_ca_resolved;
   int      dr_ca_failed;
index 72d58766ae7fb816ad69f87dd2f1a3ad2be4588d..c8309705c091417af59f1f29fe6882201d27c67b 100644 (file)
@@ -1011,12 +1011,21 @@ descrambler_descramble ( service_t *t,
 
   lock_assert(&t->s_stream_mutex);
 
-  if (dr == NULL || dr->dr_external) {
+  if (dr == NULL) {
     if ((tsb[3] & 0x80) == 0) {
       ts_recv_packet0((mpegts_service_t *)t, st, tsb, len);
       return 1;
     }
-    return dr && dr->dr_external ? 1 : -1;
+    return -1;
+  }
+
+  if (dr->dr_descramble)
+    return dr->dr_descramble(dr->dr_descrambler, tsb, len);
+
+  if (dr->dr_external) {
+    if ((tsb[3] & 0x80) == 0)
+      ts_recv_packet0((mpegts_service_t *)t, st, tsb, len);
+    return 1;
   }
 
   if (!dr->dr_key_multipid) {