]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
SAT>IP server: add mux handling configuration option
authorJaroslav Kysela <perex@perex.cz>
Tue, 17 Mar 2015 17:51:33 +0000 (18:51 +0100)
committerJaroslav Kysela <perex@perex.cz>
Tue, 17 Mar 2015 17:58:02 +0000 (18:58 +0100)
docs/html/config_misc.html
src/satip/rtsp.c
src/satip/server.c
src/satip/server.h
src/webui/extjs.c
src/webui/static/app/config.js

index 9e81c243675fae3a8f1ab379793eb07b3fade50e..6d3b37b256cb16a0794cbc8bc73cdb64278879fa 100644 (file)
   <dd>
   Exported DVB-C tuners - streaming instances.
 
+  <dt>Muxes Handling
+  <dd>
+  When SAT>IP client requests new mux configuration, tvheadend can handle it
+  in three ways. The auto (0) configuration means that if the mux does not exists,
+  a temporary mux is created and removed when the client closes the
+  connection. The keep (1) configuration will remember all successfuly scanned muxes.
+  The reject (2) configuration will reject unknown muxes.
+
   </dl>
 
  </dl>  
index 87ffa6387ac6ff98d4b6e8d46454cad747fffaee..ffd62d58166924db1e454e2a36e5d7969891f8d5 100644 (file)
 #define RTP_BUFSIZE  (256*1024)
 #define RTCP_BUFSIZE (16*1024)
 
+#define MUXCNF_AUTO   0
+#define MUXCNF_KEEP   1
+#define MUXCNF_REJECT 2
+
 typedef struct slave_subscription {
   LIST_ENTRY(slave_subscription) link;
   mpegts_service_t *service;
@@ -64,6 +68,7 @@ static uint16_t stream_id;
 static char *rtsp_ip = NULL;
 static int rtsp_port = -1;
 static int rtsp_descramble = 1;
+static int rtsp_muxcnf = MUXCNF_AUTO;
 static void *rtsp_server = NULL;
 static TAILQ_HEAD(,session) rtsp_sessions;
 static pthread_mutex_t rtsp_lock;
@@ -313,7 +318,8 @@ rtsp_clean(session_t *rs)
   }
   if (rs->prch.prch_id)
     profile_chain_close(&rs->prch);
-  if (rs->mux && rs->mux_created)
+  if (rs->mux && rs->mux_created &&
+      (rtsp_muxcnf != MUXCNF_KEEP || LIST_EMPTY(&rs->mux->mm_services)))
     rs->mux->mm_delete((mpegts_mux_t *)rs->mux, 1);
   rs->mux = NULL;
   rs->mux_created = 0;
@@ -430,7 +436,8 @@ rtsp_start
         if (mux) break;
       }
     }
