]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
ddci: open only required ECM PIDs
authorJaroslav Kysela <perex@perex.cz>
Thu, 16 Nov 2017 12:31:38 +0000 (13:31 +0100)
committerJaroslav Kysela <perex@perex.cz>
Thu, 16 Nov 2017 12:31:38 +0000 (13:31 +0100)
src/descrambler/dvbcam.c
src/input/mpegts.h
src/input/mpegts/mpegts_input.c

index eb68e13224d545fbba97e96e031a10b6c26a5694..c417f5517456ba1f965cf29a2577d67414f33074 100644 (file)
@@ -333,7 +333,7 @@ dvbcam_service_start(caclient_t *cac, service_t *t)
   dvbcam_active_cam_t *ac = NULL;
   th_descrambler_t *td;
   elementary_stream_t *st;
-  caid_t *c;
+  caid_t *c = NULL;
   int count = 0;
   char buf[128];
 
@@ -371,7 +371,6 @@ end_of_search_for_cam:
   if (ac == NULL)
     goto end;
 
-
 #if ENABLE_DDCI
   /* currently we allow only one service per DD CI */
   if (ac->ca->lddci && linuxdvb_ddci_is_assigned(ac->ca->lddci)) {
@@ -395,6 +394,7 @@ end_of_search_for_cam:
 #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);
@@ -402,6 +402,10 @@ end_of_search_for_cam:
       dr->dr_descrambler = td;
       dr->dr_descramble = dvbcam_descramble;
     }
+    assert(c);
+    mm = ((mpegts_service_t *)t)->s_dvb_mux;
+    mpegts_input_open_service_pid(mm->mm_active->mmi_input, mm, t,
+                                  SCT_CA, c->pid, MPS_WEIGHT_CA, 1);
   }
 #endif
   descrambler_change_keystate(td, DS_READY, 0);
index c0c0b56103861fd0dcf23a0e6768d3363097c852..a2cff3d8bbb5c7786564d04fb29b91cb5073be9c 100644 (file)
@@ -997,14 +997,20 @@ void mpegts_input_save ( mpegts_input_t *mi, htsmsg_t *c );
 void mpegts_input_flush_mux ( mpegts_input_t *mi, mpegts_mux_t *mm );
 
 mpegts_pid_t * mpegts_input_open_pid
-  ( mpegts_input_t *mi, mpegts_mux_t *mm, int pid, int type, int weight, void *owner, int reopen );
+  ( mpegts_input_t *mi, mpegts_mux_t *mm, int pid, int type, int weight,
+    void *owner, int reopen );
 
 int mpegts_input_close_pid
-  ( mpegts_input_t *mi, mpegts_mux_t *mm, int pid, int type, int weight, void *owner );
+  ( mpegts_input_t *mi, mpegts_mux_t *mm, int pid, int type, int weight,
+    void *owner );
 
 void mpegts_input_close_pids
   ( mpegts_input_t *mi, mpegts_mux_t *mm, void *owner, int all );
 
+int mpegts_input_open_service_pid
+  ( mpegts_input_t *mi, mpegts_mux_t *mm, service_t *s,
+    streaming_component_type_t stype, int pid, int weight, int create );
+
 #if ENABLE_TSDEBUG
 
 void tsdebug_started_mux(mpegts_input_t *mi, mpegts_mux_t *mm);
index a5a966c11bca7e2102e681334747330e2739d4ba..0975b0abc5eb9c87b5742f99ed62a7e5a2408a24 100644 (file)
@@ -23,9 +23,6 @@
 #include "notify.h"
 #include "dbus.h"
 #include "memoryinfo.h"
-#if ENABLE_DDCI
-#include "descrambler/dvbcam.h"
-#endif
 
 memoryinfo_t mpegts_input_queue_memoryinfo = { .my_name = "MPEG-TS input queue" };
 memoryinfo_t mpegts_input_table_memoryinfo = { .my_name = "MPEG-TS table queue" };
@@ -634,6 +631,30 @@ mpegts_input_close_pid
   return 0;
 }
 
+int
+mpegts_input_open_service_pid
+  ( mpegts_input_t *mi, mpegts_mux_t *mm,
+    service_t *s, streaming_component_type_t stype,
+    int pid, int weight, int create )
+{
+  elementary_stream_t *es;
+
+  lock_assert(&s->s_stream_mutex);
+
+  es = NULL;
+  if (service_stream_find((service_t *)s, pid) == NULL) {
+    if (!create)
+      return -1;
+    es = service_stream_create(s, pid, stype);
+    es->es_pid_opened = 1;
+  }
+  if (es && mm->mm_active) {
+    mpegts_input_open_pid(mi, mm, pid,
+                          MPS_SERVICE, weight, s, 0);
+  }
+  return 0;
+}
+
 static void
 mpegts_input_update_pids
   ( mpegts_input_t *mi, mpegts_mux_t *mm )
@@ -664,7 +685,6 @@ mpegts_input_cat_pass_callback
   mpegts_mux_t             *mm  = mt->mt_mux;
   mpegts_psi_table_state_t *st  = NULL;
   service_t                *s   = mt->mt_opaque;
-  elementary_stream_t      *es;
   mpegts_input_t           *mi;
 
   /* Start */
