summaryrefslogtreecommitdiff
path: root/libavformat/tcp.c
Commit message (Collapse)AuthorAge
* lavf/network: log ff_listen() errors to proper contexts rather than NULLAnton Khirnov2022-01-21
|
* lavf/network: log ff_socket() errors to proper contexts rather than NULLAnton Khirnov2022-01-21
|
* lavf/rtmp: Add option to set TCP_NODELAY for rtmpNick Ruff2021-06-20
| | | | Suggested-By: ffmpeg@fb.com
* avformat/tcp: re-add checks for setsockopt return valuesJames Almer2018-09-11
| | | | | | | Originally added in 0ed0af595b691121d08bad23b56adf24a23a7ae5 and lost by mistake in ef71ef5f30ddf1cd61e46628a04608892caf76d2. Signed-off-by: James Almer <jamrial@gmail.com>
* Merge commit '8c76bfacf663ff71cee5264a74d0f9c86addd325'James Almer2018-09-11
|\ | | | | | | | | | | | | * commit '8c76bfacf663ff71cee5264a74d0f9c86addd325': tcp: Use ff_connect_parallel for RFC 8305 style connecting Merged-by: James Almer <jamrial@gmail.com>
| * tcp: Use ff_connect_parallel for RFC 8305 style connectingMartin Storsjö2018-08-31
| | | | | | | | Signed-off-by: Martin Storsjö <martin@martin.st>
| * tcp: Use rw_timeout for setting the connect/listen timeoutsMartin Storsjö2016-03-24
| | | | | | | | | | | | | | | | Apply the default value for timeout in code instead of via the avoption, to allow distinguishing the default value from the user not setting anything at all. Signed-off-by: Martin Storsjö <martin@martin.st>
* | lavf/tcp: check return value of setsockopt.Jun Zhao2018-08-18
| | | | | | | | | | | | | | when setsockopt fail, use ff_log_net_error to dump the string describing for error number. Signed-off-by: Jun Zhao <mypopydev@gmail.com>
* | lavf/tcp: add option to setting Maximum Segment SizeJun Zhao2018-07-26
| | | | | | | | | | | | | | | | This can change the the MSS value announced to the other end in the initial TCP packet, it's can be used when failed Path MTU discovery. Signed-off-by: Jun Zhao <mypopydev@gmail.com>
* | lavf/tcp.c: Free allocated client URLContext in case of error.Stephan Holljes2018-04-19
| | | | | | | | | | Signed-off-by: Stephan Holljes <klaxa1337@googlemail.com> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
* | tcp: properly return EOFwm42017-12-31
| | | | | | | | | | | | | | There is no POSIX error code for EOF - recv() signals EOF by simply returning 0. But libavformat recently changed its conventions and requires an explicit AVERROR_EOF, or it might get into an endless retry loop, consuming 100% CPU while doing nothing.
* | lavf/tcp: Fix the type of the optlen argument to getsockopt().Carl Eugen Hoyos2017-11-18
| | | | | | | | | | Fixes a warning on aix: libavformat/tcp.c:283:58: warning: passing argument 5 of 'getsockopt' from incompatible pointer type
* | avformat/tcp: add option to enable TCP_NODELAYAman Gupta2017-11-17
| | | | | | | | | | | | | | | | This can reduce latency and increase throughput, particularly on high latency networks. Signed-off-by: Aman Gupta <aman@tmm1.net> Reviewed-by: Jeyapal, Karthick <kjeyapal@akamai.com>
* | libavformat/tcp: fix return code for tcp_acceptSimon Thelen2017-05-10
| | | | | | | | | | | | | | | | | | ff_accept can return AVERROR(ETIMEDOUT) and errno will be 0 (or undefined), return ret instead and return ff_neterror() in ff_poll_interrupt instead of AVERROR(errno) to parse WSAGetLastError on Windows. Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
* | HTTP: improve performance by reducing forward seeksJoel Cunningham2017-02-14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This commit optimizes HTTP performance by reducing forward seeks, instead favoring a read-ahead and discard on the current connection (referred to as a short seek) for seeks that are within a TCP window's worth of data. This improves performance because with TCP flow control, a window's worth of data will be in the local socket buffer already or in-flight from the sender once congestion control on the sender is fully utilizing the window. Note: this approach doesn't attempt to differentiate from a newly opened connection which may not be fully utilizing the window due to congestion control vs one that is. The receiver can't get at this information, so we assume worst case; that full window is in use (we did advertise it after all) and that data could be in-flight The previous behavior of closing the connection, then opening a new with a new HTTP range value results in a massive amounts of discarded and re-sent data when large TCP windows are used. This has been observed on MacOS/iOS which starts with an initial window of 256KB and grows up to 1MB depending on the bandwidth-product delay. When seeking within a window's worth of data and we close the connection, then open a new one within the same window's worth of data, we discard from the current offset till the end of the window. Then on the new connection the server ends up re-sending the previous data from new offset till the end of old window. Example (assumes full window utilization): TCP window size: 64KB Position: 32KB Forward seek position: 40KB * (Next window) 32KB |--------------| 96KB |---------------| 160KB * 40KB |---------------| 104KB Re-sent amount: 96KB - 40KB = 56KB For a real world test example, I have MP4 file of ~25MB, which ffplay only reads ~16MB and performs 177 seeks. With current ffmpeg, this results in 177 HTTP GETs and ~73MB worth of TCP data communication. With this patch, ffmpeg issues 4 HTTP GETs and 3 seeks for a total of ~22MB of TCP data communication. To support this feature, the short seek logic in avio_seek() has been extended to call a function to get the short seek threshold value. This callback has been plumbed to the URLProtocol structure, which now has infrastructure in HTTP and TCP to get the underlying receiver window size via SO_RCVBUF. If the underlying URL and protocol don't support returning a short seek threshold, the default s->short_seek_threshold is used This feature has been tested on Windows 7 and MacOS/iOS. Windows support is slightly complicated by the fact that when TCP window auto-tuning is enabled, SO_RCVBUF doesn't report the real window size, but it does if SO_RCVBUF was manually set (disabling auto-tuning). So we can only use this optimization on Windows in the later case Signed-off-by: Joel Cunningham <joel.cunningham@me.com> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
* | tcp: set socket buffer sizes before listen/connect/acceptJoel Cunningham2017-01-26
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | From e24d95c0e06a878d401ee34fd6742fcaddeeb95f Mon Sep 17 00:00:00 2001 From: Joel Cunningham <joel.cunningham@me.com> Date: Mon, 9 Jan 2017 13:37:51 -0600 Subject: [PATCH] tcp: set socket buffer sizes before listen/connect/accept Attempting to set SO_RCVBUF and SO_SNDBUF on TCP sockets after connection establishment is incorrect and some stacks ignore the set call on the socket at this point. This has been observed on MacOS/iOS. Windows 7 has some peculiar behavior where setting SO_RCVBUF after applies only if the buffer is increasing from the default while decreases are ignored. This is possibly how the incorrect usage has gone unnoticed Unix Network Programming Vol. 1: The Sockets Networking API (3rd edition, seciton 7.5): "When setting the size of the TCP socket receive buffer, the ordering of the function calls is important. This is because of TCP's window scale option, which is exchanged with the peer on SYN segments when the connection is established. For a client, this means the SO_RCVBUF socket option must be set before calling connect. For a server, this means the socket option must be set for the listening socket before calling listen. Setting this option for the connected socket will have no effect whatsoever on the possible window scale option because accept does not return with the connected socket until TCP's three-way handshake is complete. This is why the option must be set on the listening socket. (The sizes of the socket buffers are always inherited from the listening socket by the newly created connected socket)" Signed-off-by: Joel Cunningham <joel.cunningham@me.com> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
* | avformat/tcp: Put struct sockaddr_in6 under #ifMichael Niedermayer2016-11-06
| | | | | | | | | | | | | | Fixes: error: dereferencing pointer to incomplete type Tested-by: Dave Yeo <daveryeo@telus.net> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
* | avformat/tcp: workaround for IOS9 getaddrinfo in IPv6 only network use ↵liu jc2016-11-05
| | | | | | | | | | | | | | hardcode IPv4 address can not resolve port number. Signed-off-by: liujingchao <jcliu@outlook.com> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
* | Merge commit '2758cdedfb7ac61f8b5e4861f99218b6fd43491d'Derek Buitenhuis2016-02-29
|\| | | | | | | | | | | | | | | | | | | | | This commit also disables the async fate test, because it used internal APIs in a non-kosher way, which no longer exists. * commit '2758cdedfb7ac61f8b5e4861f99218b6fd43491d': lavf: reorganize URLProtocols Merged-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
| * lavf: reorganize URLProtocolsAnton Khirnov2016-02-22
| | | | | | | | | | | | | | | | | | | | Instead of a linked list constructed at av_register_all(), store them in a constant array of pointers. Since no registration is necessary now, this removes some global state from lavf. This will also allow the urlprotocol layer caller to limit the available protocols in a simple and flexible way in the following commits.
* | libavformat/tcp.c : add send_buffer_size and recv_buffer_size optionsPerette Barella2016-01-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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: Michael Niedermayer <michael@niedermayer.cc>
* | avformat/tcp: TCP Protocol: fix descriptor leak on listen and interruptAlexander S. Drozdov2015-09-11
| | | | | | | | | | | | | | | | | | | | | | If we try to listen on TCP port and ff_listen() fails on interrupt callback socket (bind) descriptor overwrites and does not closed at all. As a result, we can't rebind to the same port. Reviewed-by: Stephan Holljes <klaxa1337@googlemail.com> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
* | lavf/tcp: increase range for listen and call the underlying socket ↵Stephan Holljes2015-08-01
| | | | | | | | | | | | operations accordingly Signed-off-by: Stephan Holljes <klaxa1337@googlemail.com>
* | lavf/tcp: add tcp_acceptStephan Holljes2015-08-01
| | | | | | | | Signed-off-by: Stephan Holljes <klaxa1337@googlemail.com>
* | Merge commit '27852f2f1dec3749ea79883b70484c841169f747'Michael Niedermayer2015-04-09
|\| | | | | | | | | | | | | * commit '27852f2f1dec3749ea79883b70484c841169f747': libavformat: Handle error return from ff_listen_bind Merged-by: Michael Niedermayer <michaelni@gmx.at>
| * libavformat: Handle error return from ff_listen_bindAnders Nystrom2015-04-09
| | | | | | | | | | | | | | Handle error return from ff_listen_bind without leaking file descriptors. Signed-off-by: Anders Nystrom <anders.nystrom@southpole.se> Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
* | Merge commit 'e14f98c62fdf8744b07419314095d1b3248cce75'Michael Niedermayer2015-02-28
|\| | | | | | | | | | | | | | | | | | | * commit 'e14f98c62fdf8744b07419314095d1b3248cce75': tcp: Clarify the units for the timeout avoptions Conflicts: libavformat/tcp.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
| * tcp: Clarify the units for the timeout avoptionsMartin Storsjö2015-02-28
| | | | | | | | Signed-off-by: Martin Storsjö <martin@martin.st>
* | lavf/tcp: Clarify that the -timeout option takes microseconds.Carl Eugen Hoyos2014-11-12
| |
* | Merge commit '1d4579e38ecad578c86516fad2837a273d11b320'Michael Niedermayer2014-10-11
|\| | | | | | | | | | | | | | | | | | | | | * commit '1d4579e38ecad578c86516fad2837a273d11b320': tcp: Add AVOption support Conflicts: libavformat/tcp.c See: 2e009c6042bde419599ebed9165e597bbef23b2f Merged-by: Michael Niedermayer <michaelni@gmx.at>
| * tcp: Add AVOption supportLuca Barbato2014-10-10
| |
* | Merge commit '6ee1cb5740e7490151db7dcec7e20ceaf8a2fe1f'Michael Niedermayer2014-08-25
|\| | | | | | | | | | | | | * commit '6ee1cb5740e7490151db7dcec7e20ceaf8a2fe1f': libavformat: use MSG_NOSIGNAL when applicable Merged-by: Michael Niedermayer <michaelni@gmx.at>
| * libavformat: use MSG_NOSIGNAL when applicableRémi Denis-Courmont2014-08-25
| | | | | | | | | | | | | | If the remote end of a connection oriented socket hangs up, generating an EPIPE error is preferable over an unhandled SIGPIPE signal. Signed-off-by: Martin Storsjö <martin@martin.st>
| * tcp: Explicitly convert a pointer to a boolean integerMartin Storsjö2013-09-09
| | | | | | | | | | | | | | | | | | This fixes warnings about making integers from pointers without a cast, and avoids the theoretical case where the lower 32 bits of the pointer would all be zero where the implicit cast wouldn't give the right result. Signed-off-by: Martin Storsjö <martin@martin.st>
* | doc/protocols/tcp,lavf/tcp: apply minor fixes to TCP protocol documentationStefano Sabatini2013-12-25
| |
* | lavf/tcp: honor listen option value in a tagStefano Sabatini2013-12-25
| | | | | | | | | | Consistent with what is done in udp.c, allow to explicitly disable listen with listen=0.
* | avformat/tcp: fix pointer to int warningMichael Niedermayer2013-08-25
| | | | | | | | Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
* | Merge commit 'abe5268c3328bf0e8fcfb7dc6e231b8920177c3a'Michael Niedermayer2013-08-06
|\| | | | | | | | | | | | | | | | | | | * commit 'abe5268c3328bf0e8fcfb7dc6e231b8920177c3a': tcp: Use a different log message and level if there's more addresses to try Conflicts: libavformat/tcp.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
| * tcp: Use a different log message and level if there's more addresses to tryMartin Storsjö2013-08-06
| | | | | | | | | | | | | | | | | | This lowers the level of warnings printed if trying to connect to a host name that provides both v6 and v4 addresses but the service only is available on the v4 address (often occurring for 'localhost', with servers that aren't v6-aware). Signed-off-by: Martin Storsjö <martin@martin.st>
* | Merge commit 'bb9378251a167ef0116f263912e57f715c1e02ac'Michael Niedermayer2013-08-06
|\| | | | | | | | | | | | | * commit 'bb9378251a167ef0116f263912e57f715c1e02ac': network: Use SOCK_CLOEXEC when available Merged-by: Michael Niedermayer <michaelni@gmx.at>
| * network: Use SOCK_CLOEXEC when availableLuca Barbato2013-08-05
| |
* | tcp: Use a default timeout of 5 sec for opening a connection but not for ↵Michael Niedermayer2013-07-06
| | | | | | | | | | | | | | | | | | receiving packets This should be closer to how tcp behaved longer ago and should fix the issue with idle connections timing out. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
* | tcp: Fix the default timeoutMichael Niedermayer2013-07-06
| | | | | | | | | | | | Fixes Ticket2694 Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
* | Merge commit '9835abb6d63fb07613994ae90e72fef758149408'Michael Niedermayer2013-06-05
|\| | | | | | | | | | | | | | | | | | | | | * commit '9835abb6d63fb07613994ae90e72fef758149408': network: uniform ff_listen_bind and ff_listen_connect Conflicts: libavformat/network.c libavformat/tcp.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
| * network: uniform ff_listen_bind and ff_listen_connectLuca Barbato2013-06-04
| | | | | | | | | | Document the functions and have both use a millisecond timeout and check for interrupt.
* | Merge remote-tracking branch 'qatar/master'Michael Niedermayer2013-06-02
|\| | | | | | | | | | | | | | | | | | | | | * qatar/master: network: factor out connect-listening code Conflicts: libavformat/network.h libavformat/tcp.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
| * network: factor out connect-listening codeLuca Barbato2013-06-01
| | | | | | | | | | Introduce ff_listen_connect, to be shared with the other non-tcp network protocols.
* | Merge commit '28306e6d620c109ddd672f7243adfbc2bbb3b18f'Michael Niedermayer2013-06-02
|\| | | | | | | | | | | | | | | | | | | | | * commit '28306e6d620c109ddd672f7243adfbc2bbb3b18f': network: factor out bind-listening code use my full first name instead of short one in copyrights Conflicts: libavformat/tcp.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
| * network: factor out bind-listening codeLuca Barbato2013-06-01
| | | | | | | | | | Introduce ff_listen_bind, to be shared with the other non-tcp network protocols.
* | avformat/avdevice: add missing time.h includesMichael Niedermayer2013-03-12
| | | | | | | | Signed-off-by: Michael Niedermayer <michaelni@gmx.at>