]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
SAT>IP: Serialize the tuning - configurable delay
authorJaroslav Kysela <perex@perex.cz>
Mon, 12 May 2014 13:26:39 +0000 (15:26 +0200)
committerJaroslav Kysela <perex@perex.cz>
Mon, 12 May 2014 13:27:51 +0000 (15:27 +0200)
src/input/mpegts/satip/satip.c
src/input/mpegts/satip/satip_frontend.c
src/input/mpegts/satip/satip_private.h

index 7d53fbdb7df12843a1d8f62396df6e102f959b51..b6bc46ac2702fd15578d3034675d519edfb39fd7 100644 (file)
@@ -303,6 +303,8 @@ satip_device_create( satip_device_info_t *info )
     return NULL;
   }
 
+  pthread_mutex_init(&sd->sd_tune_mutex, NULL);
+
   TAILQ_INIT(&sd->sd_frontends);
 
   /* we may check if uuid matches, but the SHA hash should be enough */
index 5c11938910e75e60a07b304cd2407255d7f93a1b..772a2230bce24b8f4fded965867d56c902bb6f1d 100644 (file)
@@ -106,6 +106,13 @@ const idclass_t satip_frontend_class =
       .name     = "UDP RTP Port Number (2 ports)",
       .off      = offsetof(satip_frontend_t, sf_udp_rtp_port),
     },
+    {
+      .type     = PT_INT,
+      .id       = "tdelay",
+      .name     = "Next tune delay in ms (0-2000)",
+      .opts     = PO_ADVANCED,
+      .off      = offsetof(satip_frontend_t, sf_tdelay),
+    },
     {
       .type     = PT_BOOL,
       .id       = "play2",
@@ -859,7 +866,7 @@ satip_frontend_input_thread ( void *aux )
 #define UDP_PKT_SIZE  1472         /* this is maximum UDP payload (standard ethernet) */
 #define RTP_PKT_SIZE  (UDP_PKT_SIZE - 12)             /* minus RTP minimal RTP header */
 #define HTTP_CMD_NONE 9874
-  satip_frontend_t *lfe = aux, *lfe2;
+  satip_frontend_t *lfe = aux, *lfe_master = lfe;
   mpegts_mux_instance_t *mmi = lfe->sf_mmi;
   http_client_t *rtsp;
   dvb_mux_t *lm;
@@ -877,6 +884,7 @@ satip_frontend_input_thread ( void *aux )
   uint32_t seq = -1, nseq;
   udp_multirecv_t um;
   int play2 = 1, position, rtsp_flags = 0;
+  uint64_t u64;
 
   lfe->mi_display_name((mpegts_input_t*)lfe, buf, sizeof(buf));
 
@@ -885,6 +893,28 @@ satip_frontend_input_thread ( void *aux )
 
   lm = (dvb_mux_t *)mmi->mmi_mux;
 
+  if (lfe->sf_master) {
+    lfe_master = satip_frontend_find_by_number(lfe->sf_device, lfe->sf_master);
+    if (lfe_master == NULL)
+      lfe_master = lfe;
+  }
+
+  pthread_mutex_lock(&lfe->sf_device->sd_tune_mutex);
+  u64 = getmonoclock() - lfe_master->sf_last_tune;
+  tvhtrace("satip", "%s - last tune diff = %llu (tdelay = %u)",
+           buf, (unsigned long long)u64, lfe_master->sf_tdelay * 1000);
+  if (u64 < lfe_master->sf_tdelay * 1000) {
+    u64 = (lfe_master->sf_tdelay * 1000) - u64;
+    if (u64 >= 1000000) {
+      unsigned int s = u64 / 1000000;
+      while ((s = sleep(s)) != 0);
+    }
+    u64 %= 1000000;
+    while (usleep(u64));
+  }
+  lfe_master->sf_last_tune = getmonoclock();
+  pthread_mutex_unlock(&lfe->sf_device->sd_tune_mutex);
+
   rtsp = http_client_connect(lfe, RTSP_VERSION_1_0, "rstp",
                              lfe->sf_device->sd_info.addr, 554);
   if (rtsp == NULL)
@@ -908,12 +938,7 @@ satip_frontend_input_thread ( void *aux )
   tvhpoll_add(efd, ev, 4);
   rtsp->hc_efd = efd;
 
-  position = lfe->sf_position;
-  if (lfe->sf_master) {
-    lfe2 = satip_frontend_find_by_number(lfe->sf_device, lfe->sf_master);
-    if (lfe2)
-      position = lfe2->sf_position;
-  }
+  position = lfe_master->sf_position;
   if (lfe->sf_device->sd_pids0)
     rtsp_flags |= SATIP_SETUP_PIDS0;
   r = satip_rtsp_setup(rtsp,
@@ -1221,9 +1246,12 @@ satip_frontend_tune1
 static void
 satip_frontend_hacks( satip_frontend_t *lfe )
 {
+  lfe->sf_tdelay = 50; /* should not hurt anything */
   if (strstr(lfe->sf_device->sd_info.location, ":8888/octonet.xml")) {
-    if (lfe->sf_type == DVB_TYPE_S)
+    if (lfe->sf_type == DVB_TYPE_S) {
       lfe->sf_play2 = 1;
+      lfe->sf_tdelay = 500;
+    }
   }
 }
 
@@ -1296,6 +1324,8 @@ satip_frontend_create
 
   /* Defaults */
   lfe->sf_position     = -1;
+  if (lfe->sf_tdelay > 2000)
+    lfe->sf_tdelay = 2000;
 
   /* Callbacks */
   lfe->mi_is_free      = satip_frontend_is_free;
index 6423eb3bfa8bb53126e1a2bc4877cf484de2af88..faeab329cea9c381c429ac9126c1ccd1370c2510 100644 (file)
@@ -79,6 +79,7 @@ struct satip_device
   int                        sd_pids_deladd;
   int                        sd_sig_scale;
   int                        sd_pids0;
+  pthread_mutex_t            sd_tune_mutex;
 };
 
 struct satip_frontend
@@ -101,6 +102,7 @@ struct satip_frontend
   int                        sf_master;
   int                        sf_udp_rtp_port;
   int                        sf_play2;
+  int                        sf_tdelay;
 
   /*
    * Reception
@@ -124,6 +126,7 @@ struct satip_frontend
   mpegts_mux_instance_t     *sf_mmi;
   signal_state_t             sf_status;
   gtimer_t                   sf_monitor_timer;
+  uint64_t                   sf_last_tune;
  
   /*
    * Configuration