]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts: ensure scrambled streams are properly handled
authorAdam Sutton <dev@adamsutton.me.uk>
Mon, 14 Apr 2014 15:58:00 +0000 (16:58 +0100)
committerAdam Sutton <dev@adamsutton.me.uk>
Mon, 14 Apr 2014 16:51:03 +0000 (17:51 +0100)
If a scrambled has been seen on a "scrambled" channel all further packets
(within the subscription) MUST be processed through the descrambler else we
can end up with out of sequence packets causing CC errors. Relates to #1986

src/input/mpegts/dvb_psi.c
src/input/mpegts/tsdemux.c
src/service.c
src/service.h

index 5b65f3a3918581bd7989599caa0a05f1bc3b7ac0..f4ce6b1145050532d023bd8859494e73ab7e7bfc 100644 (file)
@@ -952,12 +952,6 @@ dvb_sdt_callback
         s->s_servicetype = r;
     }
     
-    /* Update scrambled state */
-    if (s->s_scrambled != free_ca_mode) {
-      s->s_scrambled   = free_ca_mode;
-      tvhtrace("sdt", "    scrambled changed");
-    }
-  
     /* Check if this is master 
      * Some networks appear to provide diff service names on diff transponders
      */
index fea2045f8fc5a0e667a69842d9044c52bdeaa154..a9277f269eafe16be22089afe107684267308ee2 100644 (file)
@@ -239,7 +239,7 @@ ts_recv_packet1
      * Lock for descrambling, but only if packet was not in error
      */
     if(!error)
-      t->s_scrambled_seen = t->s_scrambled;
+      t->s_scrambled_seen |= service_is_encrypted((service_t*)t);
 
     /* scrambled stream */
     n = m = 0;
@@ -257,7 +257,7 @@ ts_recv_packet1
         m++;
     }
 
-    if(!error && t->s_scrambled != 0) {
+    if(!error && service_is_encrypted((service_t*)t) != 0) {
       if(n == 0) {
         service_set_streaming_status_flags((service_t*)t, TSS_NO_DESCRAMBLER);
       } else if(m == n) {
index 1a9cb7ef31f98b1458274bf21388796392b215b3..359419a0987c6dc086553098b35520892369e504 100644 (file)
@@ -334,6 +334,7 @@ service_start(service_t *t, int instance)
 
   assert(t->s_status != SERVICE_RUNNING);
   t->s_streaming_status = 0;
+  t->s_scrambled_seen   = 0;
 
   if((r = t->s_start_feed(t, instance)))
     return r;
index f572a217a394372686754385784cb15c518f6779..f321a4551170aac08d5ec163805057ec4017f344 100644 (file)
@@ -397,7 +397,6 @@ typedef struct service {
    */
 
   struct th_descrambler_list s_descramblers;
-  int s_scrambled;
   int s_scrambled_seen;
   int s_caid;
   uint16_t s_prefcapid;