@@ -689,18 +709,12 @@ mpegts_input_cat_pass_callback
           pid  = ((ptr[2] & 0x1f) << 8) | ptr[3];
           tvhdebug(LS_TBL_BASE, "cat:  pass: caid %04X (%d) pid %04X (%d)",
                    (uint16_t)caid, (uint16_t)caid, pid, pid);
-          pthread_mutex_lock(&s->s_stream_mutex);
-          es = NULL;
-          if (service_stream_find((service_t *)s, pid) == NULL) {
-            es = service_stream_create(s, pid, SCT_CA);
-            es->es_pid_opened = 1;
-          }
-          pthread_mutex_unlock(&s->s_stream_mutex);
-          if (es && mm->mm_active && (mi = mm->mm_active->mmi_input) != NULL) {
+          mi = mm->mm_active ? mm->mm_active->mmi_input : NULL;
+          if (mi) {
             pthread_mutex_lock(&mi->mi_output_lock);
-            if ((mi = mm->mm_active->mmi_input) != NULL)
-              mpegts_input_open_pid(mi, mm, pid,
-                                    MPS_SERVICE, MPS_WEIGHT_CAT, s, 0);
+            pthread_mutex_lock(&s->s_stream_mutex);
+            mpegts_input_open_service_pid(mi, mm, s, SCT_CA, pid, MPS_WEIGHT_CAT, 1);
+            pthread_mutex_unlock(&s->s_stream_mutex);
             pthread_mutex_unlock(&mi->mi_output_lock);
           }
         }
@@ -726,12 +740,6 @@ mpegts_input_open_service
   mpegts_apids_t *pids;
   mpegts_apid_t *p;
   int i, reopen = !init;
-#if ENABLE_DDCI
-  int is_ddci = dvbcam_is_ddci((service_t*)s);
-#define IS_DDCI  is_ddci
-#else
-#define IS_DDCI  0
-#endif
 
   /* Add to list */
   pthread_mutex_lock(&mi->mi_output_lock);
@@ -748,11 +756,11 @@ mpegts_input_open_service
 
     mpegts_input_open_pid(mi, mm, s->s_pmt_pid, MPS_SERVICE, MPS_WEIGHT_PMT, s, reopen);
     mpegts_input_open_pid(mi, mm, s->s_pcr_pid, MPS_SERVICE, MPS_WEIGHT_PCR, s, reopen);
-    if (IS_DDCI || s->s_scrambled_pass)
+    if (s->s_scrambled_pass)
       mpegts_input_open_pid(mi, mm, DVB_CAT_PID, MPS_SERVICE, MPS_WEIGHT_CAT, s, reopen);
     /* Open only filtered components here */
     TAILQ_FOREACH(st, &s->s_filt_components, es_filt_link)
-      if ((IS_DDCI || s->s_scrambled_pass || st->es_type != SCT_CA) &&
+      if ((s->s_scrambled_pass || st->es_type != SCT_CA) &&
           st->es_pid != s->s_pmt_pid && st->es_pid != s->s_pcr_pid) {
         st->es_pid_opened = 1;
         mpegts_input_open_pid(mi, mm, st->es_pid, MPS_SERVICE, mpegts_mps_weight(st), s, reopen);
@@ -787,7 +795,7 @@ no_pids:
       mpegts_table_add(mm, DVB_PMT_BASE, DVB_PMT_MASK,
                        dvb_pmt_callback, s, "pmt", LS_TBL_BASE,
                        MT_CRC, s->s_pmt_pid, MPS_WEIGHT_PMT);
-    if (IS_DDCI || (s->s_scrambled_pass && (flags & SUBSCRIPTION_EMM) != 0)) {
+    if (s->s_scrambled_pass && (flags & SUBSCRIPTION_EMM) != 0) {
       s->s_cat_mon =
         mpegts_table_add(mm, DVB_CAT_BASE, DVB_CAT_MASK,
                          mpegts_input_cat_pass_callback, s, "cat",
@@ -804,12 +812,6 @@ mpegts_input_close_service ( mpegts_input_t *mi, mpegts_service_t *s )
 {
   mpegts_mux_t *mm = s->s_dvb_mux;
   elementary_stream_t *st;
-#if ENABLE_DDCI
-  int is_ddci = dvbcam_is_ddci((service_t*)s);
-#define IS_DDCI  is_ddci
-#else
-#define IS_DDCI  0
-#endif
 
   /* Close PMT/CAT tables */
   if (s->s_type == STYPE_STD) {
@@ -835,7 +837,7 @@ mpegts_input_close_service ( mpegts_input_t *mi, mpegts_service_t *s )
 
     mpegts_input_close_pid(mi, mm, s->s_pmt_pid, MPS_SERVICE, MPS_WEIGHT_PMT, s);
     mpegts_input_close_pid(mi, mm, s->s_pcr_pid, MPS_SERVICE, MPS_WEIGHT_PCR, s);
-    if (IS_DDCI || s->s_scrambled_pass)
+    if (s->s_scrambled_pass)
       mpegts_input_close_pid(mi, mm, DVB_CAT_PID, MPS_SERVICE, MPS_WEIGHT_CAT, s);
     /* Close all opened PIDs (the component filter may be changed at runtime) */
     TAILQ_FOREACH(st, &s->s_components, es_link) {