From 00464a8deb0cb7604886894223595d13ec682693 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Thu, 21 Aug 2014 20:22:58 +0200 Subject: [PATCH] SAT>IP: Reworked the wait delay at startup --- src/input/mpegts/satip/satip_frontend.c | 79 ++++++++++++++++++------- 1 file changed, 58 insertions(+), 21 deletions(-) diff --git a/src/input/mpegts/satip/satip_frontend.c b/src/input/mpegts/satip/satip_frontend.c index fe4b0bb2..b4d39339 100644 --- a/src/input/mpegts/satip/satip_frontend.c +++ b/src/input/mpegts/satip/satip_frontend.c @@ -947,13 +947,13 @@ satip_frontend_input_thread ( void *aux ) sbuf_t sb; int pos, nfds, i, r, tc; size_t c; - tvhpoll_event_t ev[4]; + tvhpoll_event_t ev[3]; tvhpoll_t *efd; int changing = 0, ms = -1, fatal = 0, running = 1; uint32_t seq = -1, nseq; udp_multirecv_t um; int play2 = 1, position, rtsp_flags = 0, reply; - uint64_t u64; + uint64_t u64, u64_2; lfe->mi_display_name((mpegts_input_t*)lfe, buf, sizeof(buf)); @@ -968,30 +968,72 @@ satip_frontend_input_thread ( void *aux ) lfe_master = lfe; } + /* Setup poll */ + efd = tvhpoll_create(4); + memset(ev, 0, sizeof(ev)); + ev[0].events = TVHPOLL_IN; + ev[0].fd = lfe->sf_dvr_pipe.rd; + ev[0].data.ptr = NULL; + tvhpoll_add(efd, ev, 1); + 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 = lfe_master->sf_last_tune; + i = lfe_master->sf_tdelay; + pthread_mutex_unlock(&lfe->sf_device->sd_tune_mutex); + if (i < 0) + i = 0; + if (i > 2000) + i = 2000; + + tc = 1; + while (i) { + + u64_2 = (getmonoclock() - u64) / 1000; + if (u64_2 >= (uint64_t)i) + break; + r = (uint64_t)i - u64_2; + + if (tc) + tvhtrace("satip", "%s - last tune diff = %llu (delay = %d)", + buf, (unsigned long long)u64_2, r); + + tc = 1; + nfds = tvhpoll_wait(efd, ev, 1, r); + + if (!tvheadend_running) goto fast_exit; + + if (nfds < 0) continue; + + if (nfds == 0) break; + + if (ev[0].data.ptr == NULL) { + c = read(lfe->sf_dvr_pipe.rd, rtcp, 1); + if (c == 1 && rtcp[0] == 'c') { + tc = 0; + ms = 20; + changing = 1; + continue; + } + tvhtrace("satip", "%s - input thread received fast shutdown", buf); + goto fast_exit; } - u64 %= 1000000; - while (usleep(u64)); + } + + pthread_mutex_lock(&lfe->sf_device->sd_tune_mutex); 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, satip_frontend_bindaddr(lfe)); - if (rtsp == NULL) + if (rtsp == NULL) { +fast_exit: + tvhpoll_destroy(efd); return NULL; + } /* Setup poll */ - efd = tvhpoll_create(4); memset(ev, 0, sizeof(ev)); ev[0].events = TVHPOLL_IN; ev[0].fd = lfe->sf_rtp->fd; @@ -1002,10 +1044,7 @@ satip_frontend_input_thread ( void *aux ) ev[2].events = TVHPOLL_IN; ev[2].fd = rtsp->hc_fd; ev[2].data.ptr = rtsp; - ev[3].events = TVHPOLL_IN; - ev[3].fd = lfe->sf_dvr_pipe.rd; - ev[3].data.ptr = NULL; - tvhpoll_add(efd, ev, 4); + tvhpoll_add(efd, ev, 3); rtsp->hc_efd = efd; position = lfe_master->sf_position; @@ -1223,7 +1262,7 @@ satip_frontend_input_thread ( void *aux ) r = http_client_run(rtsp); if (r != HTTP_CON_RECEIVING && r != HTTP_CON_SENDING) break; - nfds = tvhpoll_wait(efd, ev, 1, 500); + nfds = tvhpoll_wait(efd, ev, 1, 250); if (nfds == 0) break; if (nfds < 0) { @@ -1449,8 +1488,6 @@ 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;