Commit 84110f4f authored by Perette Barella's avatar Perette Barella Committed by Michael Niedermayer

libavformat/tcp.c : add send_buffer_size and recv_buffer_size options

adds two new options that may be set via the dictionary:

- send_buffer_size
- recv_buffer_size

When present, setsockopt() is used with SO_SNDBUF and SO_RCVBUF to set
socket buffer sizes.  I chose to make send and receive independent
because buffering requirements are often asymmetric.

Errors in setting the buffer size mean the socket will use its
default, so they are ignored.

There is no sanity checking on values, as the kernel/socket layers
already impose reasonable limits if asked for something crazy.

Rationale for enlarging receive buffers is to reduce susceptibility
to intermittent network delays/congestion.  I added setting the send
buffer for symmetry.
Signed-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
parent 1fb5ae44
...@@ -1147,6 +1147,12 @@ than this time interval, raise error. ...@@ -1147,6 +1147,12 @@ than this time interval, raise error.
@item listen_timeout=@var{milliseconds} @item listen_timeout=@var{milliseconds}
Set listen timeout, expressed in milliseconds. Set listen timeout, expressed in milliseconds.
@item recv_buffer_size=@var{bytes}
Set receive buffer size, expressed bytes.
@item send_buffer_size=@var{bytes}
Set send buffer size, expressed bytes.
@end table @end table
The following example shows how to setup a listening TCP connection The following example shows how to setup a listening TCP connection
......
...@@ -39,6 +39,8 @@ typedef struct TCPContext { ...@@ -39,6 +39,8 @@ typedef struct TCPContext {
int open_timeout; int open_timeout;
int rw_timeout; int rw_timeout;
int listen_timeout; int listen_timeout;
int recv_buffer_size;
int send_buffer_size;
} TCPContext; } TCPContext;
#define OFFSET(x) offsetof(TCPContext, x) #define OFFSET(x) offsetof(TCPContext, x)
...@@ -48,6 +50,8 @@ static const AVOption options[] = { ...@@ -48,6 +50,8 @@ static const AVOption options[] = {
{ "listen", "Listen for incoming connections", OFFSET(listen), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 2, .flags = D|E }, { "listen", "Listen for incoming connections", OFFSET(listen), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 2, .flags = D|E },
{ "timeout", "set timeout (in microseconds) of socket I/O operations", OFFSET(rw_timeout), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, .flags = D|E }, { "timeout", "set timeout (in microseconds) of socket I/O operations", OFFSET(rw_timeout), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, .flags = D|E },
{ "listen_timeout", "Connection awaiting timeout (in milliseconds)", OFFSET(listen_timeout), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, .flags = D|E }, { "listen_timeout", "Connection awaiting timeout (in milliseconds)", OFFSET(listen_timeout), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, .flags = D|E },
{ "send_buffer_size", "Socket send buffer size (in bytes)", OFFSET(send_buffer_size), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, .flags = D|E },
{ "recv_buffer_size", "Socket receive buffer size (in bytes)", OFFSET(recv_buffer_size), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, .flags = D|E },
{ NULL } { NULL }
}; };
...@@ -150,6 +154,15 @@ static int tcp_open(URLContext *h, const char *uri, int flags) ...@@ -150,6 +154,15 @@ static int tcp_open(URLContext *h, const char *uri, int flags)
h->is_streamed = 1; h->is_streamed = 1;
s->fd = fd; s->fd = fd;
/* Set the socket's send or receive buffer sizes, if specified.
If unspecified or setting fails, system default is used. */
if (s->recv_buffer_size > 0) {
setsockopt (fd, SOL_SOCKET, SO_RCVBUF, &s->recv_buffer_size, sizeof (s->recv_buffer_size));
}
if (s->send_buffer_size > 0) {
setsockopt (fd, SOL_SOCKET, SO_SNDBUF, &s->send_buffer_size, sizeof (s->send_buffer_size));
}
freeaddrinfo(ai); freeaddrinfo(ai);
return 0; return 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment