]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
descrambler: remove dr_external and use dr_descramble instead
authorJaroslav Kysela <perex@perex.cz>
Thu, 16 Nov 2017 12:57:35 +0000 (13:57 +0100)
committerJaroslav Kysela <perex@perex.cz>
Thu, 16 Nov 2017 12:57:35 +0000 (13:57 +0100)
src/descrambler.h
src/descrambler/descrambler.c
src/descrambler/dvbcam.c

index 99da06b1f825ceb6b2c5d61364ecb87a1b33371e..a887f56f3f4b8b3f0814b87d7d9423ddde9e068a 100644 (file)
@@ -87,7 +87,8 @@ typedef struct th_descrambler_key {
 typedef struct th_descrambler_runtime {
   th_descrambler_t *dr_descrambler;
   struct service *dr_service;
-  int    (*dr_descramble)(struct th_descrambler *td, const uint8_t *tsb, int len);
+  int    (*dr_descramble)(struct service *t, struct elementary_stream *st,
+                          const uint8_t *tsb, int len);
   int      dr_ca_count;
   int      dr_ca_resolved;
   int      dr_ca_failed;
@@ -186,7 +187,6 @@ 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 );
 int  descrambler_multi_pid     ( th_descrambler_t *t );
 void descrambler_keys          ( th_descrambler_t *t, int type, uint16_t pid,
                                  const uint8_t *even, const uint8_t *odd );
@@ -195,6 +195,8 @@ void descrambler_notify        ( th_descrambler_t *t,
                                  const char *cardsystem, uint16_t pid, uint32_t ecmtime,
                                  uint16_t hops, const char *reader, const char *from,
                                  const char *protocol );
+int  descrambler_pass          ( struct service *t, struct elementary_stream *st,
+                                 const uint8_t *tsb, int len );
 int  descrambler_descramble    ( struct service *t,
                                  struct elementary_stream *st,
                                  const uint8_t *tsb, int len );
index bcceb95ecb30b3112212147a879f4e64d4879d75..146155622db02592e7a4021638f23ff32fa128fe 100644 (file)
@@ -396,14 +396,10 @@ descrambler_service_start ( service_t *t )
     dr->dr_force_skip = 0;
   }
 
-  if (t->s_dvb_forcecaid != 0xffff)
+  if (t->s_dvb_forcecaid == 0xffff)
+    dr->dr_descramble = descrambler_pass;
+  else
     caclient_start(t);
-
-  if (t->s_dvb_forcecaid == 0xffff) {
-    pthread_mutex_lock(&t->s_stream_mutex);
-    descrambler_external(t, 1);
-    pthread_mutex_unlock(&t->s_stream_mutex);
-  }
 }
 
 void
@@ -530,22 +526,6 @@ 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)
-    return;
-
-  lock_assert(&t->s_stream_mutex);
-
-  if ((dr = t->s_descramble) == NULL)
-    return;
-  dr->dr_external = state ? 1 : 0;
-  service_reset_streaming_status_flags(t, TSS_NO_DESCRAMBLER);
-}
-
 int
 descrambler_multi_pid ( th_descrambler_t *td )
 {
@@ -982,6 +962,17 @@ ecm_reset( service_t *t, th_descrambler_runtime_t *dr )
   return ret;
 }
 
+int
+descrambler_pass ( service_t *t,
+                   elementary_stream_t *st,
+                   const uint8_t *tsb,
+                   int len )
+{
+  if ((tsb[3] & 0x80) == 0)
+    ts_recv_packet0((mpegts_service_t *)t, st, tsb, len);
+  return 1;
+}
+
 int
 descrambler_descramble ( service_t *t,
                          elementary_stream_t *st,
@@ -1009,13 +1000,7 @@ descrambler_descramble ( service_t *t,
   }
 
   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;
-  }
+    return dr->dr_descramble(t, st, tsb, len);
 
   if (!dr->dr_key_multipid) {
     tk = &dr->dr_keys[0];
index c417f5517456ba1f965cf29a2577d67414f33074..062963fd0bd374d36c6658cc911ccc70242731c9 100644 (file)
@@ -25,6 +25,7 @@
 #include "input.h"
 
 #include "dvbcam.h"
+#include "input/mpegts/tsdemux.h"
 #include "input/mpegts/linuxdvb/linuxdvb_private.h"
 
 #if ENABLE_LINUXDVB_CA
@@ -266,11 +267,10 @@ dvbcam_pmt_data(mpegts_service_t *s, const uint8_t *ptr, int len)
     list_mgmt = CA_LIST_MANAGEMENT_UPDATE;
   } else {
     list_mgmt = ac->active_programs ? CA_LIST_MANAGEMENT_ADD :
-                                    CA_LIST_MANAGEMENT_ONLY;
+                                      CA_LIST_MANAGEMENT_ONLY;
     ac->active_programs++;
   }
 
-  descrambler_external((service_t *)s, 1);
   linuxdvb_ca_enqueue_capmt(ac->ca, ac->slot, as->last_pmt, as->last_pmt_len,
                             list_mgmt, CA_PMT_CMD_ID_OK_DESCRAMBLING);
 done:
@@ -315,9 +315,10 @@ dvbcam_service_destroy(th_descrambler_t *td)
 
 #if ENABLE_DDCI
 static int
-dvbcam_descramble(struct th_descrambler *td, const uint8_t *tsb, int len)
+dvbcam_descramble_ddci(service_t *t, elementary_stream_t *st, const uint8_t *tsb, int len)
 {
-  dvbcam_active_service_t   *as = (dvbcam_active_service_t *)td;
+  th_descrambler_runtime_t  *dr = ((mpegts_service_t *)t)->s_descramble;
+  dvbcam_active_service_t   *as = (dvbcam_active_service_t *)dr->dr_descrambler;
   linuxdvb_ddci_t           *lddci = as->ac->ca->lddci;
 
   linuxdvb_ddci_put(lddci, tsb, len);
@@ -333,6 +334,8 @@ dvbcam_service_start(caclient_t *cac, service_t *t)
   dvbcam_active_cam_t *ac = NULL;
   th_descrambler_t *td;
   elementary_stream_t *st;
+  th_descrambler_runtime_t *dr;
+  mpegts_mux_t *mm;
   caid_t *c = NULL;
   int count = 0;
   char buf[128];
@@ -391,17 +394,15 @@ end_of_search_for_cam:
   td->td_nicename = strdup(buf);
   td->td_service = t;
   td->td_stop = dvbcam_service_destroy;
+  dr = t->s_descramble;
+  dr->dr_descrambler = td;
+  dr->dr_descramble = descrambler_pass;
 #if ENABLE_DDCI
   if (ac->ca->lddci) {
-    th_descrambler_runtime_t *dr = t->s_descramble;
-    mpegts_mux_t *mm;
-
     /* assign the service to the DD CI CAM */
     linuxdvb_ddci_assign(ac->ca->lddci, t);
-    if (dr) {
-      dr->dr_descrambler = td;
-      dr->dr_descramble = dvbcam_descramble;
-    }
+    dr->dr_descramble = dvbcam_descramble_ddci;
+    /* open ECM PID */
     assert(c);
     mm = ((mpegts_service_t *)t)->s_dvb_mux;
     mpegts_input_open_service_pid(mm->mm_active->mmi_input, mm, t,