]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
descrambler: DVBCAM (HW CAM) - do not try to use sw descrambler for HW CAM CAIDs
authorJaroslav Kysela <perex@perex.cz>
Sat, 15 Oct 2016 20:09:27 +0000 (22:09 +0200)
committerJaroslav Kysela <perex@perex.cz>
Sat, 15 Oct 2016 20:09:27 +0000 (22:09 +0200)
src/descrambler.h
src/descrambler/descrambler.c
src/descrambler/dvbcam.c

index f6367b36a2fed8b02a8ed5b2a750f1f20685b226..7060469ecdea64b6aebdc0804c9aefcf393732e8 100644 (file)
@@ -64,6 +64,7 @@ typedef struct th_descrambler {
 typedef struct th_descrambler_runtime {
   struct service *dr_service;
   tvhcsa_t dr_csa;
+  uint32_t dr_external:1;
   uint32_t dr_skip:1;
   uint32_t dr_quick_ecm:1;
   uint32_t dr_key:1;
@@ -155,6 +156,7 @@ void descrambler_service_start ( struct service *t );
 void descrambler_service_stop  ( struct service *t );
 void descrambler_caid_changed  ( struct service *t );
 int  descrambler_resolved      ( struct service *t, th_descrambler_t *ignore );
+void descrambler_external      ( struct service *t, int state );
 void descrambler_keys          ( th_descrambler_t *t, int type,
                                  const uint8_t *even, const uint8_t *odd );
 void descrambler_notify        ( th_descrambler_t *t,
index 6de934a93d787db698ee638672f7358864d53e48..59d6976787a0e853e5c80602dfb9c519f9faa5de 100644 (file)
@@ -417,6 +417,16 @@ descrambler_resolved( service_t *t, th_descrambler_t *ignore )
   return 0;
 }
 
+void
+descrambler_external ( service_t *t, int state )
+{
+  th_descrambler_runtime_t *dr;
+
+  if (t == NULL || (dr = t->s_descramble) == NULL)
+    return;
+  dr->dr_external = state ? 1 : 0;
+}
+
 void
 descrambler_keys ( th_descrambler_t *td, int type,
                    const uint8_t *even, const uint8_t *odd )
@@ -667,12 +677,12 @@ descrambler_descramble ( service_t *t,
 
   lock_assert(&t->s_stream_mutex);
 
-  if (dr == NULL) {
+  if (dr == NULL || dr->dr_external) {
     if ((tsb[3] & 0x80) == 0) {
       ts_recv_packet2((mpegts_service_t *)t, tsb, len);
       return 1;
     }
-    return -1;
+    return dr->dr_external ? 1 : -1;
   }
 
   if (dr->dr_csa.csa_type == DESCRAMBLER_NONE && dr->dr_queue_total == 0)
index 2372890828a224647ef0ed30f9d36b62988b09f5..dd71599d0fcb3a6c8791266aaf6ad12924a1b708 100644 (file)
@@ -19,6 +19,7 @@
 #include <ctype.h>
 #include "tvheadend.h"
 #include "caclient.h"
+#include "descrambler.h"
 #include "service.h"
 #include "input.h"
 
@@ -185,9 +186,11 @@ end_of_search_for_cam:
     list_mgmt = CA_LIST_MANAGEMENT_ONLY;
 
 enqueue:
-  if (as->ca)
+  if (as->ca) {
+    descrambler_external((service_t *)s, 1);
     linuxdvb_ca_enqueue_capmt(as->ca, as->slot, as->last_pmt, as->last_pmt_len,
                               list_mgmt, CA_PMT_CMD_ID_OK_DESCRAMBLING);
+  }
 done:
   pthread_mutex_unlock(&dvbcam_mutex);
 }