]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
SAT>IP: finish the RTSP command to keep connection consistent
authorJaroslav Kysela <perex@perex.cz>
Mon, 28 Jul 2014 15:36:55 +0000 (17:36 +0200)
committerJaroslav Kysela <perex@perex.cz>
Mon, 28 Jul 2014 15:37:12 +0000 (17:37 +0200)
src/input/mpegts/satip/satip_frontend.c

index 218fadfb95d8acecf75d0759b9a3bab99c87c57c..859368567b0ccc172671913128d6f5079f51c0a6 100644 (file)
@@ -927,15 +927,14 @@ satip_frontend_input_thread ( void *aux )
   uint8_t rtcp[2048];
   uint8_t *p;
   sbuf_t sb;
-  int pos, nfds, i, r;
+  int pos, nfds, i, r, tc;
   size_t c;
-  int tc;
   tvhpoll_event_t ev[4];
   tvhpoll_t *efd;
-  int changing = 0, ms = -1, fatal = 0;
+  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;
+  int play2 = 1, position, rtsp_flags = 0, reply;
   uint64_t u64;
 
   lfe->mi_display_name((mpegts_input_t*)lfe, buf, sizeof(buf));
@@ -1004,14 +1003,18 @@ satip_frontend_input_thread ( void *aux )
     tvherror("satip", "%s - failed to tune", buf);
     goto done;
   }
+  reply = 1;
 
   udp_multirecv_init(&um, RTP_PKTS, RTP_PKT_SIZE);
   sbuf_init_fixed(&sb, RTP_PKTS * RTP_PKT_SIZE);
 
-  while (tvheadend_running && !fatal) {
+  while ((reply || running) && !fatal) {
 
     nfds = tvhpoll_wait(efd, ev, 1, ms);
 
+    if (!tvheadend_running)
+      running = 0;
+
     if (nfds > 0 && ev[0].data.ptr == NULL) {
       c = read(lfe->sf_dvr_pipe.rd, rtcp, 1);
       if (c == 1 && rtcp[0] == 'c') {
@@ -1020,13 +1023,15 @@ satip_frontend_input_thread ( void *aux )
         continue;
       }
       tvhtrace("satip", "%s - input thread received shutdown", buf);
-      break;
+      running = 0;
+      continue;
     }
 
     if (changing && rtsp->hc_cmd == HTTP_CMD_NONE) {
       ms = -1;
       changing = 0;
-      satip_frontend_pid_changed(rtsp, lfe, buf);
+      if (satip_frontend_pid_changed(rtsp, lfe, buf) > 0)
+        reply = 1;
       continue;
     }
 
@@ -1039,9 +1044,12 @@ satip_frontend_input_thread ( void *aux )
                buf, r, strerror(-r), rtsp->hc_cmd, rtsp->hc_code);
         fatal = 1;
       } else if (r == HTTP_CON_DONE) {
+        reply = 0;
         switch (rtsp->hc_cmd) {
         case RTSP_CMD_OPTIONS:
           r = rtsp_options_decode(rtsp);
+          if (!running)
+            break;
           if (r < 0) {
             tvhlog(LOG_ERR, "satip", "%s - RTSP OPTIONS error %d (%s) [%i-%i]",
                    buf, r, strerror(-r), rtsp->hc_cmd, rtsp->hc_code);
@@ -1050,6 +1058,8 @@ satip_frontend_input_thread ( void *aux )
           break;
         case RTSP_CMD_SETUP:
           r = rtsp_setup_decode(rtsp, 1);
+          if (!running)
+            break;
           if (r < 0 || rtsp->hc_rtp_port != lfe->sf_rtp_port ||
                        rtsp->hc_rtpc_port != lfe->sf_rtp_port + 1) {
             tvhlog(LOG_ERR, "satip", "%s - RTSP SETUP error %d (%s) [%i-%i]",
@@ -1067,18 +1077,25 @@ satip_frontend_input_thread ( void *aux )
                 tvherror("satip", "%s - failed to tune2", buf);
                 fatal = 1;
               }
+              reply = 1;
               continue;
             } else {
-              if (satip_frontend_pid_changed(rtsp, lfe, buf) > 0)
+              if (satip_frontend_pid_changed(rtsp, lfe, buf) > 0) {
+                reply = 1;
                 continue;
+              }
             }
           }
           break;
         case RTSP_CMD_PLAY:
+          if (!running)
+            break;
           if (rtsp->hc_code == 200 && play2) {
             play2 = 0;
-            if (satip_frontend_pid_changed(rtsp, lfe, buf) > 0)
+            if (satip_frontend_pid_changed(rtsp, lfe, buf) > 0) {
+              reply = 1;
               continue;
+            }
           }
           /* fall thru */
         default:
@@ -1091,6 +1108,9 @@ satip_frontend_input_thread ( void *aux )
         }
         rtsp->hc_cmd = HTTP_CMD_NONE;
       }
+
+      if (!running)
+        continue;
     }
 
     /* We need to keep the session alive */