]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
descrambled: fix forcecaid handling, fixes #4215
authorJaroslav Kysela <perex@perex.cz>
Tue, 14 Feb 2017 15:49:49 +0000 (16:49 +0100)
committerJaroslav Kysela <perex@perex.cz>
Tue, 14 Feb 2017 15:49:49 +0000 (16:49 +0100)
src/descrambler/descrambler.c
src/input/mpegts.h
src/input/mpegts/tsdemux.c
src/service.c
src/service.h

index 63210892b5052d70d9113cb0d54cb1ee503f9289..d58cbe984b82abec8e761c95e06a45edc05c2c9b 100644 (file)
@@ -244,7 +244,7 @@ descrambler_service_start ( service_t *t )
   if (t->s_scrambled_pass)
     return;
 
-  if (!((mpegts_service_t *)t)->s_dvb_forcecaid) {
+  if (!t->s_dvb_forcecaid) {
 
     count = 0;
     TAILQ_FOREACH(st, &t->s_filt_components, es_filt_link)
@@ -266,7 +266,7 @@ descrambler_service_start ( service_t *t )
 
     if (constcw_table) {
       for (p = constcw_table; *p; p++)
-        if (*p == ((mpegts_service_t *)t)->s_dvb_forcecaid) {
+        if (*p == t->s_dvb_forcecaid) {
           constcw = 1;
           break;
         }
@@ -288,13 +288,15 @@ descrambler_service_start ( service_t *t )
     dr->dr_force_skip = 0;
     tvhcsa_init(&dr->dr_csa);
   }
-  caclient_start(t);
+
+  if (t->s_dvb_forcecaid != 0xffff)
+    caclient_start(t);
 
 #if ENABLE_LINUXDVB_CA
   dvbcam_service_start(t);
 #endif
 
-  if (((mpegts_service_t *)t)->s_dvb_forcecaid == 0xffff) {
+  if (t->s_dvb_forcecaid == 0xffff) {
     pthread_mutex_lock(&t->s_stream_mutex);
     descrambler_external(t, 1);
     pthread_mutex_unlock(&t->s_stream_mutex);
index d7fb16130db1fdb725adb13f1d6675df2ae57b56..0345a3edbc99189e161911c9effa734f36cdf91f 100644 (file)
@@ -578,7 +578,6 @@ struct mpegts_service
   char    *s_dvb_charset;
   uint16_t s_dvb_prefcapid;
   int      s_dvb_prefcapid_lock;
-  uint16_t s_dvb_forcecaid;
   time_t   s_dvb_created;
   time_t   s_dvb_last_seen;
   time_t   s_dvb_check_seen;
index 81ab9c98668ff0ba35911843b8a89740d35be295..bd4e6cd1d52b62eb52c9e625a1733245b0e183cf 100644 (file)
@@ -179,8 +179,9 @@ ts_recv_packet1
   (mpegts_service_t *t, const uint8_t *tsb, int len, int table)
 {
   elementary_stream_t *st;
-  int pid, r;
-  int error = 0;
+  int_fast16_t pid;
+  uint_fast8_t scrambled, error = 0;
+  int r;
   
   /* Error */
   if (tsb[1] & 0x80)
@@ -218,14 +219,14 @@ ts_recv_packet1
   if(!error)
     service_set_streaming_status_flags((service_t*)t, TSS_INPUT_SERVICE);
 
+  scrambled = t->s_scrambled_seen;
   if(!t->s_scrambled_pass &&
-     ((tsb[3] & 0xc0) ||
-       (t->s_scrambled_seen && st && st->es_type != SCT_CA))) {
+     ((tsb[3] & 0xc0) || (scrambled && st && st->es_type != SCT_CA))) {
 
     /**
      * Lock for descrambling, but only if packet was not in error
      */
-    if(!error)
+    if(!scrambled && !error)
       t->s_scrambled_seen |= service_is_encrypted((service_t*)t);
 
     /* scrambled stream */
index 340880b9d49017a96e1524833118f2a770f2a1f7..7a760b8c511c170da9576535f595804f47d2c87c 100644 (file)
@@ -1332,6 +1332,10 @@ int
 service_is_encrypted(service_t *t)
 {
   elementary_stream_t *st;
+  if (((mpegts_service_t *)t)->s_dvb_forcecaid == 0xffff)
+    return 0;
+  if (((mpegts_service_t *)t)->s_dvb_forcecaid)
+    return 1;
   TAILQ_FOREACH(st, &t->s_components, es_link)
     if (st->es_type == SCT_CA)
       return 1;
index 390adf0d7617228edbace92d0c3ae309e2e5ac02..658a57782dabcc2ea2514c13f9dd1ff1932d6b8c 100644 (file)
@@ -457,6 +457,7 @@ typedef struct service {
    * Descrambling support
    */
 
+  uint16_t s_dvb_forcecaid;
   struct th_descrambler_list s_descramblers;
   uint8_t s_scrambled_seen;
   uint8_t s_scrambled_pass;