ffmpeg | branch: master | Zhao Zhili <wantl...@gmail.com> | Thu Jan  7 18:55:50 
2016 +0800| [6f5048f4a0f702d92794dda7752c20ed6033233b] | committer: Michael 
Niedermayer

rtp: Fix play multiple multicast streams with the same port

We cannot play multiple multicast streams with the same port at the
same time. This is because both rtp and rtcp port are opened in
read-write mode, so they will not bind to the multicast address. Try
to make rtp port as read-only by default to solve this bug.

Signed-off-by: Zhao Zhili <wantl...@gmail.com>
Signed-off-by: Michael Niedermayer <mich...@niedermayer.cc>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=6f5048f4a0f702d92794dda7752c20ed6033233b
---

 libavformat/rtpproto.c |    6 ++++--
 libavformat/rtsp.c     |    2 +-
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/libavformat/rtpproto.c b/libavformat/rtpproto.c
index 451d811..2062083 100644
--- a/libavformat/rtpproto.c
+++ b/libavformat/rtpproto.c
@@ -323,6 +323,7 @@ static int rtp_open(URLContext *h, const char *uri, int 
flags)
     char path[1024];
     const char *p;
     int i, max_retry_count = 3;
+    int rtcpflags;
 
     av_url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &rtp_port,
                  path, sizeof(path), uri);
@@ -388,12 +389,13 @@ static int rtp_open(URLContext *h, const char *uri, int 
flags)
             s->local_rtpport = -1;
             continue;
         }
+        rtcpflags = flags | AVIO_FLAG_WRITE;
         if (s->local_rtcpport < 0) {
             s->local_rtcpport = s->local_rtpport + 1;
             build_udp_url(s, buf, sizeof(buf),
                           hostname, s->rtcp_port, s->local_rtcpport,
                           sources, block);
-            if (ffurl_open_whitelist(&s->rtcp_hd, buf, flags,
+            if (ffurl_open_whitelist(&s->rtcp_hd, buf, rtcpflags,
                                      &h->interrupt_callback, NULL,
                                      h->protocol_whitelist, 
h->protocol_blacklist) < 0) {
                 s->local_rtpport = s->local_rtcpport = -1;
@@ -404,7 +406,7 @@ static int rtp_open(URLContext *h, const char *uri, int 
flags)
         build_udp_url(s, buf, sizeof(buf),
                       hostname, s->rtcp_port, s->local_rtcpport,
                       sources, block);
-        if (ffurl_open_whitelist(&s->rtcp_hd, buf, flags, 
&h->interrupt_callback,
+        if (ffurl_open_whitelist(&s->rtcp_hd, buf, rtcpflags, 
&h->interrupt_callback,
                                  NULL, h->protocol_whitelist, 
h->protocol_blacklist) < 0)
             goto fail;
         break;
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index 64f8c91..485e356 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -2316,7 +2316,7 @@ static int sdp_read_header(AVFormatContext *s)
             append_source_addrs(url, sizeof(url), "block",
                                 rtsp_st->nb_exclude_source_addrs,
                                 rtsp_st->exclude_source_addrs);
-            err = ffurl_open_whitelist(&rtsp_st->rtp_handle, url, 
AVIO_FLAG_READ_WRITE,
+            err = ffurl_open_whitelist(&rtsp_st->rtp_handle, url, 
AVIO_FLAG_READ,
                            &s->interrupt_callback, &opts, 
s->protocol_whitelist, s->protocol_blacklist);
 
             av_dict_free(&opts);

_______________________________________________
ffmpeg-cvslog mailing list
ffmpeg-cvslog@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog

Reply via email to