]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
SAT>IP Server: more work on the descrambling
authorJaroslav Kysela <perex@perex.cz>
Fri, 13 Mar 2015 08:45:36 +0000 (09:45 +0100)
committerJaroslav Kysela <perex@perex.cz>
Fri, 13 Mar 2015 09:18:52 +0000 (10:18 +0100)
17 files changed:
src/input/mpegts.h
src/input/mpegts/mpegts_input.c
src/input/mpegts/mpegts_pid.c
src/input/mpegts/mpegts_service.c
src/input/mpegts/tsdemux.c
src/profile.c
src/profile.h
src/queue.h
src/satip/rtp.c
src/satip/rtsp.c
src/satip/server.c
src/satip/server.h
src/service.c
src/service.h
src/webui/extjs.c
src/webui/static/app/config.js
src/webui/webui.c

index 92394c090695fabf8b1490a3caeb15edf16a5239..78c16cf2ebba2bf5c229b301407e4665fd6252d8 100644 (file)
@@ -87,8 +87,10 @@ struct mpegts_apids {
   int all;
 };
 
-int mpegts_pid_init ( mpegts_apids_t *pids, mpegts_apid_t *vals, int count );
+int mpegts_pid_init ( mpegts_apids_t *pids );
 void mpegts_pid_done ( mpegts_apids_t *pids );
+mpegts_apids_t *mpegts_pid_alloc ( void );
+void mpegts_pid_destroy ( mpegts_apids_t **pids );
 void mpegts_pid_reset ( mpegts_apids_t *pids );
 int mpegts_pid_add ( mpegts_apids_t *pids, mpegts_apid_t pid );
 int mpegts_pid_add_group ( mpegts_apids_t *pids, mpegts_apids_t *vals );
