vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Sun Apr 26 11:08:35 2020 +0300| [989b8dc72cbc0fab3b348c68490ac765b4b1794e] | committer: Rémi Denis-Courmont
rtp: add initial datagram socket abstraction RTP and RTCP are packet-based. The low-level I/O abstraction needed is similar but different from that of connection-oriented streams as provided by `struct vlc_tls'. So this adds a new suitable abstraction for the RTP plugin(s). > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=989b8dc72cbc0fab3b348c68490ac765b4b1794e --- modules/access/rtp/Makefile.am | 1 + modules/access/rtp/datagram.c | 101 +++++++++++++++++++++++++++++++++++++++++ modules/access/rtp/vlc_dtls.h | 70 ++++++++++++++++++++++++++++ 3 files changed, 172 insertions(+) diff --git a/modules/access/rtp/Makefile.am b/modules/access/rtp/Makefile.am index d1f7b5a7e8..b097f804ca 100644 --- a/modules/access/rtp/Makefile.am +++ b/modules/access/rtp/Makefile.am @@ -6,6 +6,7 @@ librtp_plugin_la_SOURCES = \ access/rtp/xiph.c \ access/rtp/sdp.c access/rtp/sdp.h \ access/rtp/rtpfmt.c \ + access/rtp/datagram.c access/rtp/vlc_dtls.h \ access/rtp/rtp.c access/rtp/rtp.h librtp_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)/access/rtp librtp_plugin_la_CFLAGS = $(AM_CFLAGS) diff --git a/modules/access/rtp/datagram.c b/modules/access/rtp/datagram.c new file mode 100644 index 0000000000..47dad02464 --- /dev/null +++ b/modules/access/rtp/datagram.c @@ -0,0 +1,101 @@ +/***************************************************************************** + * datagram.c: + ***************************************************************************** + * Copyright (C) 2020 Rémi Denis-Courmont + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <stdlib.h> + +#include <vlc_common.h> +#include <vlc_network.h> +#include "vlc_dtls.h" + +struct vlc_dgram_sock +{ + int fd; + struct vlc_dtls s; +}; + +static void vlc_datagram_Close(struct vlc_dtls *dgs) +{ + struct vlc_dgram_sock *s = container_of(dgs, struct vlc_dgram_sock, s); + +#ifndef _WIN32 + vlc_close(s->fd); +#else + closesocket(s->fd); +#endif + free(s); +} + +/* Note: must not be a cancellation point */ +static int vlc_datagram_GetPollFD(struct vlc_dtls *dgs, short *restrict ev) +{ + (void) ev; /* no changes there */ + return container_of(dgs, struct vlc_dgram_sock, s)->fd; +} + +static ssize_t vlc_datagram_Recv(struct vlc_dtls *dgs, struct iovec *iov, + unsigned iovlen, bool *truncated) +{ + struct msghdr msg = { + .msg_iov = iov, + .msg_iovlen = iovlen, + }; + int fd = container_of(dgs, struct vlc_dgram_sock, s)->fd; + ssize_t ret = recvmsg(fd, &msg, 0); + + if (ret >= 0) + *truncated = (msg.msg_flags & MSG_TRUNC) != 0; + + return ret; +} + +static ssize_t vlc_datagram_Send(struct vlc_dtls *dgs, + const struct iovec *iov, unsigned iovlen) +{ + const struct msghdr msg = { + .msg_iov = (struct iovec *)iov, + .msg_iovlen = iovlen, + }; + int fd = container_of(dgs, struct vlc_dgram_sock, s)->fd; + + return vlc_sendmsg(fd, &msg, 0); +} + +static const struct vlc_dtls_operations vlc_datagram_ops = { + vlc_datagram_Close, + vlc_datagram_GetPollFD, + vlc_datagram_Recv, + vlc_datagram_Send, +}; + +struct vlc_dtls *vlc_datagram_CreateFD(int fd) +{ + struct vlc_dgram_sock *s = malloc(sizeof (*s)); + + if (likely(s != NULL)) { + s->fd = fd; + s->s.ops = &vlc_datagram_ops; + } + + return &s->s; +} diff --git a/modules/access/rtp/vlc_dtls.h b/modules/access/rtp/vlc_dtls.h new file mode 100644 index 0000000000..fcba496e98 --- /dev/null +++ b/modules/access/rtp/vlc_dtls.h @@ -0,0 +1,70 @@ +/***************************************************************************** + * datagram.h: + ***************************************************************************** + * Copyright (C) 2020 Rémi Denis-Courmont + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef VLC_DATAGRAM_SOCKET_H +# define VLC_DATAGRAM_SOCKET_H + +struct iovec; + +/** + * Datagram socket + */ +struct vlc_dtls { + const struct vlc_dtls_operations *ops; +}; + +struct vlc_dtls_operations { + void (*close)(struct vlc_dtls *); + + int (*get_fd)(struct vlc_dtls *, short *events); + ssize_t (*readv)(struct vlc_dtls *, struct iovec *iov, unsigned len, + bool *restrict truncated); + ssize_t (*writev)(struct vlc_dtls *, const struct iovec *iov, unsigned len); +}; + +static inline void vlc_dtls_Close(struct vlc_dtls *dgs) +{ + dgs->ops->close(dgs); +} + +static inline int vlc_dtls_GetPollFD(struct vlc_dtls *dgs, short *restrict ev) +{ + return dgs->ops->get_fd(dgs, ev); +} + +static inline ssize_t vlc_dtls_Recv(struct vlc_dtls *dgs, void *buf, size_t len, + bool *restrict truncated) +{ + struct iovec iov = { .iov_base = buf, .iov_len = len }; + + return dgs->ops->readv(dgs, &iov, 1, truncated); +} + +static inline ssize_t vlc_dtls_Send(struct vlc_dtls *dgs, const void *buf, + size_t len) +{ + struct iovec iov = { .iov_base = (void *)buf, .iov_len = len }; + + return dgs->ops->writev(dgs, &iov, 1); +} + +struct vlc_dtls *vlc_datagram_CreateFD(int fd); + +#endif _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
