]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
http streaming api: accept descramble=0 parameter, fixes #3142
authorJaroslav Kysela <perex@perex.cz>
Fri, 9 Oct 2015 13:11:40 +0000 (15:11 +0200)
committerJaroslav Kysela <perex@perex.cz>
Fri, 9 Oct 2015 13:11:40 +0000 (15:11 +0200)
src/descrambler/descrambler.c
src/input/mpegts/tsdemux.c
src/service.c
src/service.h
src/subscriptions.h
src/webui/webui.c

index 660cf74e3b9e20e34f58e84cb5d32d6a26337537..c682161c5ad1b07f8b05a6f65b1511d1971e24c7 100644 (file)
@@ -112,6 +112,9 @@ descrambler_service_start ( service_t *t )
   th_descrambler_runtime_t *dr;
   elementary_stream_t *st;
 
+  if (t->s_scrambled_pass)
+    return;
+
   if (!((mpegts_service_t *)t)->s_dvb_forcecaid) {
 
     TAILQ_FOREACH(st, &t->s_filt_components, es_filt_link)
index 0ba1e7ee608b7ee9c7785b7ef65ad6a22242b87a..26e8237fbde3eeaeeaed17a3a133d9ca604dc593 100644 (file)
@@ -100,6 +100,9 @@ ts_recv_packet0
     if (st->es_type == SCT_CA)
       continue;
 
+    if (tsb[3] & 0xc0) /* scrambled */
+      continue;
+
     if(!streaming_pad_probe_type(&t->s_streaming_pad, SMT_PACKET))
       continue;
 
@@ -172,8 +175,9 @@ ts_recv_packet1
 
   avgstat_add(&t->s_rate, len, dispatch_clock);
 
-  if((tsb[3] & 0xc0) ||
-      (t->s_scrambled_seen && st && st->es_type != SCT_CA)) {
+  if(!t->s_scrambled_pass &&
+     ((tsb[3] & 0xc0) ||
+       (t->s_scrambled_seen && st && st->es_type != SCT_CA))) {
 
     /**
      * Lock for descrambling, but only if packet was not in error
index 7d9bb1c110c8fa86838425ec302ea78169afbc99..74cd125e13ca0c378d65d30847b7b611281dc77f 100644 (file)
@@ -608,6 +608,7 @@ service_start(service_t *t, int instance, int weight, int flags,
   t->s_streaming_status = 0;
   t->s_streaming_live   = 0;
   t->s_scrambled_seen   = 0;
+  t->s_scrambled_pass   = !!(flags & SUBSCRIPTION_NODESCR);
   t->s_start_time       = dispatch_clock;
 
   pthread_mutex_lock(&t->s_stream_mutex);
index 82dd15acccb60dcce2a148fad9e14dc349c9eae3..67c733ce0916b7733743dddf695d08a7c82449a3 100644 (file)
@@ -445,7 +445,8 @@ typedef struct service {
    */
 
   struct th_descrambler_list s_descramblers;
-  uint16_t s_scrambled_seen;
+  uint8_t s_scrambled_seen;
+  uint8_t s_scrambled_pass;
   th_descrambler_runtime_t *s_descramble;
 
   /**
index 7f5da43517e8f13754b0c5c107890b9a39e11c29..3ce5442884e55626dc3f5d1d967e1f9dadd0879d 100644 (file)
@@ -35,6 +35,7 @@ extern struct th_subscription_list subscriptions;
 #define SUBSCRIPTION_ONESHOT    0x080
 #define SUBSCRIPTION_TABLES     0x100
 #define SUBSCRIPTION_MINIMAL    0x200
+#define SUBSCRIPTION_NODESCR    0x400 ///< no decramble
 #define SUBSCRIPTION_INITSCAN  0x1000 ///< for mux subscriptions
 #define SUBSCRIPTION_IDLESCAN  0x2000 ///< for mux subscriptions
 #define SUBSCRIPTION_USERSCAN  0x4000 ///< for mux subscriptions
index 32ff121ff65b32773b0f17f0de4e437ea7c7e85a..11558f6fddfd300ee3452f689050b9c7d91401de 100644 (file)
@@ -1052,14 +1052,21 @@ http_stream_service(http_connection_t *hc, service_t *service, int weight)
   const char *name;
   void *tcp_id;
   int res = HTTP_STATUS_SERVICE;
+  int flags, eflags = 0;
 
   if(http_access_verify(hc, ACCESS_ADVANCED_STREAMING))
     return HTTP_STATUS_UNAUTHORIZED;
 
+  if ((str = http_arg_get(&hc->hc_req_args, "descramble")))
+    if (strcmp(str ?: "", "0") == 0)
+      eflags |= SUBSCRIPTION_NODESCR;
+
+  flags = SUBSCRIPTION_MPEGTS | eflags;
+  if ((eflags & SUBSCRIPTION_NODESCR) == 0)
+    flags |= SUBSCRIPTION_PACKET;
   if(!(pro = profile_find_by_list(hc->hc_access->aa_profiles,
                                   http_arg_get(&hc->hc_req_args, "profile"),
-                                  "service",
-                                  SUBSCRIPTION_PACKET | SUBSCRIPTION_MPEGTS)))
+                                  "service", flags)))
     return HTTP_STATUS_NOT_ALLOWED;
 
   if((tcp_id = http_stream_preop(hc)) == NULL)
@@ -1074,7 +1081,8 @@ http_stream_service(http_connection_t *hc, service_t *service, int weight)
   if (!profile_chain_open(&prch, NULL, 0, qsize)) {
 
     s = subscription_create_from_service(&prch, NULL, weight, "HTTP",
-                                         prch.prch_flags | SUBSCRIPTION_STREAMING,
+                                         prch.prch_flags | SUBSCRIPTION_STREAMING |
+                                           eflags,
                                          hc->hc_peer_ipstr,
                                         hc->hc_username,
                                         http_arg_get(&hc->hc_args, "User-Agent"),