* RTP protocol
*/
+#include "libavutil/parseutils.h"
#include "libavutil/avstring.h"
#include "avformat.h"
+#include "avio_internal.h"
#include "rtpdec.h"
+#include "url.h"
#include <unistd.h>
#include <stdarg.h>
#include "network.h"
#include "os_support.h"
#include <fcntl.h>
-#if HAVE_SYS_SELECT_H
-#include <sys/select.h>
+#if HAVE_POLL_H
+#include <sys/poll.h>
#endif
#include <sys/time.h>
path, sizeof(path), uri);
ff_url_join(buf, sizeof(buf), "udp", NULL, hostname, port, "%s", path);
- udp_set_remote_url(s->rtp_hd, buf);
+ ff_udp_set_remote_url(s->rtp_hd, buf);
ff_url_join(buf, sizeof(buf), "udp", NULL, hostname, port + 1, "%s", path);
- udp_set_remote_url(s->rtcp_hd, buf);
+ ff_udp_set_remote_url(s->rtcp_hd, buf);
return 0;
}
char path[1024];
const char *p;
- is_output = (flags & URL_WRONLY);
+ is_output = (flags & AVIO_FLAG_WRITE);
s = av_mallocz(sizeof(RTPContext));
if (!s)
p = strchr(uri, '?');
if (p) {
- if (find_info_tag(buf, sizeof(buf), "ttl", p)) {
+ if (av_find_info_tag(buf, sizeof(buf), "ttl", p)) {
ttl = strtol(buf, NULL, 10);
}
- if (find_info_tag(buf, sizeof(buf), "rtcpport", p)) {
+ if (av_find_info_tag(buf, sizeof(buf), "rtcpport", p)) {
rtcp_port = strtol(buf, NULL, 10);
}
- if (find_info_tag(buf, sizeof(buf), "localport", p)) {
+ if (av_find_info_tag(buf, sizeof(buf), "localport", p)) {
local_rtp_port = strtol(buf, NULL, 10);
}
- if (find_info_tag(buf, sizeof(buf), "localrtpport", p)) {
+ if (av_find_info_tag(buf, sizeof(buf), "localrtpport", p)) {
local_rtp_port = strtol(buf, NULL, 10);
}
- if (find_info_tag(buf, sizeof(buf), "localrtcpport", p)) {
+ if (av_find_info_tag(buf, sizeof(buf), "localrtcpport", p)) {
local_rtcp_port = strtol(buf, NULL, 10);
}
- if (find_info_tag(buf, sizeof(buf), "pkt_size", p)) {
+ if (av_find_info_tag(buf, sizeof(buf), "pkt_size", p)) {
max_packet_size = strtol(buf, NULL, 10);
}
- if (find_info_tag(buf, sizeof(buf), "connect", p)) {
+ if (av_find_info_tag(buf, sizeof(buf), "connect", p)) {
connect = strtol(buf, NULL, 10);
}
}
build_udp_url(buf, sizeof(buf),
hostname, rtp_port, local_rtp_port, ttl, max_packet_size,
connect);
- if (url_open(&s->rtp_hd, buf, flags) < 0)
+ if (ffurl_open(&s->rtp_hd, buf, flags) < 0)
goto fail;
if (local_rtp_port>=0 && local_rtcp_port<0)
- local_rtcp_port = udp_get_local_port(s->rtp_hd) + 1;
+ local_rtcp_port = ff_udp_get_local_port(s->rtp_hd) + 1;
build_udp_url(buf, sizeof(buf),
hostname, rtcp_port, local_rtcp_port, ttl, max_packet_size,
connect);
- if (url_open(&s->rtcp_hd, buf, flags) < 0)
+ if (ffurl_open(&s->rtcp_hd, buf, flags) < 0)
goto fail;
/* just to ease handle access. XXX: need to suppress direct handle
access */
- s->rtp_fd = url_get_file_handle(s->rtp_hd);
- s->rtcp_fd = url_get_file_handle(s->rtcp_hd);
+ s->rtp_fd = ffurl_get_file_handle(s->rtp_hd);
+ s->rtcp_fd = ffurl_get_file_handle(s->rtcp_hd);
- h->max_packet_size = url_get_max_packet_size(s->rtp_hd);
+ h->max_packet_size = s->rtp_hd->max_packet_size;
h->is_streamed = 1;
return 0;
fail:
if (s->rtp_hd)
- url_close(s->rtp_hd);
+ ffurl_close(s->rtp_hd);
if (s->rtcp_hd)
- url_close(s->rtcp_hd);
+ ffurl_close(s->rtcp_hd);
av_free(s);
return AVERROR(EIO);
}
RTPContext *s = h->priv_data;
struct sockaddr_storage from;
socklen_t from_len;
- int len, fd_max, n;
- fd_set rfds;
- struct timeval tv;
+ int len, n;
+ struct pollfd p[2] = {{s->rtp_fd, POLLIN, 0}, {s->rtcp_fd, POLLIN, 0}};
+
#if 0
for(;;) {
from_len = sizeof(from);
len = recvfrom (s->rtp_fd, buf, size, 0,
(struct sockaddr *)&from, &from_len);
if (len < 0) {
- if (ff_neterrno() == FF_NETERROR(EAGAIN) ||
- ff_neterrno() == FF_NETERROR(EINTR))
+ if (ff_neterrno() == AVERROR(EAGAIN) ||
+ ff_neterrno() == AVERROR(EINTR))
continue;
return AVERROR(EIO);
}
#else
for(;;) {
if (url_interrupt_cb())
- return AVERROR(EINTR);
+ return AVERROR_EXIT;
/* build fdset to listen to RTP and RTCP packets */
- FD_ZERO(&rfds);
- fd_max = s->rtp_fd;
- FD_SET(s->rtp_fd, &rfds);
- if (s->rtcp_fd > fd_max)
- fd_max = s->rtcp_fd;
- FD_SET(s->rtcp_fd, &rfds);
- tv.tv_sec = 0;
- tv.tv_usec = 100 * 1000;
- n = select(fd_max + 1, &rfds, NULL, NULL, &tv);
+ n = poll(p, 2, 100);
if (n > 0) {
/* first try RTCP */
- if (FD_ISSET(s->rtcp_fd, &rfds)) {
+ if (p[1].revents & POLLIN) {
from_len = sizeof(from);
len = recvfrom (s->rtcp_fd, buf, size, 0,
(struct sockaddr *)&from, &from_len);
if (len < 0) {
- if (ff_neterrno() == FF_NETERROR(EAGAIN) ||
- ff_neterrno() == FF_NETERROR(EINTR))
+ if (ff_neterrno() == AVERROR(EAGAIN) ||
+ ff_neterrno() == AVERROR(EINTR))
continue;
return AVERROR(EIO);
}
break;
}
/* then RTP */
- if (FD_ISSET(s->rtp_fd, &rfds)) {
+ if (p[0].revents & POLLIN) {
from_len = sizeof(from);
len = recvfrom (s->rtp_fd, buf, size, 0,
(struct sockaddr *)&from, &from_len);
if (len < 0) {
- if (ff_neterrno() == FF_NETERROR(EAGAIN) ||
- ff_neterrno() == FF_NETERROR(EINTR))
+ if (ff_neterrno() == AVERROR(EAGAIN) ||
+ ff_neterrno() == AVERROR(EINTR))
continue;
return AVERROR(EIO);
}
break;
}
} else if (n < 0) {
- if (ff_neterrno() == FF_NETERROR(EINTR))
+ if (ff_neterrno() == AVERROR(EINTR))
continue;
return AVERROR(EIO);
}
hd = s->rtp_hd;
}
- ret = url_write(hd, buf, size);
+ ret = ffurl_write(hd, buf, size);
#if 0
{
struct timespec ts;
{
RTPContext *s = h->priv_data;
- url_close(s->rtp_hd);
- url_close(s->rtcp_hd);
+ ffurl_close(s->rtp_hd);
+ ffurl_close(s->rtcp_hd);
av_free(s);
return 0;
}
int rtp_get_local_rtp_port(URLContext *h)
{
RTPContext *s = h->priv_data;
- return udp_get_local_port(s->rtp_hd);
+ return ff_udp_get_local_port(s->rtp_hd);
}
/**
int rtp_get_local_rtcp_port(URLContext *h)
{
RTPContext *s = h->priv_data;
- return udp_get_local_port(s->rtcp_hd);
+ return ff_udp_get_local_port(s->rtcp_hd);
}
static int rtp_get_file_handle(URLContext *h)
return s->rtcp_fd;
}
-URLProtocol rtp_protocol = {
- "rtp",
- rtp_open,
- rtp_read,
- rtp_write,
- NULL, /* seek */
- rtp_close,
+URLProtocol ff_rtp_protocol = {
+ .name = "rtp",
+ .url_open = rtp_open,
+ .url_read = rtp_read,
+ .url_write = rtp_write,
+ .url_close = rtp_close,
.url_get_file_handle = rtp_get_file_handle,
};