]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
subscription: Move TSS_NO_ACCESS outside of the fatal errors
authorJaroslav Kysela <perex@perex.cz>
Thu, 18 Sep 2014 13:22:02 +0000 (15:22 +0200)
committerJaroslav Kysela <perex@perex.cz>
Thu, 18 Sep 2014 13:41:26 +0000 (15:41 +0200)
... but keep to report it as the first reason for which the streaming
was canceled ...

Remove also the 25-seconds descrambler check. There is a global
streaming timeout which takes care now.

src/descrambler.h
src/descrambler/descrambler.c
src/service.c
src/service.h

index 36c7a52dc4d06809e892a9e8fbc3228402a818e3..12fb20d892bdb342bbd968a4818870eaaf295c75 100755 (executable)
@@ -60,7 +60,6 @@ typedef struct th_descrambler {
 } th_descrambler_t;
 
 typedef struct th_descrambler_runtime {
-  time_t   dr_last_descramble;
   uint32_t dr_key:1;
   uint32_t dr_key_first:1;
   uint8_t  dr_key_index;
index d57567ca460a8dc9ce4810cd681110d861a9886f..602f51725eff9b49fc8e37bb01a3cc03ef3745f5 100755 (executable)
@@ -133,7 +133,6 @@ descrambler_service_start ( service_t *t )
     t->s_descramble = dr = calloc(1, sizeof(th_descrambler_runtime_t));
     sbuf_init(&dr->dr_buf);
     dr->dr_key_index = 0xff;
-    dr->dr_last_descramble = dispatch_clock;
   }
 }
 
@@ -362,8 +361,8 @@ descrambler_descramble ( service_t *t,
         td->td_csa->csa_descramble(td->td_csa,
                                    (mpegts_service_t *)td->td_service,
                                    tsb2);
-        dr->dr_last_descramble = dispatch_clock;
       }
+      service_reset_streaming_status_flags(t, TSS_NO_ACCESS);
       sbuf_free(&dr->dr_buf);
     }
     ki = tsb[3];
@@ -396,7 +395,7 @@ descrambler_descramble ( service_t *t,
     td->td_csa->csa_descramble(td->td_csa,
                                (mpegts_service_t *)td->td_service,
                                tsb);
-    dr->dr_last_descramble = dispatch_clock;
+    service_reset_streaming_status_flags(t, TSS_NO_ACCESS);
     return 1;
 next:
     flush_data = 1;
@@ -446,12 +445,13 @@ next2:
         }
       }
       sbuf_append(&dr->dr_buf, tsb, 188);
+      service_set_streaming_status_flags(t, TSS_NO_ACCESS);
     }
+  } else {
+    service_set_streaming_status_flags(t, TSS_NO_ACCESS);
   }
   if (flush_data)
     descrambler_flush_table_data(t);
-  if (dr->dr_last_descramble + 25 < dispatch_clock)
-    return -1;
   if (count && count == failed)
     return -1;
   return count;
index 639cb91ac2ade81ab1d2e711b8cdfa5d520e4416..68f4f87e8796c33e96bea667bf1697a59d467871 100644 (file)
@@ -1120,29 +1120,24 @@ service_servicetype_txt ( service_t *s )
 void
 service_set_streaming_status_flags_(service_t *t, int set)
 {
-  int n;
   streaming_message_t *sm;
   lock_assert(&t->s_stream_mutex);
 
-  n = t->s_streaming_status;
-  
-  n |= set;
-
-  if(n == t->s_streaming_status)
+  if(set == t->s_streaming_status)
     return; // Already set
 
-  t->s_streaming_status = n;
+  t->s_streaming_status = set;
 
   tvhlog(LOG_DEBUG, "service", "%s: Status changed to %s%s%s%s%s%s%s%s",
         service_nicename(t),
-        n & TSS_INPUT_HARDWARE ? "[Hardware input] " : "",
-        n & TSS_INPUT_SERVICE  ? "[Input on service] " : "",
-        n & TSS_MUX_PACKETS    ? "[Demuxed packets] " : "",
-        n & TSS_PACKETS        ? "[Reassembled packets] " : "",
-        n & TSS_NO_DESCRAMBLER ? "[No available descrambler] " : "",
-        n & TSS_NO_ACCESS      ? "[No access] " : "",
-        n & TSS_GRACEPERIOD    ? "[Graceperiod expired] " : "",
-        n & TSS_TIMEOUT        ? "[Data timeout] " : "");
+        set & TSS_INPUT_HARDWARE ? "[Hardware input] " : "",
+        set & TSS_INPUT_SERVICE  ? "[Input on service] " : "",
+        set & TSS_MUX_PACKETS    ? "[Demuxed packets] " : "",
+        set & TSS_PACKETS        ? "[Reassembled packets] " : "",
+        set & TSS_NO_DESCRAMBLER ? "[No available descrambler] " : "",
+        set & TSS_NO_ACCESS      ? "[No access] " : "",
+        set & TSS_GRACEPERIOD    ? "[Graceperiod expired] " : "",
+        set & TSS_TIMEOUT        ? "[Data timeout] " : "");
 
   sm = streaming_msg_create_code(SMT_SERVICE_STATUS,
                                 t->s_streaming_status);
index 6707daa9f0030ac51aee0b44a66b72993f0f2adb..d7706e4fdb191bbd4fa9301fe25c8f087332702b 100644 (file)
@@ -379,13 +379,13 @@ typedef struct service {
 #define TSS_INPUT_SERVICE    0x2
 #define TSS_MUX_PACKETS      0x4
 #define TSS_PACKETS          0x8
+#define TSS_NO_ACCESS        0x10
 
 #define TSS_GRACEPERIOD      0x8000
 
   // Errors
 #define TSS_NO_DESCRAMBLER   0x10000
-#define TSS_NO_ACCESS        0x20000
-#define TSS_TIMEOUT          0x40000
+#define TSS_TIMEOUT          0x20000
 
 #define TSS_ERRORS           0xffff0000
 
@@ -506,8 +506,17 @@ void service_set_streaming_status_flags_(service_t *t, int flag);
 static inline void
 service_set_streaming_status_flags(service_t *t, int flag)
 {
-  if ((t->s_streaming_status & flag) != flag)
-    service_set_streaming_status_flags_(t, flag);
+  int n = t->s_streaming_status;
+  if ((n & flag) != flag)
+    service_set_streaming_status_flags_(t, n | flag);
+}
+
+static inline void
+service_reset_streaming_status_flags(service_t *t, int flag)
+{
+  int n = t->s_streaming_status;
+  if ((n & flag) != 0)
+    service_set_streaming_status_flags_(t, n & ~flag);
 }
 
 struct streaming_start;