@@ -504,8 +506,19 @@ struct mpegts_service
 {
   service_t; // Parent
 
+  int (*s_update_pids)(mpegts_service_t *t, struct mpegts_apids *pids);
+  int (*s_link)(mpegts_service_t *master, mpegts_service_t *slave);
+  int (*s_unlink)(mpegts_service_t *master, mpegts_service_t *slave);
+
   int      s_dvb_subscription_flags;
 
+  mpegts_apids_t             *s_pids;
+  LIST_HEAD(, mpegts_service) s_masters;
+  LIST_ENTRY(mpegts_service)  s_masters_link;
+  LIST_HEAD(, mpegts_service) s_slaves;
+  LIST_ENTRY(mpegts_service)  s_slaves_link;
+  mpegts_apids_t             *s_slaves_pids;
+
   /*
    * Fields defined by DVB standard EN 300 468
    */
index f6533d2f9e3a4562174e66b9a19e01154dc22ed2..5b63864bce4dde9f90fb7eba34acf18e805a520d 100644 (file)
@@ -533,6 +533,7 @@ mpegts_input_open_service ( mpegts_input_t *mi, mpegts_service_t *s, int flags,
 {
   elementary_stream_t *st;
   mpegts_apids_t *pids;
+  mpegts_service_t *s2;
   int i;
 
   /* Add to list */
@@ -545,15 +546,30 @@ mpegts_input_open_service ( mpegts_input_t *mi, mpegts_service_t *s, int flags,
   /* Register PIDs */
   pthread_mutex_lock(&s->s_stream_mutex);
   if (s->s_type == STYPE_STD) {
+
+    pids = mpegts_pid_alloc();
+
     mi->mi_open_pid(mi, s->s_dvb_mux, s->s_pmt_pid, MPS_SERVICE, s);
     mi->mi_open_pid(mi, s->s_dvb_mux, s->s_pcr_pid, MPS_SERVICE, s);
+    mpegts_pid_add(pids, s->s_pmt_pid);
+    mpegts_pid_add(pids, s->s_pcr_pid);
     /* Open only filtered components here */
     TAILQ_FOREACH(st, &s->s_filt_components, es_filt_link) {
       if (st->es_type != SCT_CA) {
         st->es_pid_opened = 1;
         mi->mi_open_pid(mi, s->s_dvb_mux, st->es_pid, MPS_SERVICE, s);
+        mpegts_pid_add(pids, st->es_pid);
       }
     }
+
+    LIST_FOREACH(s2, &s->s_masters, s_masters_link) {
+      pthread_mutex_lock(&s2->s_stream_mutex);
+      mpegts_pid_add_group(s2->s_slaves_pids, pids);
+      pthread_mutex_unlock(&s2->s_stream_mutex);
+    }
+
+    mpegts_pid_destroy(&pids);
+
   } else {
     if ((pids = s->s_pids) != NULL) {
       if (pids->all) {
@@ -583,6 +599,8 @@ void
 mpegts_input_close_service ( mpegts_input_t *mi, mpegts_service_t *s )
 {
   elementary_stream_t *st;
+  mpegts_apids_t *pids;
+  mpegts_service_t *s2;
 
   /* Close PMT table */
   if (s->s_type == STYPE_STD && s->s_pmt_mon)
@@ -599,15 +617,30 @@ mpegts_input_close_service ( mpegts_input_t *mi, mpegts_service_t *s )
   /* Close PID */
   pthread_mutex_lock(&s->s_stream_mutex);
   if (s->s_type == STYPE_STD) {
+
+    pids = mpegts_pid_alloc();
+
     mi->mi_close_pid(mi, s->s_dvb_mux, s->s_pmt_pid, MPS_SERVICE, s);
     mi->mi_close_pid(mi, s->s_dvb_mux, s->s_pcr_pid, MPS_SERVICE, s);
+    mpegts_pid_del(pids, s->s_pmt_pid);
+    mpegts_pid_del(pids, s->s_pcr_pid);
     /* Close all opened PIDs (the component filter may be changed at runtime) */
     TAILQ_FOREACH(st, &s->s_components, es_link) {
       if (st->es_pid_opened) {
         st->es_pid_opened = 0;
         mi->mi_close_pid(mi, s->s_dvb_mux, st->es_pid, MPS_SERVICE, s);
+        mpegts_pid_del(pids, st->es_pid);
       }
     }
+
+    LIST_FOREACH(s2, &s->s_masters, s_masters_link) {
+      pthread_mutex_lock(&s2->s_stream_mutex);
+      mpegts_pid_del_group(s2->s_slaves_pids, pids);
+      pthread_mutex_unlock(&s2->s_stream_mutex);
+    }
+
+    mpegts_pid_destroy(&pids);
+
   } else {
     mpegts_input_close_pids(mi, s->s_dvb_mux, s);
   }
index 9e3a926375c096300b7c206095ea3d33aec368a4..99f1084033750b51851fe543b431b765b22fa3d1 100644 (file)
 #include "input.h"
 
 int
-mpegts_pid_init(mpegts_apids_t *pids, mpegts_apid_t *vals, int count)
+mpegts_pid_init(mpegts_apids_t *pids)
 {
-  int alloc = count + 32;
-  mpegts_apid_t *p = calloc(alloc, sizeof(*pids));
-
-  if (p == NULL)
-    return -1;
-  pids->pids = p;
-  pids->alloc = alloc;
-  pids->count = 0;
-  pids->all = 0;
-  if (vals) {
-    memcpy(p, vals, count * sizeof(*pids));
-    pids->count = count;
-  }
+  assert(pids);
+  memset(pids, 0, sizeof(*pids));
   return 0;
 }
 
@@ -48,6 +37,22 @@ mpegts_pid_done(mpegts_apids_t *pids)
   pids->alloc = pids->count = 0;
 }
 
+mpegts_apids_t *
+mpegts_pid_alloc(void)
+{
+  return calloc(1, sizeof(mpegts_apids_t));
+}
+
+void
+mpegts_pid_destroy(mpegts_apids_t **pids)
+{
+  if (pids) {
+    mpegts_pid_done(*pids);
+    free(*pids);
+    *pids = NULL;
+  }
+}
+
 void
 mpegts_pid_reset(mpegts_apids_t *pids)
 {
@@ -165,8 +170,7 @@ mpegts_pid_compare(mpegts_apids_t *dst, mpegts_apids_t *src,
   assert(dst);
   assert(add);
   assert(del);
-  if (mpegts_pid_init(add, NULL, 0) ||
-      mpegts_pid_init(del, NULL, 0))
+  if (mpegts_pid_init(add) || mpegts_pid_init(del))
     return -1;
   if (src == NULL) {
     mpegts_pid_copy(add, dst);
index 8dc27ee5e876a567891e9b1010d6d5d2b5440ebd..f003d3f79d078940fe5279661c2e21654783bd77 100644 (file)
@@ -515,6 +515,14 @@ mpegts_service_delete ( service_t *t, int delconf )
     LIST_REMOVE(ms, s_dvb_mux_link);
   sbuf_free(&ms->s_tsbuf);
 
+  /* Remove master/slave linking */
+  LIST_SAFE_REMOVE(ms, s_masters_link);
+  LIST_SAFE_REMOVE(ms, s_slaves_link);
+
+  /* Remove PID lists */
+  mpegts_pid_destroy(&ms->s_pids);
+  mpegts_pid_destroy(&ms->s_slaves_pids);
+
   // Note: the ultimate deletion and removal from the idnode list
   //       is done in service_destroy
 }
@@ -647,11 +655,10 @@ mpegts_service_raw_setsourceinfo(service_t *t, source_info_t *si)
 }
 
 static int
-mpegts_service_raw_update_pids(service_t *t, mpegts_apids_t *pids)
+mpegts_service_raw_update_pids(mpegts_service_t *t, mpegts_apids_t *pids)
 {
-  mpegts_service_t *ms = (mpegts_service_t *)t;
-  mpegts_input_t *mi = ms->s_dvb_active_input;
-  mpegts_mux_t *mm = ms->s_dvb_mux;
+  mpegts_input_t *mi = t->s_dvb_active_input;
+  mpegts_mux_t *mm = t->s_dvb_mux;
   mpegts_apids_t *p, *x;
   mpegts_apids_t add, del;
   int i;
@@ -659,7 +666,7 @@ mpegts_service_raw_update_pids(service_t *t, mpegts_apids_t *pids)
   lock_assert(&global_lock);
   if (pids) {
     p = calloc(1, sizeof(*p));
-    mpegts_pid_init(p, NULL, 0);
+    mpegts_pid_init(p);
     mpegts_pid_copy(p, pids);
   } else
     p = NULL;
@@ -702,6 +709,28 @@ mpegts_service_raw_update_pids(service_t *t, mpegts_apids_t *pids)
   return 0;
 }
 
+static int
+mpegts_service_link ( mpegts_service_t *master, mpegts_service_t *slave )
+{
+  pthread_mutex_lock(&master->s_stream_mutex);
+  assert(slave->s_status == SERVICE_IDLE);
+  LIST_INSERT_HEAD(&slave->s_masters, master, s_masters_link);
+  LIST_INSERT_HEAD(&master->s_slaves, slave, s_slaves_link);
+  pthread_mutex_unlock(&master->s_stream_mutex);
+  return 0;
+}
+
+static int
+mpegts_service_unlink ( mpegts_service_t *master, mpegts_service_t *slave )
+{
+  pthread_mutex_lock(&master->s_stream_mutex);
+  assert(slave->s_status == SERVICE_IDLE);
+  LIST_SAFE_REMOVE(master, s_masters_link);
+  LIST_SAFE_REMOVE(slave, s_slaves_link);
+  pthread_mutex_unlock(&master->s_stream_mutex);
+  return 0;
+}
+
 mpegts_service_t *
 mpegts_service_create_raw ( mpegts_mux_t *mm )
 {
@@ -736,6 +765,8 @@ mpegts_service_create_raw ( mpegts_mux_t *mm )
   s->s_channel_icon   = mpegts_service_channel_icon;
   s->s_mapped         = mpegts_service_mapped;
   s->s_update_pids    = mpegts_service_raw_update_pids;
+  s->s_link           = mpegts_service_link;
+  s->s_unlink         = mpegts_service_unlink;
 
   pthread_mutex_lock(&s->s_stream_mutex);
   free(s->s_nicename);
index fbc47580c0da777856ad0b5f31620d909bf0fe89..21511bd2243b51e05b84b5f9cc52109f47a0ed74 100644 (file)
@@ -51,6 +51,7 @@ static void
 ts_recv_packet0
   (mpegts_service_t *t, elementary_stream_t *st, const uint8_t *tsb)
 {
+  mpegts_service_t *m;
   int off, pusi, cc, error;
 
   service_set_streaming_status_flags((service_t*)t, TSS_MUX_PACKETS);
@@ -84,6 +85,13 @@ ts_recv_packet0
   if(streaming_pad_probe_type(&t->s_streaming_pad, SMT_MPEGTS))
     ts_remux(t, tsb, error);
 
+  LIST_FOREACH(m, &t->s_masters, s_masters_link) {
+    pthread_mutex_lock(&t->s_stream_mutex);
+    if(streaming_pad_probe_type(&t->s_streaming_pad, SMT_MPEGTS))
+      ts_remux(t, tsb, error);
+    pthread_mutex_unlock(&t->s_stream_mutex);
+  }
+
   off = tsb[3] & 0x20 ? tsb[4] + 5 : 4;
 
   switch(st->es_type) {
@@ -220,19 +228,20 @@ ts_recv_packet2(mpegts_service_t *t, const uint8_t *tsb)
 void
 ts_recv_raw(mpegts_service_t *t, const uint8_t *tsb)
 {
-  elementary_stream_t *st = NULL;
-  int pid;
+  int pid, parent = 0;
 
   pthread_mutex_lock(&t->s_stream_mutex);
   service_set_streaming_status_flags((service_t*)t, TSS_MUX_PACKETS);
-  if (t->s_parent) {
-    /* If PID is owned by parent, let parent service to
+  if (!LIST_EMPTY(&t->s_slaves)) {
+    /* If PID is owned by a slave service, let parent service to
      * deliver this PID (decrambling)
      */
     pid = (tsb[1] & 0x1f) << 8 | tsb[2];
-    st = service_stream_find(t->s_parent, pid);
+    parent = mpegts_pid_exists(t->s_slaves_pids, pid);
+    service_set_streaming_status_flags((service_t*)t, TSS_PACKETS);
+    t->s_streaming_live |= TSS_LIVE;
   }
-  if(st == NULL) {
+  if(!parent) {
     if (streaming_pad_probe_type(&t->s_streaming_pad, SMT_MPEGTS))
       ts_remux(t, tsb, 0);
     else {
index 96e8078dc822e04db8333be79431504a7e2f26db..656c2870de77909c77357f82ab942705a8e04156 100644 (file)
@@ -729,19 +729,21 @@ profile_chain_open(profile_chain_t *prch,
  *
  */
 int
-profile_chain_raw_open(profile_chain_t *prch, void *id, size_t qsize)
+profile_chain_raw_open(profile_chain_t *prch, void *id, size_t qsize, int muxer)
 {
   muxer_config_t c;
 
-  memset(&c, 0, sizeof(c));
-  c.m_type = MC_RAW;
   memset(prch, 0, sizeof(*prch));
   prch->prch_id    = id;
   prch->prch_flags = SUBSCRIPTION_RAW_MPEGTS;
   streaming_queue_init(&prch->prch_sq, SMT_PACKET, qsize);
   prch->prch_sq_used = 1;
   prch->prch_st    = &prch->prch_sq.sq_st;
-  prch->prch_muxer = muxer_create(&c);
+  if (muxer) {
+    memset(&c, 0, sizeof(c));
+    c.m_type = MC_RAW;
+    prch->prch_muxer = muxer_create(&c);
+  }
   return 0;
 }
 
index a763dbaffd824e47d7cf598270cc799eb7392fd9..e499642298d5b9466ef10044f54048ff2f56ec14 100644 (file)
@@ -144,7 +144,7 @@ int
 profile_chain_open(profile_chain_t *prch,
                    muxer_config_t *m_cfg, int flags, size_t qsize);
 void profile_chain_init(profile_chain_t *prch, profile_t *pro, void *id);
-int  profile_chain_raw_open(profile_chain_t *prch, void *id, size_t qsize);
+int  profile_chain_raw_open(profile_chain_t *prch, void *id, size_t qsize, int muxer);
 void profile_chain_close(profile_chain_t *prch);
 
 static inline profile_t *profile_find_by_uuid(const char *uuid)
index ff221988290051f658b0548ea08f0af3ed3d7ca6..966836b7f0217872e2e3dfe4966ec0484994e355 100644 (file)
 #define        LIST_NEXT(elm, field)           ((elm)->field.le_next)
 #endif
 
+#ifndef LIST_SAFE_REMOVE
+#define LIST_SAFE_REMOVE(elm, field) \
+        if ((elm)->field.le_next != NULL || (elm)->field.le_prev != NULL) \
+                LIST_REMOVE(elm, field)
+#endif
+
 #ifndef LIST_INSERT_BEFORE
 #define        LIST_INSERT_BEFORE(listelm, elm, field) do {                    \
        (elm)->field.le_prev = (listelm)->field.le_prev;                \
index 0397b90e36c5f58a0cf610c62088e074c1e8de2a..ef372578dbb4b7f725940edf33c437713e7b3283 100644 (file)
@@ -260,7 +260,7 @@ void satip_rtp_queue(void *id, th_subscription_t *subs,
   rtp->fd_rtcp = fd_rtcp;
   rtp->subs = subs;
   rtp->sq = sq;
-  mpegts_pid_init(&rtp->pids, NULL, pids->count);
+  mpegts_pid_init(&rtp->pids);
   mpegts_pid_copy(&rtp->pids, pids);
   udp_multisend_init(&rtp->um, RTP_PACKETS, RTP_PAYLOAD, &rtp->um_iovec);
   satip_rtp_header(rtp);
index 3f0599aeb19a293e9f2e2824e630542bc9de21bb..05c4bdb84d6ef481850aaa75d5799b8f782c62b5 100644 (file)
@@ -55,6 +55,7 @@ static uint32_t session_number;
 static uint16_t stream_id;
 static char *rtsp_ip = NULL;
 static int rtsp_port = -1;
+static int rtsp_descramble = 1;
 static void *rtsp_server = NULL;
 static TAILQ_HEAD(,session) rtsp_sessions;
 static pthread_mutex_t rtsp_lock;
@@ -117,7 +118,7 @@ rtsp_new_session(int delsys, uint32_t nsession, int session)
     if (session_number == 0)
       session_number += 9876;
   }
-  mpegts_pid_init(&rs->pids, NULL, 0);
+  mpegts_pid_init(&rs->pids);
   TAILQ_INSERT_TAIL(&rtsp_sessions, rs, link);
   return rs;
 }
@@ -247,7 +248,7 @@ rtsp_start
   mpegts_network_t *mn, *mn2;
   dvb_network_t *ln;
   dvb_mux_t *mux;
-  service_t *svc;
+  mpegts_service_t *svc;
   char buf[384];
   int res = HTTP_STATUS_SERVICE, qsize = 3000000, created = 0;
 
@@ -285,7 +286,7 @@ rtsp_start
     rtsp_clean(rs);
     rs->mux = mux;
     rs->mux_created = created;
-    if (profile_chain_raw_open(&rs->prch, (mpegts_mux_t *)rs->mux, qsize))
+    if (profile_chain_raw_open(&rs->prch, (mpegts_mux_t *)rs->mux, qsize, 0))
       goto endclean;
     rs->subs = subscription_create_from_mux(&rs->prch, NULL,
                                    config_get_int("satip_weight", 100),
@@ -304,7 +305,7 @@ rtsp_start
     }
   } else {
 pids:
-    svc = rs->subs->ths_service;
+    svc = (mpegts_service_t *)rs->subs->ths_service;
     svc->s_update_pids(svc, &rs->pids);
     satip_rtp_update_pids((void *)(intptr_t)rs->stream, &rs->pids);
   }
@@ -317,7 +318,7 @@ pids:
                     rs->udp_rtp->fd, rs->udp_rtcp->fd,
                     rs->frontend, rs->findex, &rs->mux->lm_tuning,
                     &rs->pids);
-    svc = rs->subs->ths_service;
+    svc = (mpegts_service_t *)rs->subs->ths_service;
     svc->s_update_pids(svc, &rs->pids);
     rs->run = 1;
   }
@@ -728,9 +729,9 @@ rtsp_process_play(http_connection_t *hc, int setup)
   char buf[256], addrbuf[50];
   http_arg_list_t args;
 
-  mpegts_pid_init(&pids, NULL, 0);
-  mpegts_pid_init(&addpids, NULL, 0);
-  mpegts_pid_init(&delpids, NULL, 0);
+  mpegts_pid_init(&pids);
+  mpegts_pid_init(&addpids);
+  mpegts_pid_init(&delpids);
 
   http_arg_init(&args);
   tcp_get_ip_str((struct sockaddr*)hc->hc_peer, addrbuf, sizeof(addrbuf));
@@ -1142,7 +1143,7 @@ rtsp_close_sessions(void)
 /*
  *
  */
-void satip_server_rtsp_init(const char *bindaddr, int port)
+void satip_server_rtsp_init(const char *bindaddr, int port, int descramble)
 {
   static tcp_server_ops_t ops = {
     .start  = rtsp_serve,
@@ -1169,6 +1170,7 @@ void satip_server_rtsp_init(const char *bindaddr, int port)
   free(rtsp_ip);
   rtsp_ip = strdup(bindaddr);
   rtsp_port = port;
+  rtsp_descramble = descramble;
   if (!rtsp_server)
     rtsp_server = tcp_server_create(bindaddr, port, &ops, NULL);
   if (reg)
index 59b3fb4bf4ca90c107a1ea7e131997c0c5b8b091..756272348f2f6ae83be93a8033dd58228192405e 100644 (file)
@@ -474,15 +474,17 @@ satips_upnp_discovery_destroy(upnp_service_t *upnp)
  */
 void satip_server_config_changed(void)
 {
-  int rtsp_port;
+  int rtsp_port, descramble;
 
   if (!satip_server_rtsp_port_locked) {
     rtsp_port = config_get_int("satip_rtsp", 0);
     satip_server_rtsp_port = rtsp_port;
     if (rtsp_port > 0) {
-      satip_server_rtsp_init(http_server_ip, rtsp_port);
-      tvhinfo("satips", "SAT>IP Server reinitialized (HTTP %s:%d, RTSP %s:%d, DVB-T %d, DVB-S2 %d, DVB-C %d)",
+      descramble = config_get_int("satip_descramble", 1);
+      satip_server_rtsp_init(http_server_ip, rtsp_port, descramble);
+      tvhinfo("satips", "SAT>IP Server reinitialized (HTTP %s:%d, RTSP %s:%d, Descramble %d, DVB-T %d, DVB-S2 %d, DVB-C %d)",
               http_server_ip, http_server_port, http_server_ip, rtsp_port,
+              descramble,
               config_get_int("satip_dvbt", 0),
               config_get_int("satip_dvbs", 0),
               config_get_int("satip_dvbc", 0));
@@ -503,6 +505,7 @@ void satip_server_init(int rtsp_port)
 {
   struct sockaddr_storage http;
   char http_ip[128];
+  int descramble;
 
   http_server_ip = NULL;
   satip_server_bootid = time(NULL);
@@ -526,10 +529,13 @@ void satip_server_init(int rtsp_port)
   if (rtsp_port <= 0)
     return;
 
-  satip_server_rtsp_init(http_server_ip, rtsp_port);
+  descramble = config_get_int("satip_descramble", 1);
 
-  tvhinfo("satips", "SAT>IP Server initialized (HTTP %s:%d, RTSP %s:%d, DVB-T %d, DVB-S2 %d, DVB-C %d)",
+  satip_server_rtsp_init(http_server_ip, rtsp_port, descramble);
+
+  tvhinfo("satips", "SAT>IP Server initialized (HTTP %s:%d, RTSP %s:%d, Descramble %d, DVB-T %d, DVB-S2 %d, DVB-C %d)",
           http_server_ip, http_server_port, http_server_ip, rtsp_port,
+          descramble,
           config_get_int("satip_dvbt", 0),
           config_get_int("satip_dvbs", 0),
           config_get_int("satip_dvbc", 0));
@@ -547,6 +553,9 @@ void satip_server_register(void)
   if (config_set_int("satip_rtsp", satip_server_rtsp_port))
     save = 1;
 
+  if (config_get_int("satip_descramble", -1) < 0)
+    config_set_int("satip_descramble", 1);
+
   if (config_get_int("satip_weight", 0) <= 0)
     if (config_set_int("satip_weight", 100))
       save = 1;
index 68b1c7120594a1d0fa62e5d47d0e206f660e9604..94569d59622deb1d32d5bbb0bdd38d397fcea9b3 100644 (file)
@@ -48,7 +48,7 @@ void satip_rtp_close(void *id);
 void satip_rtp_init(void);
 void satip_rtp_done(void);
 
-void satip_server_rtsp_init(const char *bindaddr, int port);
+void satip_server_rtsp_init(const char *bindaddr, int port, int descramble);
 void satip_server_rtsp_register(void);
 void satip_server_rtsp_done(void);
 
index 38e3c51333731f61277a92f953747763d53b6373..9c4dc8f18d02f5757dc7f8687c870704cb412d74 100644 (file)
@@ -370,12 +370,6 @@ service_stop(service_t *t)
   t->s_status = SERVICE_IDLE;
   tvhlog_limit_reset(&t->s_tei_log);
 
-#if ENABLE_MPEGTS
-  mpegts_pid_done(t->s_pids);
-  free(t->s_pids);
-  t->s_pids = NULL;
-#endif
-
   pthread_mutex_unlock(&t->s_stream_mutex);
 }
 
@@ -944,6 +938,7 @@ service_create0
   return t;
 }
 
+
 /**
  *
  */
index 0d17b84c3c6f52d0c23455dc3cb9721d50cf09b5..f3a88a59dcb17a1265b959a46988828886cdbcf4 100644 (file)
@@ -311,10 +311,6 @@ typedef struct service {
 
   void (*s_delete)(struct service *t, int delconf);
 
-#if ENABLE_MPEGTS
-  int (*s_update_pids)(struct service *t, struct mpegts_apids *pids);
-#endif
-
   /**
    * Channel info
    */
@@ -458,10 +454,6 @@ typedef struct service {
   struct elementary_stream_queue s_filt_components;
   int s_last_pid;
   elementary_stream_t *s_last_es;
-#if ENABLE_MPEGTS
-  struct service *s_parent;
-  struct mpegts_apids *s_pids;
-#endif
 
   /**
    * Delivery pad, this is were we finally deliver all streaming output
index 9414d9d7f3d0fafcd656af8d748f632f0c871e7c..61bb20ffad23e7cd855ddc81813204cd8befe9fa 100644 (file)
@@ -529,6 +529,8 @@ extjs_config(http_connection_t *hc, const char *remain, void *opaque)
       ssave |= config_set_int("satip_rtsp", atoi(str));
     if ((str = http_arg_get(&hc->hc_req_args, "satip_weight")))
       ssave |= config_set_int("satip_weight", atoi(str));
+    if ((str = http_arg_get(&hc->hc_req_args, "satip_descramble")))
+      ssave |= config_set_int("satip_descramble", atoi(str));
     if ((str = http_arg_get(&hc->hc_req_args, "satip_dvbt")))
       ssave |= config_set_int("satip_dvbt", atoi(str));
     if ((str = http_arg_get(&hc->hc_req_args, "satip_dvbs")))
index 2bdd794fa90cf07b3097f8bac406e3d3f23f99d2..2189e22a7414749e7089fa74c7a87adccf44c5d3 100644 (file)
@@ -45,7 +45,8 @@ tvheadend.miscconf = function(panel, index) {
         'tvhtime_update_enabled', 'tvhtime_ntp_enabled',
         'tvhtime_tolerance',
         'prefer_picon', 'chiconpath', 'piconpath',
-        'satip_rtsp', 'satip_weight', 'satip_dvbt', 'satip_dvbs', 'satip_dvbc'
+        'satip_rtsp', 'satip_weight', 'satip_descramble',
+        'satip_dvbt', 'satip_dvbs', 'satip_dvbc'
     ]);
 
     /* ****************************************************************
@@ -229,6 +230,10 @@ tvheadend.miscconf = function(panel, index) {
              name: 'satip_weight',
              fieldLabel: 'Subscription Weight'
         });
+        var descramble = new Ext.form.NumberField({
+             name: 'satip_descramble',
+             fieldLabel: 'Descramble Services (Limit Per Mux)'
+        });
         var dvbt = new Ext.form.NumberField({
              name: 'satip_dvbt',
              fieldLabel: 'Exported DVB-T Tuners'
@@ -247,7 +252,7 @@ tvheadend.miscconf = function(panel, index) {
             autoHeight: true,
             collapsible: true,
             animCollapse: true,
-            items: [rtsp, weight, dvbt, dvbs, dvbc]
+            items: [rtsp, weight, descramble, dvbt, dvbs, dvbc]
         });
     }
 
index 16ecee5ab22ddef91e8849028aaa2770a51388e8..9cff6096f3e6d23cb936834203b98eb6d9787711 100644 (file)
@@ -807,6 +807,7 @@ http_stream_mux(http_connection_t *hc, mpegts_mux_t *mm, int weight)
   void *tcp_id;
   char *p, *saveptr;
   mpegts_apids_t pids;
+  mpegts_service_t *ms;
   int res = HTTP_STATUS_SERVICE, i;
 
   if(http_access_verify(hc, ACCESS_ADVANCED_STREAMING))
@@ -820,7 +821,7 @@ http_stream_mux(http_connection_t *hc, mpegts_mux_t *mm, int weight)
   else
     qsize = 10000000;
 
-  mpegts_pid_init(&pids, NULL, 0);
+  mpegts_pid_init(&pids);
   if ((str = http_arg_get(&hc->hc_req_args, "pids"))) {
     p = tvh_strdupa(str);
     p = strtok_r(p, ",", &saveptr);
@@ -844,7 +845,7 @@ http_stream_mux(http_connection_t *hc, mpegts_mux_t *mm, int weight)
     pids.all = 1;
   }
 
-  if (!profile_chain_raw_open(&prch, mm, qsize)) {
+  if (!profile_chain_raw_open(&prch, mm, qsize, 1)) {
 
     tcp_get_ip_str((struct sockaddr*)hc->hc_peer, addrbuf, 50);
 
@@ -856,7 +857,8 @@ http_stream_mux(http_connection_t *hc, mpegts_mux_t *mm, int weight)
                                      NULL);
     if (s) {
       name = tvh_strdupa(s->ths_title);
-      if (s->ths_service->s_update_pids(s->ths_service, &pids) == 0) {
+      ms = (mpegts_service_t *)s->ths_service;
+      if (ms->s_update_pids(ms, &pids) == 0) {
         pthread_mutex_unlock(&global_lock);
         http_stream_run(hc, &prch, name, s);
         pthread_mutex_lock(&global_lock);