[vlc-commits] sout: chromecast: ues different wait times

Francois Cartegnie git at videolan.org
Thu Oct 2 19:51:21 CEST 2014


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Thu Oct  2 19:49:01 2014 +0200| [33bf55bb71848df64989395d96348acd12d91120] | committer: Francois Cartegnie

sout: chromecast: ues different wait times

There's no reason to wait 6 sec for a reply
to a spontaneous ping. The reply has no
relation with the 5 sec keepalive ping sent from
the receiver.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=33bf55bb71848df64989395d96348acd12d91120
---

 modules/stream_out/chromecast/cast.cpp |   38 +++++++++++++++++++++++++++-----
 1 file changed, 32 insertions(+), 6 deletions(-)

diff --git a/modules/stream_out/chromecast/cast.cpp b/modules/stream_out/chromecast/cast.cpp
index 2245475..efd9c0f 100644
--- a/modules/stream_out/chromecast/cast.cpp
+++ b/modules/stream_out/chromecast/cast.cpp
@@ -103,6 +103,12 @@ struct sout_stream_sys_t
 
 #define SOUT_CFG_PREFIX "sout-chromecast-"
 
+/* deadline regarding pings sent from receiver */
+#define PING_WAIT_TIME 6000
+#define PING_WAIT_RETRIES 0
+/* deadline regarding pong we expect after pinging the receiver */
+#define PONG_WAIT_TIME 500
+#define PONG_WAIT_RETRIES 2
 
 /*****************************************************************************
  * Local prototypes
@@ -462,7 +468,8 @@ static int sendMessages(sout_stream_t *p_stream)
 // Use here only C linkage and POD types as this function is a cancelation point.
 extern "C" int recvPacket(sout_stream_t *p_stream, bool &b_msgReceived,
                           uint32_t &i_payloadSize, int i_sock_fd, vlc_tls_t *p_tls,
-                          unsigned *pi_received, char *p_data, bool *pb_pingTimeout)
+                          unsigned *pi_received, char *p_data, bool *pb_pingTimeout,
+                          int *pi_wait_delay, int *pi_wait_retries)
 {
     struct pollfd ufd[1];
     ufd[0].fd = i_sock_fd;
@@ -472,18 +479,33 @@ extern "C" int recvPacket(sout_stream_t *p_stream, bool &b_msgReceived,
      * If we do not receive one after 6 seconds, we send a PING.
      * If after this PING, we do not receive a PONG, then we consider the
      * connection as dead. */
-    if (poll(ufd, 1, 6000) == 0)
+    if (poll(ufd, 1, *pi_wait_delay) == 0)
     {
         if (*pb_pingTimeout)
         {
-            msg_Err(p_stream, "No PONG answer received from the Chromecast");
-            return 0; // Connection died
+            if (!*pi_wait_retries)
+            {
+                msg_Err(p_stream, "No PONG answer received from the Chromecast");
+                return 0; // Connection died
+            }
+            (*pi_wait_retries)--;
+        }
+        else
+        {
+            /* now expect a pong */
+            *pi_wait_delay = PONG_WAIT_TIME;
+            *pi_wait_retries = PONG_WAIT_RETRIES;
+            msg_Warn(p_stream, "No PING received from the Chromecast, sending a PING");
         }
-        msg_Warn(p_stream, "No PING received from the Chromecast, sending a PING");
         *pb_pingTimeout = true;
     }
     else
+    {
         *pb_pingTimeout = false;
+        /* reset to default ping waiting */
+        *pi_wait_delay = PING_WAIT_TIME;
+        *pi_wait_retries = PING_WAIT_RETRIES;
+    }
 
     int i_ret;
 
@@ -882,6 +904,9 @@ static void* chromecastThread(void* p_data)
     char p_packet[PACKET_MAX_LEN];
     bool b_pingTimeout = false;
 
+    int i_waitdelay = PING_WAIT_TIME;
+    int i_retries = PING_WAIT_RETRIES;
+
     msgAuth(p_stream);
     sendMessages(p_stream);
     vlc_restorecancel(canc);
@@ -891,7 +916,8 @@ static void* chromecastThread(void* p_data)
         bool b_msgReceived = false;
         uint32_t i_payloadSize = 0;
         int i_ret = recvPacket(p_stream, b_msgReceived, i_payloadSize, p_sys->i_sock_fd,
-                               p_sys->p_tls, &i_received, p_packet, &b_pingTimeout);
+                               p_sys->p_tls, &i_received, p_packet, &b_pingTimeout,
+                               &i_waitdelay, &i_retries);
 
         canc = vlc_savecancel();
         // Not cancellation-safe part.



More information about the vlc-commits mailing list