[PATCH v3 5/5] stream_pvr: allow initial latency when opening stream

Reza Arbab <[email protected]>
Newsgroups gmane.comp.video.mplayer.devel
Message-ID <[email protected]>
When opening an hdpvr device, there may be a significant delay before
first receiving data, especially at higher bitrates. This can cause
mplayer to time out and exit.

Move the existing device polling code to a static function. Use a
generous 5 second timeout for the first read of the stream.

Signed-off-by: Reza Arbab <[email protected]>
---
 v3:
  * Move the "first" flag into struct pvr_t, so there is one per device.

 v2:
  * Add "Waiting for stream to begin..." message.
  * Instead of adding a new poll in pvr_stream_open, use a longer timeout for
    the first poll pvr_stream_read does.
  * Return -1 on poll timeout.

 stream/stream_pvr.c | 40 ++++++++++++++++++++++++++++++++--------
 1 file changed, 32 insertions(+), 8 deletions(-)

diff --git a/stream/stream_pvr.c b/stream/stream_pvr.c
index 4657210..41d8a23 100644
--- a/stream/stream_pvr.c
+++ b/stream/stream_pvr.c
@@ -111,6 +111,7 @@ typedef struct stationlist_s {
 struct pvr_t {
   int dev_fd;
   char *video_dev;
+  int first;
 
   /* v4l2 params */
   int mute;
@@ -149,6 +150,7 @@ pvr_init (void)
   pvr = calloc (1, sizeof (struct pvr_t));
   pvr->dev_fd = -1;
   pvr->video_dev = strdup (PVR_DEFAULT_DEVICE);
+  pvr->first = 1;
 
   /* v4l2 params */
   pvr->mute = 0;
@@ -1593,6 +1595,26 @@ v4l2_display_settings (struct pvr_t *pvr)
   return 0;
 }
 
+static int
+poll_device (struct pvr_t *pvr, int timeout)
+{
+  struct pollfd pfds[1];
+  int ret;
+
+  pfds[0].fd = pvr->dev_fd;
+  pfds[0].events = POLLIN | POLLPRI;
+
+  ret = poll (pfds, 1, timeout);
+  if (!ret)
+  {
+    mp_msg (MSGT_OPEN, MSGL_WARN,
+            "%s %dms timeout polling stream device\n",
+            LOG_LEVEL_PVR, timeout);
+  }
+
+  return ret;
+}
+
 /* stream layer */
 
 static void
@@ -1610,7 +1632,6 @@ pvr_stream_close (stream_t *stream)
 static int
 pvr_stream_read (stream_t *stream, char *buffer, int size)
 {
-  struct pollfd pfds[1];
   struct pvr_t *pvr;
   int rk, fd, pos;
 
@@ -1626,15 +1647,18 @@ pvr_stream_read (stream_t *stream, char *buffer, int size)
 
   while (pos < size)
   {
-    pfds[0].fd = fd;
-    pfds[0].events = POLLIN | POLLPRI;
-
-    if (!poll (pfds, 1, 500))
+    if (pvr->first)
     {
-      mp_msg (MSGT_OPEN, MSGL_ERR,
-              "%s 500ms timeout polling stream device\n", LOG_LEVEL_PVR);
-      return -1;
+      mp_msg (MSGT_OPEN, MSGL_INFO,
+              "%s Waiting for stream to begin...\n", LOG_LEVEL_PVR);
+      rk = poll_device (pvr, 5000);
+      pvr->first = 0;
     }
+    else
+      rk = poll_device (pvr, 500);
+
+    if (!rk)
+      return -1;
 
     rk = read (fd, &buffer[pos], size-pos);
     if (rk < 0)
-- 
2.5.0

_______________________________________________
MPlayer-dev-eng mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/mplayer-dev-eng
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.