summaryrefslogtreecommitdiffstats
path: root/libavformat
diff options
context:
space:
mode:
authorlemonlinger@gmail.com <lemonlinger@gmail.com>2013-10-20 16:53:09 +0800
committerMichael Niedermayer <michaelni@gmx.at>2013-10-25 22:40:21 +0200
commit2cf94485de9aa0e8f4552fd9477e0d4bc5cb84bc (patch)
tree0692fd4ce86e9efa0ddc593727e48a660141e4ac /libavformat
parent08a89761964bdd0a023eff6d37a1131fb7e1d7a0 (diff)
downloadffmpeg-streaming-2cf94485de9aa0e8f4552fd9477e0d4bc5cb84bc.zip
ffmpeg-streaming-2cf94485de9aa0e8f4552fd9477e0d4bc5cb84bc.tar.gz
avformat/rtpproto: when local rtp port and local rtcp port are not specified, try to make two successive ports and retry 3 times when failed
some video players on Android will not send udp hole punching messages if the rtcp port and rtp port are not two successive integers. So, if the video player is behind NAT, it could not receive and rtp messages via udp Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/rtpproto.c43
1 files changed, 30 insertions, 13 deletions
diff --git a/libavformat/rtpproto.c b/libavformat/rtpproto.c
index bf9c60d..a8cbd97 100644
--- a/libavformat/rtpproto.c
+++ b/libavformat/rtpproto.c
@@ -281,6 +281,7 @@ static int rtp_open(URLContext *h, const char *uri, int flags)
char buf[1024];
char path[1024];
const char *p;
+ int i, max_retry_count = 3;
av_url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &rtp_port,
path, sizeof(path), uri);
@@ -328,19 +329,35 @@ 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, include_sources, exclude_sources);
- 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;
-
- build_udp_url(buf, sizeof(buf),
- hostname, rtcp_port, local_rtcp_port, ttl, max_packet_size,
- connect, include_sources, exclude_sources);
- if (ffurl_open(&s->rtcp_hd, buf, flags, &h->interrupt_callback, NULL) < 0)
- goto fail;
+ for (i = 0;i < max_retry_count;i++) {
+ build_udp_url(buf, sizeof(buf),
+ hostname, rtp_port, local_rtp_port, ttl, max_packet_size,
+ connect, include_sources, exclude_sources);
+ if (ffurl_open(&s->rtp_hd, buf, flags, &h->interrupt_callback, NULL) < 0)
+ goto fail;
+ local_rtp_port = ff_udp_get_local_port(s->rtp_hd);
+ if(local_rtp_port == 65535) {
+ local_rtp_port = -1;
+ continue;
+ }
+ if (local_rtcp_port<0) {
+ local_rtcp_port = local_rtp_port + 1;
+ build_udp_url(buf, sizeof(buf),
+ hostname, rtcp_port, local_rtcp_port, ttl, max_packet_size,
+ connect, include_sources, exclude_sources);
+ if (ffurl_open(&s->rtcp_hd, buf, flags, &h->interrupt_callback, NULL) < 0) {
+ local_rtp_port = local_rtcp_port = -1;
+ continue;
+ }
+ break;
+ }
+ build_udp_url(buf, sizeof(buf),
+ hostname, rtcp_port, local_rtcp_port, ttl, max_packet_size,
+ connect, include_sources, exclude_sources);
+ if (ffurl_open(&s->rtcp_hd, buf, flags, &h->interrupt_callback, NULL) < 0)
+ goto fail;
+ break;
+ }
/* just to ease handle access. XXX: need to suppress direct handle
access */
OpenPOWER on IntegriCloud