X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Ftcp.c;h=5738690843abc4f063f04f6434df3aa5423a37f6;hb=9ca5b27240105b89bd914db45329d9a310c55c18;hp=e02c64b800105a40998cda347c45d3aa43a87d29;hpb=a78d9abee0dfef2dc86e711e27b474e7d07dca2e;p=ffmpeg diff --git a/libavformat/tcp.c b/libavformat/tcp.c index e02c64b8001..5738690843a 100644 --- a/libavformat/tcp.c +++ b/libavformat/tcp.c @@ -39,6 +39,8 @@ typedef struct TCPContext { int open_timeout; int rw_timeout; int listen_timeout; + int recv_buffer_size; + int send_buffer_size; } TCPContext; #define OFFSET(x) offsetof(TCPContext, x) @@ -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 }, { "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 }, + { "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 } }; @@ -150,6 +154,15 @@ static int tcp_open(URLContext *h, const char *uri, int flags) h->is_streamed = 1; 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); return 0;