Signed-off-by: Michael Niedermayer <michaelni@gmx.at>tags/n1.1
| @@ -22,6 +22,8 @@ | |||||
| #include "network.h" | #include "network.h" | ||||
| #include "libavcodec/internal.h" | #include "libavcodec/internal.h" | ||||
| #include "libavutil/mem.h" | #include "libavutil/mem.h" | ||||
| #include "url.h" | |||||
| #include "libavutil/time.h" | |||||
| #define THREADS (HAVE_PTHREADS || (defined(WIN32) && !defined(__MINGW32CE__))) | #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); | 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) | void ff_network_close(void) | ||||
| { | { | ||||
| #if HAVE_WINSOCK2_H | #if HAVE_WINSOCK2_H | ||||
| @@ -26,6 +26,7 @@ | |||||
| #include "config.h" | #include "config.h" | ||||
| #include "libavutil/error.h" | #include "libavutil/error.h" | ||||
| #include "os_support.h" | #include "os_support.h" | ||||
| #include "avio.h" | |||||
| #if HAVE_UNISTD_H | #if HAVE_UNISTD_H | ||||
| #include <unistd.h> | #include <unistd.h> | ||||
| @@ -80,6 +81,18 @@ void ff_tls_deinit(void); | |||||
| int ff_network_wait_fd(int fd, int write); | 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); | int ff_inet_aton (const char * str, struct in_addr * add); | ||||
| #if !HAVE_STRUCT_SOCKADDR_STORAGE | #if !HAVE_STRUCT_SOCKADDR_STORAGE | ||||