]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
descrambler: add stop fcn and remove the loop from tsdemux
authorJaroslav Kysela <perex@perex.cz>
Fri, 30 May 2014 07:39:49 +0000 (09:39 +0200)
committerJaroslav Kysela <perex@perex.cz>
Tue, 10 Jun 2014 12:02:35 +0000 (14:02 +0200)
src/descrambler.h
src/descrambler/descrambler.c
src/input/mpegts/tsdemux.c
src/service.c

index 094a7f2e36a5f69633f3f4c659a8b5eb7337d429..4bfcd753eb047ba5df268c93c38c7fcc88c7fc84 100755 (executable)
@@ -85,7 +85,8 @@ LIST_HEAD(caid_list, caid);
 void descrambler_init          ( void );
 void descrambler_done          ( void );
 void descrambler_service_start ( struct service *t );
-int  descrambler_descramble    ( th_descrambler_t *td,
+void descrambler_service_stop  ( struct service *t );
+int  descrambler_descramble    ( struct service *t,
                                  struct elementary_stream *st,
                                  const uint8_t *tsb );
 const char *descrambler_caid2name( uint16_t caid );
index 2e6753b307d7f37bce9c4023ec999604b5b3f5da..4608a02dfebd13c9befd1f4ec30302b7fea79efe 100755 (executable)
@@ -134,19 +134,37 @@ descrambler_service_start ( service_t *t )
 #endif
 }
 
+void
+descrambler_service_stop ( service_t *t )
+{
+  th_descrambler_t *td;
+
+  while ((td = LIST_FIRST(&t->s_descramblers)) != NULL)
+    td->td_stop(td);
+}
+
 int
-descrambler_descramble ( th_descrambler_t *td,
+descrambler_descramble ( service_t *t,
                          struct elementary_stream *st,
                          const uint8_t *tsb )
 {
-  if (td->td_keystate == DS_FORBIDDEN)
+  th_descrambler_t *td;
+  int count, failed;
+
+  LIST_FOREACH(td, &t->s_descramblers, td_service_link) {
+    count++;
+    if (td->td_keystate == DS_FORBIDDEN) {
+      failed++;
+      continue;
+    }
+    if (td->td_keystate != DS_RESOLVED)
+      continue;
+    tvhcsa_descramble(td->td_csa,
+                      (struct mpegts_service *)td->td_service,
+                      st, tsb);
     return 1;
-  if (td->td_keystate != DS_RESOLVED)
-    return -1;
-  tvhcsa_descramble(td->td_csa,
-                    (struct mpegts_service *)td->td_service,
-                    st, tsb);
-  return 0;
+  }
+  return count == failed ? -1 : 0;
 }
 
 // TODO: might actually put const char* into caid_t
index 00f2210dcc4ceb9115da84a79a6c7983b1aabe58..f0dfa596c34261710e4901cd12743f51e1b0a34c 100644 (file)
@@ -175,8 +175,7 @@ ts_recv_packet1
   (mpegts_service_t *t, const uint8_t *tsb, int64_t *pcrp, int table)
 {
   elementary_stream_t *st;
-  int pid, n, m, r;
-  th_descrambler_t *td;
+  int pid, r;
   int error = 0;
   int64_t pcr = PTS_UNSET;
   
@@ -244,25 +243,16 @@ ts_recv_packet1
       t->s_scrambled_seen |= service_is_encrypted((service_t*)t);
 
     /* scrambled stream */
-    n = m = 0;
-
-    LIST_FOREACH(td, &t->s_descramblers, td_service_link) {
-      n++;
-      
-      r = descrambler_descramble(td, st, tsb);
-      if(r == 0) {
-        pthread_mutex_unlock(&t->s_stream_mutex);
-        return 1;
-      }
-
-      if(r == 1)
-        m++;
+    r = descrambler_descramble((service_t *)t, st, tsb);
+    if(r > 0) {
+      pthread_mutex_unlock(&t->s_stream_mutex);
+      return 1;
     }
 
-    if(!error && service_is_encrypted((service_t*)t) != 0) {
-      if(n == 0) {
+    if(!error && service_is_encrypted((service_t*)t)) {
+      if(r == 0) {
         service_set_streaming_status_flags((service_t*)t, TSS_NO_DESCRAMBLER);
-      } else if(m == n) {
+      } else {
         service_set_streaming_status_flags((service_t*)t, TSS_NO_ACCESS);
       }
     }
index a4705426ccaf01e567796bb927b05f9f98b11daa..479977ea827d9f8fe12b4347048ee4ff8a201bf6 100644 (file)
@@ -265,7 +265,6 @@ service_stream_destroy(service_t *t, elementary_stream_t *es)
 static void
 service_stop(service_t *t)
 {
-  th_descrambler_t *td;
   elementary_stream_t *st;
  
   gtimer_disarm(&t->s_receive_timer);
@@ -274,8 +273,7 @@ service_stop(service_t *t)
 
   pthread_mutex_lock(&t->s_stream_mutex);
 
-  while((td = LIST_FIRST(&t->s_descramblers)) != NULL)
-    td->td_stop(td);
+  descrambler_service_stop(t);
 
   t->s_tt_commercial_advice = COMMERCIAL_UNKNOWN;