[FFmpeg-devel] [PATCH 1/2] Introduce ff_network_wait_fd_timeout()

Andrey Utkin andrey.krieger.utkin at gmail.com
Tue Oct 9 14:26:02 CEST 2012


---
 libavformat/network.c |   22 ++++++++++++++++++++++
 libavformat/network.h |   13 +++++++++++++
 2 files changed, 35 insertions(+), 0 deletions(-)

diff --git a/libavformat/network.c b/libavformat/network.c
index 0e79cae..3e142fc 100644
--- a/libavformat/network.c
+++ b/libavformat/network.c
@@ -22,6 +22,8 @@
 #include "network.h"
 #include "libavcodec/internal.h"
 #include "libavutil/mem.h"
+#include "url.h"
+#include "libavutil/time.h"
 
 #define THREADS (HAVE_PTHREADS || (defined(WIN32) && !defined(__MINGW32CE__)))
 
@@ -150,6 +152,26 @@ int ff_network_wait_fd(int fd, int write)
     return ret < 0 ? ff_neterrno() : p.revents & (ev | POLLERR | POLLHUP) ? 0 : AVERROR(EAGAIN);
 }
 
+int ff_network_wait_fd_timeout(int fd, int write, int64_t timeout, AVIOInterruptCB *int_cb)
+{
+    int ret;
+    int64_t wait_start = 0;
+
+    while (1) {
+        ret = ff_network_wait_fd(fd, write);
+        if (ret != AVERROR(EAGAIN))
+            return ret;
+        if (ff_check_interrupt(int_cb))
+            return AVERROR_EXIT;
+        if (timeout) {
+            if (!wait_start)
+                wait_start = av_gettime();
+            else if (av_gettime() - wait_start > timeout)
+                return AVERROR(ETIMEDOUT);
+        }
+    }
+}
+
 void ff_network_close(void)
 {
 #if HAVE_WINSOCK2_H
diff --git a/libavformat/network.h b/libavformat/network.h
index cce188f..51d855d 100644
--- a/libavformat/network.h
+++ b/libavformat/network.h
@@ -26,6 +26,7 @@
 #include "config.h"
 #include "libavutil/error.h"
 #include "os_support.h"
+#include "avio.h"
 
 #if HAVE_UNISTD_H
 #include <unistd.h>
@@ -80,6 +81,18 @@ void ff_tls_deinit(void);
 
 int ff_network_wait_fd(int fd, int write);
 
+/**
+ * This works similarly to ff_network_wait_fd, but waits up to 'timeout' microseconds
+ * Uses ff_network_wait_fd in a loop
+ *
+ * @fd Socket descriptor
+ * @write Set 1 to wait for socket able to be read, 0 to be written
+ * @timeout Timeout interval, in microseconds. Actual precision is 100000 mcs, due to ff_network_wait_fd usage
+ * @param int_cb Interrupt callback, is checked after each ff_network_wait_fd call
+ * @return 0 if data can be read/written, AVERROR(ETIMEDOUT) if timeout expired, or negative error code
+ */
+int ff_network_wait_fd_timeout(int fd, int write, int64_t timeout, AVIOInterruptCB *int_cb);
+
 int ff_inet_aton (const char * str, struct in_addr * add);
 
 #if !HAVE_STRUCT_SOCKADDR_STORAGE
-- 
1.7.8.6



More information about the ffmpeg-devel mailing list