-    if (mux == NULL && mn2) {
+    if (mux == NULL && mn2 &&
+        (rtsp_muxcnf == MUXCNF_AUTO || rtsp_muxcnf == MUXCNF_KEEP)) {
       dvb_mux_conf_str(&rs->dmc, buf, sizeof(buf));
       tvhwarn("satips", "%i/%s/%i: create mux %s",
               rs->frontend, rs->session, rs->stream, buf);
@@ -443,8 +450,9 @@ rtsp_start
     }
     if (mux == NULL) {
       dvb_mux_conf_str(&rs->dmc, buf, sizeof(buf));
-      tvhwarn("satips", "%i/%s/%i: unable to create mux %s",
-              rs->frontend, rs->session, rs->stream, buf);
+      tvhwarn("satips", "%i/%s/%i: unable to create mux %s%s",
+              rs->frontend, rs->session, rs->stream, buf,
+              rtsp_muxcnf == MUXCNF_REJECT ? " (configuration)" : "");
       goto endclean;
     }
     if (rs->mux == mux)
@@ -1314,7 +1322,8 @@ rtsp_close_sessions(void)
 /*
  *
  */
-void satip_server_rtsp_init(const char *bindaddr, int port, int descramble)
+void satip_server_rtsp_init
+  (const char *bindaddr, int port, int descramble, int muxcnf)
 {
   static tcp_server_ops_t ops = {
     .start  = rtsp_serve,
@@ -1340,6 +1349,7 @@ void satip_server_rtsp_init(const char *bindaddr, int port, int descramble)
   rtsp_ip = strdup(bindaddr);
   rtsp_port = port;
   rtsp_descramble = descramble;
+  rtsp_muxcnf = muxcnf;
   if (!rtsp_server)
     rtsp_server = tcp_server_create(bindaddr, port, &ops, NULL);
   if (reg)
index afb8c8c34fd9cb907b2497d027e827063ee1eaaf..47ec23fc6b1929af767e6752a370abace4c2eb8f 100644 (file)
@@ -491,15 +491,15 @@ static void satips_rtsp_port(int def)
  *
  */
 
-static void satip_server_info(const char *prefix, int descramble)
+static void satip_server_info(const char *prefix, int descramble, int muxcnf)
 {
   tvhinfo("satips", "SAT>IP Server %sinitialized "
                     "(HTTP %s:%d, RTSP %s:%d, "
-                    "descramble %d, DVB-T %d, DVB-S2 %d, DVB-C %d)",
+                    "descramble %d, muxcnf %d, DVB-T %d, DVB-S2 %d, DVB-C %d)",
               prefix,
               http_server_ip, http_server_port,
               http_server_ip, satip_server_rtsp_port,
-              descramble,
+              descramble, muxcnf,
               config_get_int("satip_dvbt", 0),
               config_get_int("satip_dvbs", 0),
               config_get_int("satip_dvbc", 0));
@@ -510,15 +510,16 @@ static void satip_server_info(const char *prefix, int descramble)
  */
 void satip_server_config_changed(void)
 {
-  int descramble;
+  int descramble, muxcnf;
 
   if (!satip_server_rtsp_port_locked) {
     satips_rtsp_port(0);
     if (satip_server_rtsp_port > 0) {
       descramble = config_get_int("satip_descramble", 1);
+      muxcnf = config_get_int("satip_muxcnf", 0);
       pthread_mutex_unlock(&global_lock);
-      satip_server_rtsp_init(http_server_ip, satip_server_rtsp_port, descramble);
-      satip_server_info("re", descramble);
+      satip_server_rtsp_init(http_server_ip, satip_server_rtsp_port, descramble, muxcnf);
+      satip_server_info("re", descramble, muxcnf);
       satips_upnp_send_announce();
       pthread_mutex_lock(&global_lock);
     } else {
@@ -539,7 +540,7 @@ void satip_server_init(int rtsp_port)
 {
   struct sockaddr_storage http;
   char http_ip[128];
-  int descramble;
+  int descramble, muxcnf;
 
   http_server_ip = NULL;
   satip_server_bootid = time(NULL);
@@ -562,10 +563,11 @@ void satip_server_init(int rtsp_port)
     return;
 
   descramble = config_get_int("satip_descramble", 1);
+  muxcnf = config_get_int("satip_muxcnf", 0);
 
-  satip_server_rtsp_init(http_server_ip, satip_server_rtsp_port, descramble);
+  satip_server_rtsp_init(http_server_ip, satip_server_rtsp_port, descramble, muxcnf);
 
-  satip_server_info("", descramble);
+  satip_server_info("", descramble, muxcnf);
 }
 
 void satip_server_register(void)
index 94569d59622deb1d32d5bbb0bdd38d397fcea9b3..dedce9ad62dd59f32de0a968c739412a797bbaa5 100644 (file)
@@ -48,7 +48,8 @@ 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, int descramble);
+void satip_server_rtsp_init(const char *bindaddr, int port,
+                            int descramble, int muxcnf);
 void satip_server_rtsp_register(void);
 void satip_server_rtsp_done(void);
 
index 61bb20ffad23e7cd855ddc81813204cd8befe9fa..b99b976cfef09572eace7cd66f428a33acbbff9d 100644 (file)
@@ -537,6 +537,8 @@ extjs_config(http_connection_t *hc, const char *remain, void *opaque)
       ssave |= config_set_int("satip_dvbs", atoi(str));
     if ((str = http_arg_get(&hc->hc_req_args, "satip_dvbc")))
       ssave |= config_set_int("satip_dvbc", atoi(str));
+    if ((str = http_arg_get(&hc->hc_req_args, "satip_muxcnf")))
+      ssave |= config_set_int("satip_muxcnf", atoi(str));
     if (save | ssave)
       config_save();
     if (ssave)
index 14d7877958228352d3a0ed11f37f67aa5dab442e..ee88e1175c363595244513475b3ef7509daf7714 100644 (file)
@@ -246,13 +246,18 @@ tvheadend.miscconf = function(panel, index) {
              name: 'satip_dvbc',
              fieldLabel: 'Exported DVB-C Tuners'
         });
+        var muxcnf = new Ext.form.NumberField({
+             name: 'satip_muxcnf',
+             fieldLabel: 'Muxes Handling (0 = auto, 1 = keep, 2 = reject)'
+        });
+
         satipPanel = new Ext.form.FieldSet({
             title: 'SAT>IP Server',
             width: 700,
             autoHeight: true,
             collapsible: true,
             animCollapse: true,
-            items: [rtsp, weight, descramble, dvbt, dvbs, dvbc]
+            items: [rtsp, weight, descramble, dvbt, dvbs, dvbc, muxcnf]
         });
     }