X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Frtpproto.c;h=c93de4af2b02b134f430d7d0f91773475b42331e;hb=f9cf91d8224eb9081e50b6cee55423ccb0bf9e90;hp=8772510ac5ab0ec8b61ef5a911c6371e907b128d;hpb=e52a9145c8bf0748ae970e210e528ff56508964c;p=ffmpeg diff --git a/libavformat/rtpproto.c b/libavformat/rtpproto.c index 8772510ac5a..c93de4af2b0 100644 --- a/libavformat/rtpproto.c +++ b/libavformat/rtpproto.c @@ -60,7 +60,7 @@ typedef struct RTPContext { * @return zero if no error. */ -int rtp_set_remote_url(URLContext *h, const char *uri) +int ff_rtp_set_remote_url(URLContext *h, const char *uri) { RTPContext *s = h->priv_data; char hostname[256]; @@ -86,7 +86,7 @@ int rtp_set_remote_url(URLContext *h, const char *uri) * "http://host:port/path?option1=val1&option2=val2... */ -static void url_add_option(char *buf, int buf_size, const char *fmt, ...) +static av_printf_format(3, 4) void url_add_option(char *buf, int buf_size, const char *fmt, ...) { char buf1[1024]; va_list ap; @@ -136,22 +136,15 @@ static void build_udp_url(char *buf, int buf_size, static int rtp_open(URLContext *h, const char *uri, int flags) { - RTPContext *s; + RTPContext *s = h->priv_data; int rtp_port, rtcp_port, - is_output, ttl, connect, + ttl, connect, local_rtp_port, local_rtcp_port, max_packet_size; char hostname[256]; char buf[1024]; char path[1024]; const char *p; - is_output = (flags & URL_WRONLY); - - s = av_mallocz(sizeof(RTPContext)); - if (!s) - return AVERROR(ENOMEM); - h->priv_data = s; - av_url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &rtp_port, path, sizeof(path), uri); /* extract parameters */ @@ -190,7 +183,7 @@ static int rtp_open(URLContext *h, const char *uri, int flags) build_udp_url(buf, sizeof(buf), hostname, rtp_port, local_rtp_port, ttl, max_packet_size, connect); - if (ffurl_open(&s->rtp_hd, buf, flags) < 0) + if (ffurl_open(&s->rtp_hd, buf, flags, &h->interrupt_callback, NULL) < 0) goto fail; if (local_rtp_port>=0 && local_rtcp_port<0) local_rtcp_port = ff_udp_get_local_port(s->rtp_hd) + 1; @@ -198,15 +191,15 @@ static int rtp_open(URLContext *h, const char *uri, int flags) build_udp_url(buf, sizeof(buf), hostname, rtcp_port, local_rtcp_port, ttl, max_packet_size, connect); - if (ffurl_open(&s->rtcp_hd, buf, flags) < 0) + if (ffurl_open(&s->rtcp_hd, buf, flags, &h->interrupt_callback, NULL) < 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; @@ -215,7 +208,6 @@ static int rtp_open(URLContext *h, const char *uri, int flags) ffurl_close(s->rtp_hd); if (s->rtcp_hd) ffurl_close(s->rtcp_hd); - av_free(s); return AVERROR(EIO); } @@ -227,22 +219,8 @@ static int rtp_read(URLContext *h, uint8_t *buf, int size) 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() == AVERROR(EAGAIN) || - ff_neterrno() == AVERROR(EINTR)) - continue; - return AVERROR(EIO); - } - break; - } -#else - for(;;) { - if (url_interrupt_cb()) + if (ff_check_interrupt(&h->interrupt_callback)) return AVERROR_EXIT; /* build fdset to listen to RTP and RTCP packets */ n = poll(p, 2, 100); @@ -279,7 +257,6 @@ static int rtp_read(URLContext *h, uint8_t *buf, int size) return AVERROR(EIO); } } -#endif return len; } @@ -289,7 +266,7 @@ static int rtp_write(URLContext *h, const uint8_t *buf, int size) int ret; URLContext *hd; - if (buf[1] >= RTCP_SR && buf[1] <= RTCP_APP) { + if (RTP_PT_IS_RTCP(buf[1])) { /* RTCP payload type */ hd = s->rtcp_hd; } else { @@ -298,14 +275,6 @@ static int rtp_write(URLContext *h, const uint8_t *buf, int size) } ret = ffurl_write(hd, buf, size); -#if 0 - { - struct timespec ts; - ts.tv_sec = 0; - ts.tv_nsec = 10 * 1000000; - nanosleep(&ts, NULL); - } -#endif return ret; } @@ -315,7 +284,6 @@ static int rtp_close(URLContext *h) ffurl_close(s->rtp_hd); ffurl_close(s->rtcp_hd); - av_free(s); return 0; } @@ -325,7 +293,7 @@ static int rtp_close(URLContext *h) * @return the local port number */ -int rtp_get_local_rtp_port(URLContext *h) +int ff_rtp_get_local_rtp_port(URLContext *h) { RTPContext *s = h->priv_data; return ff_udp_get_local_port(s->rtp_hd); @@ -337,7 +305,7 @@ int rtp_get_local_rtp_port(URLContext *h) * @return the local port number */ -int rtp_get_local_rtcp_port(URLContext *h) +int ff_rtp_get_local_rtcp_port(URLContext *h) { RTPContext *s = h->priv_data; return ff_udp_get_local_port(s->rtcp_hd); @@ -349,17 +317,18 @@ static int rtp_get_file_handle(URLContext *h) return s->rtp_fd; } -int rtp_get_rtcp_file_handle(URLContext *h) { +int ff_rtp_get_rtcp_file_handle(URLContext *h) { RTPContext *s = h->priv_data; return s->rtcp_fd; } URLProtocol ff_rtp_protocol = { - "rtp", - rtp_open, - rtp_read, - rtp_write, - NULL, /* seek */ - rtp_close, + .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, + .priv_data_size = sizeof(RTPContext), + .flags = URL_PROTOCOL_FLAG_NETWORK, };