mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-26 19:01:44 +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 "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
|
||||||
|
Loading…
Reference in New Issue
Block a user