40 #include <netinet/in.h> 41 #include <netinet/sctp.h> 75 socklen_t *fromlen,
struct sctp_sndrcvinfo *sinfo,
80 char incmsg[CMSG_SPACE(
sizeof(
struct sctp_sndrcvinfo))];
81 struct msghdr inmsg = { 0 };
82 struct cmsghdr *cmsg =
NULL;
87 inmsg.msg_name =
from;
88 inmsg.msg_namelen = fromlen ? *fromlen : 0;
91 inmsg.msg_control = incmsg;
92 inmsg.msg_controllen =
sizeof(incmsg);
94 if ((recvb = recvmsg(s, &inmsg, msg_flags ? *msg_flags : 0)) < 0)
98 *fromlen = inmsg.msg_namelen;
100 *msg_flags = inmsg.msg_flags;
102 for (cmsg = CMSG_FIRSTHDR(&inmsg); cmsg;
103 cmsg = CMSG_NXTHDR(&inmsg, cmsg)) {
104 if ((IPPROTO_SCTP == cmsg->cmsg_level) &&
105 (SCTP_SNDRCV == cmsg->cmsg_type))
111 memcpy(sinfo, CMSG_DATA(cmsg),
sizeof(
struct sctp_sndrcvinfo));
117 const struct sctp_sndrcvinfo *sinfo,
int flags)
119 struct msghdr outmsg = { 0 };
122 outmsg.msg_name =
NULL;
123 outmsg.msg_namelen = 0;
124 outmsg.msg_iov = &iov;
125 iov.iov_base = (
void*)msg;
127 outmsg.msg_iovlen = 1;
128 outmsg.msg_controllen = 0;
131 char outcmsg[CMSG_SPACE(
sizeof(
struct sctp_sndrcvinfo))];
132 struct cmsghdr *cmsg;
134 outmsg.msg_control = outcmsg;
135 outmsg.msg_controllen =
sizeof(outcmsg);
136 outmsg.msg_flags = 0;
138 cmsg = CMSG_FIRSTHDR(&outmsg);
139 cmsg->cmsg_level = IPPROTO_SCTP;
140 cmsg->cmsg_type = SCTP_SNDRCV;
141 cmsg->cmsg_len = CMSG_LEN(
sizeof(
struct sctp_sndrcvinfo));
143 outmsg.msg_controllen = cmsg->cmsg_len;
144 memcpy(CMSG_DATA(cmsg), sinfo,
sizeof(
struct sctp_sndrcvinfo));
160 #define OFFSET(x) offsetof(SCTPContext, x) 161 #define D AV_OPT_FLAG_DECODING_PARAM 162 #define E AV_OPT_FLAG_ENCODING_PARAM 182 struct sctp_event_subscribe event = { 0 };
183 struct sctp_initmsg initparams = { 0 };
190 char hostname[1024], proto[1024], path[1024];
194 &port, path,
sizeof(path), uri);
195 if (strcmp(proto,
"sctp"))
197 if (port <= 0 || port >= 65536) {
202 p = strchr(uri,
'?');
212 snprintf(portstr,
sizeof(portstr),
"%d", port);
246 event.sctp_data_io_event = 1;
249 if (setsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, &event,
250 sizeof(event)) != 0) {
252 "SCTP ERROR: Unable to subscribe to events\n");
259 if (setsockopt(fd, IPPROTO_SCTP, SCTP_INITMSG, &initparams,
260 sizeof(initparams)) < 0) {
262 "SCTP ERROR: Unable to initialize socket max streams %d\n",
292 int ev = write ? POLLOUT : POLLIN;
293 struct pollfd p = { .fd =
fd, .events = ev, .revents = 0 };
296 ret = poll(&p, 1, 100);
313 struct sctp_sndrcvinfo info = { 0 };
315 AV_WB16(buf, info.sinfo_stream);
316 ret = ret < 0 ? ret : ret + 2;
318 ret = recv(s->
fd, buf, size, 0);
336 struct sctp_sndrcvinfo info = { 0 };
337 info.sinfo_stream =
AV_RB16(buf);
371 .priv_data_class = &sctp_class,
void av_url_split(char *proto, int proto_size, char *authorization, int authorization_size, char *hostname, int hostname_size, int *port_ptr, char *path, int path_size, const char *url)
Split a URL string into components.
struct sockaddr_storage dest_addr
static int ff_sctp_recvmsg(int s, void *msg, size_t len, struct sockaddr *from, socklen_t *fromlen, struct sctp_sndrcvinfo *sinfo, int *msg_flags)
#define URL_PROTOCOL_FLAG_NETWORK
#define LIBAVUTIL_VERSION_INT
int is_streamed
true if streamed (no seek possible), default = false
const char * av_default_item_name(void *ptr)
Return the context name.
static const AVClass sctp_class
static int sctp_write(URLContext *h, const uint8_t *buf, int size)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16
int ff_socket(int af, int type, int proto)
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
int ff_listen_bind(int fd, const struct sockaddr *addr, socklen_t addrlen, int timeout, URLContext *h)
Bind to a file descriptor and poll for a connection.
miscellaneous OS support macros and functions.
int ff_listen_connect(int fd, const struct sockaddr *addr, socklen_t addrlen, int timeout, URLContext *h, int will_try_next)
Connect to a file descriptor and poll for result.
int av_find_info_tag(char *arg, int arg_size, const char *tag1, const char *info)
Attempt to find a specific tag in a URL.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static int sctp_close(URLContext *h)
static int sctp_get_file_handle(URLContext *h)
static int sctp_wait_fd(int fd, int write)
#define AVERROR_EXIT
Immediate exit was requested; the called function should not be restarted.
static int ff_sctp_send(int s, const void *msg, size_t len, const struct sctp_sndrcvinfo *sinfo, int flags)
#define AVIO_FLAG_NONBLOCK
Use non-blocking mode.
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Describe the class of an AVClass context structure.
static const AVOption options[]
static int sctp_open(URLContext *h, const char *uri, int flags)
const URLProtocol ff_sctp_protocol
#define flags(name, subs,...)
static int sctp_read(URLContext *h, uint8_t *buf, int size)
struct addrinfo * ai_next
unbuffered private I/O API
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Frame references ownership and permissions
struct sockaddr * ai_addr