mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-21 10:55:51 +02:00
Introduce ff_network_wait_fd_timeout()
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
3a45688abc
commit
d2b18c8f5b
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user