]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
linuxdvb_ca: check for CAIDs on the ES level, fixes #2794
authorDamjan Marion <damjan.marion@gmail.com>
Mon, 27 Apr 2015 00:29:47 +0000 (00:29 +0000)
committerJaroslav Kysela <perex@perex.cz>
Wed, 29 Apr 2015 06:40:14 +0000 (08:40 +0200)
src/descrambler/dvbcam.c
src/input/mpegts/dvb_psi.c

index 6990ec294184406e1292f0e86c5b22e94a4d1a54..03eaa4978be3b008617d0cf956e567befb4f63a0 100644 (file)
@@ -102,11 +102,12 @@ dvbcam_unregister_cam(linuxdvb_ca_t * lca, uint8_t slot)
 void
 dvbcam_pmt_data(mpegts_service_t *s, const uint8_t *ptr, int len)
 {
-       linuxdvb_frontend_t *lfe;
-       dvbcam_active_caid_t *ac;
-       dvbcam_active_service_t *as = NULL, *as2;
-       int i, l;
-       uint8_t *p;
+  linuxdvb_frontend_t *lfe;
+  dvbcam_active_caid_t *ac;
+  dvbcam_active_service_t *as = NULL, *as2;
+  elementary_stream_t *st;
+  caid_t *c;
+  int i;
 
        lfe = (linuxdvb_frontend_t*) s->s_dvb_active_input;
 
@@ -134,34 +135,26 @@ dvbcam_pmt_data(mpegts_service_t *s, const uint8_t *ptr, int len)
   as->last_pmt_len = len + 3;
   as->ca = NULL;
 
-       l = (ptr[7] & 0x03 )| ptr[8];
-       p = (uint8_t *) ptr + 9;
-
-       while (l > 0 ) {
-    uint8_t desc_tag = p[0];
-    uint8_t desc_len = p[1];
-
-   if (desc_tag == DVB_DESC_CA) {
-      uint16_t caid = (p[2] << 8) | p[3];
-
-      pthread_mutex_lock(&dvbcam_mutex);
+  pthread_mutex_lock(&dvbcam_mutex);
 
+  /* check all ellementary streams for CAIDs, if any send PMT to CAM */
+  TAILQ_FOREACH(st, &s->s_components, es_link) {
+    LIST_FOREACH(c, &st->es_caids, link) {
       TAILQ_FOREACH(ac, &dvbcam_active_caids, link) {
         for(i=0;i<ac->num_caids;i++) {
           if(ac->ca && ac->ca->lca_adapter == lfe->lfe_adapter &&
-             ac->caids[i] == caid)
+             ac->caids[i] == c->caid)
           {
             as->ca = ac->ca;
             as->slot = ac->slot;
-                 break;
+            break;
           }
-             }
+        }
       }
-                       pthread_mutex_unlock(&dvbcam_mutex);
-               }
-               p += desc_len + 2;
-               l -= desc_len + 2;
-       }
+    }
+  }
+
+  pthread_mutex_unlock(&dvbcam_mutex);
 
   /* this service doesn't have assigned CAM */
   if (!as->ca)
index 6cf901286c2a08ad85f8b31ffd7dc9bee1d76e69..ac888ef3e37e85d928fcfcd66c264acc0d27de0a 100644 (file)
@@ -988,10 +988,6 @@ dvb_pmt_callback
     if (s->s_dvb_service_id == sid) break;
   if (!s) return -1;
 
-#if ENABLE_LINUXDVB_CA
-  dvbcam_pmt_data(s, ptr, len);
-#endif
-
   /* Process */
   tvhdebug("pmt", "sid %04X (%d)", sid, sid);
   pthread_mutex_lock(&s->s_stream_mutex);
@@ -1000,6 +996,10 @@ dvb_pmt_callback
   if (r)
     service_restart((service_t*)s);
 
+#if ENABLE_LINUXDVB_CA
+  dvbcam_pmt_data(s, ptr, len);
+#endif
+
   /* Finish */
   return dvb_table_end((mpegts_psi_table_t *)mt, st, sect);
 }