]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
SAT>IP: handle SRCS pass (for DVB-S) in server and client
authorJaroslav Kysela <perex@perex.cz>
Sat, 28 Feb 2015 16:04:56 +0000 (17:04 +0100)
committerJaroslav Kysela <perex@perex.cz>
Wed, 11 Mar 2015 20:41:12 +0000 (21:41 +0100)
src/input/mpegts/satip/satip.c
src/input/mpegts/satip/satip_frontend.c
src/input/mpegts/satip/satip_private.h
src/satip/rtsp.c
src/satip/server.c

index 58a4cfc9a17c24a2b04dac6eae72d400ff22652f..663d012826fac5828479109e206c53b2c50bec1a 100644 (file)
@@ -418,6 +418,7 @@ satip_device_create( satip_device_info_t *info )
   ASSIGN(tunercfg);
 #undef ASSIGN
   sd->sd_info.rtsp_port = info->rtsp_port;
+  sd->sd_info.srcs = info->srcs;
 
   /*
    * device specific hacks
@@ -732,13 +733,19 @@ satip_discovery_http_closed(http_client_t *hc, int errn)
     goto finish;
 
   info.rtsp_port = 554;
+  info.srcs = 4;
 
   upc = htsmsg_xml_get_cdata_str(device, "UPC");
   if (upc && (s = strstr(upc, "{{{")) != NULL &&
       strcmp(s + strlen(s) - 3, "}}}") == 0) {
     if ((p = strstr(s, "RTSP:")) != NULL) {
+      if ((i = atoi(p + 5)) > 0 && i < 65535)
+        info.rtsp_port = i;
+    }
+    if ((p = strstr(s, "SRCS:")) != NULL) {
       i = atoi(p + 5);
-      info.rtsp_port = i;
+      if ((i = atoi(p + 5)) > 0 && i < 128)
+        info.srcs = i;
     }
   }
 
index eecf0bd24eb1b95bae7f8542dae092b024bce5b7..bbed461bbdb0b9fef19b6803544044c32cf40b5f 100644 (file)
@@ -1716,7 +1716,7 @@ satip_frontend_create
   char id[16], lname[256];
   satip_frontend_t *lfe;
   uint32_t master = 0;
-  int i, def_positions = 4;
+  int i, def_positions = sd->sd_info.srcs;
 
   /* Override type */
   snprintf(id, sizeof(id), "override #%d", num);
index 324587bae674ce47d23557af586529a08da34d5b..a3eb92957e7511f9656ccb2d3e19c719e348a13d 100644 (file)
@@ -54,6 +54,7 @@ struct satip_device_info
   char *presentation;
   char *tunercfg;     /*< XML urn:ses-com:satipX_SATIPCAP contents */
   int rtsp_port;
+  int srcs;
 };
 
 struct satip_device
index 495a267dba00ffd77ed590d45878f126d4dcecef..ebde1155f86dc6a2401c04eeb28e6ac715024557 100644 (file)
@@ -35,6 +35,7 @@ typedef struct session {
   int stream;
   int frontend;
   int findex;
+  int src;
   uint32_t nsession;
   char session[9];
   dvb_mux_conf_t dmc;
@@ -294,7 +295,7 @@ rtsp_start(http_connection_t *hc, session_t *rs, char *addrbuf)
   LIST_FOREACH(mn, &mpegts_network_all, mn_global_link) {
     ln = (dvb_network_t *)mn;
     if (ln->ln_type == rs->dmc.dmc_fe_type &&
-        mn->mn_satip_source == rs->findex)
+        mn->mn_satip_source == rs->src)
       break;
   }
   if (mn) {
@@ -650,6 +651,8 @@ rtsp_process_play(http_connection_t *hc, int setup)
   mtype = mtype_to_tvh(hc);
   if (mtype == DVB_MOD_NONE) goto error;
 
+  src = 1;
+
   if (msys == DVB_SYS_DVBS || msys == DVB_SYS_DVBS2) {
 
     src = atoi(http_arg_get_remove(&hc->hc_req_args, "src"));
@@ -746,6 +749,7 @@ rtsp_process_play(http_connection_t *hc, int setup)
   if (stream_id == 0)
     stream_id++;
   rs->stream = stream_id % 0x7fff;
+  rs->src = src;
 
   memset(&rs->udp_rtp, 0, sizeof(rs->udp_rtp));
   memset(&rs->udp_rtcp, 0, sizeof(rs->udp_rtcp));
index 2ac8e82797522d95e6ea8315d0e37104d0c4dcac..97af5610d6f062402b098ff475895bcb6397c6c6 100644 (file)
@@ -104,7 +104,7 @@ satip_server_http_xml(http_connection_t *hc)
   char *devicelist = NULL;
   htsbuf_queue_t q;
   mpegts_network_t *mn;
-  int dvbt = 0, dvbs = 0, dvbc = 0, delim = 0, i;
+  int dvbt = 0, dvbs = 0, dvbc = 0, srcs = 0, delim = 0, i;
 
   htsbuf_queue_init(&q, 0);
 
@@ -114,9 +114,11 @@ satip_server_http_xml(http_connection_t *hc)
       continue;
     if (idnode_is_instance(&mn->mn_id, &dvb_network_dvbt_class))
       dvbt++;
-    else if (idnode_is_instance(&mn->mn_id, &dvb_network_dvbs_class))
+    else if (idnode_is_instance(&mn->mn_id, &dvb_network_dvbs_class)) {
       dvbs++;
-    else if (idnode_is_instance(&mn->mn_id, &dvb_network_dvbc_class))
+      if (srcs < mn->mn_satip_source)
+        srcs = mn->mn_satip_source;
+    } else if (idnode_is_instance(&mn->mn_id, &dvb_network_dvbc_class))
       dvbc++;
   }
   if (dvbt && (i = config_get_int("satip_dvbt", 0)) > 0) {
@@ -138,6 +140,8 @@ satip_server_http_xml(http_connection_t *hc)
     dvbc = 0;
   }
   pthread_mutex_unlock(&global_lock);
+  if (!dvbs)
+    srcs = 0;
 
   devicelist = htsbuf_to_string(&q);
   htsbuf_queue_flush(&q);
@@ -151,7 +155,7 @@ satip_server_http_xml(http_connection_t *hc)
   snprintf(buf, sizeof(buf), MSG,
            tvheadend_version, tvheadend_version,
            satip_server_uuid, tvheadend_version,
-           satip_server_rtsp_port, dvbs,
+           satip_server_rtsp_port, srcs,
            http_server_ip, http_server_port,
            http_server_ip, http_server_port,
            http_server_ip, http_server_port,