vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Sun Apr 17 22:27:12 2016 +0300| [840b222697f616a479a1ebb789fe5426b558595a] | committer: Rémi Denis-Courmont
rtp: use smaller packets by default (refs #16315) > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=840b222697f616a479a1ebb789fe5426b558595a --- modules/access/rtp/input.c | 42 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/modules/access/rtp/input.c b/modules/access/rtp/input.c index 5397649..7e734c4 100644 --- a/modules/access/rtp/input.c +++ b/modules/access/rtp/input.c @@ -41,6 +41,8 @@ # include <srtp.h> #endif +#define DEFAULT_MRU (1500u - (20 + 8)) + /** * Processes a packet received from the RTP socket. */ @@ -104,6 +106,15 @@ void *rtp_dgram_thread (void *opaque) demux_sys_t *sys = demux->p_sys; mtime_t deadline = VLC_TS_INVALID; int rtp_fd = sys->fd; + struct iovec iov = + { + .iov_len = DEFAULT_MRU, + }; + struct msghdr msg = + { + .msg_iov = &iov, + .msg_iovlen = 1, + }; struct pollfd ufd[1]; ufd[0].fd = rtp_fd; @@ -125,14 +136,37 @@ void *rtp_dgram_thread (void *opaque) if (unlikely(ufd[0].revents & POLLHUP)) break; /* RTP socket dead (DCCP only) */ - block_t *block = block_Alloc (0xffff); /* TODO: p_sys->mru */ + block_t *block = block_Alloc (iov.iov_len); if (unlikely(block == NULL)) - break; /* we are totallly screwed */ + { + if (iov.iov_len == DEFAULT_MRU) + break; /* we are totallly screwed */ + iov.iov_len = DEFAULT_MRU; + continue; /* retry with shrunk MRU */ + } - ssize_t len = recv (rtp_fd, block->p_buffer, block->i_buffer, 0); + iov.iov_base = block->p_buffer; +#ifdef __linux__ + msg.msg_flags = MSG_TRUNC; +#else + msg.msg_flags = 0; +#endif + + ssize_t len = recvmsg (rtp_fd, &msg, 0); if (len != -1) { - block->i_buffer = len; +#ifdef MSG_TRUNC + if (msg.msg_flags & MSG_TRUNC) + { + msg_Err(demux, "%zd bytes packet truncated (MRU was %zu)", + len, iov.iov_len); + block->i_flags |= BLOCK_FLAG_CORRUPTED; + iov.iov_len = len; + } + else +#endif + block->i_buffer = len; + rtp_process (demux, block); } else _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
