summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2012-03-08 15:17:15 +0200
committerMartin Storsjö <martin@martin.st>2012-03-09 15:03:46 +0200
commitc700fdb00f28a65c42b37c43d82a29733f1cc20e (patch)
tree63456ff6e249457ca89e3907f76df5ad2aed9cbd
parent1b89bcdd7f12602d8ae9cadc8486f7b0d70e9704 (diff)
udp: Only bind to the multicast address if in read-only mode
This fixes sending back RTCP RR packets if receiving RTP over multicast. If the multicast stream is sent on demand (set up and signalled via RTSP), the sender might depend on getting RTCP RR packets knowing that there are listeners, otherwise the stream can be closed after a certain timeout. This fixes receiving RTSP streams over multicast on unix, from certain Axis cameras. Signed-off-by: Martin Storsjö <martin@martin.st>
-rw-r--r--libavformat/udp.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/libavformat/udp.c b/libavformat/udp.c
index e91b95cde4..3c63f516a2 100644
--- a/libavformat/udp.c
+++ b/libavformat/udp.c
@@ -382,8 +382,9 @@ static int udp_open(URLContext *h, const char *uri, int flags)
/* If multicast, try binding the multicast address first, to avoid
* receiving UDP packets from other sources aimed at the same UDP
- * port. This fails on windows. */
- if (s->is_multicast && (h->flags & AVIO_FLAG_READ)) {
+ * port. This fails on windows. This makes sending to the same address
+ * using sendto() fail, so only do it if we're opened in read-only mode. */
+ if (s->is_multicast && !(h->flags & AVIO_FLAG_WRITE)) {
bind_ret = bind(udp_fd,(struct sockaddr *)&s->dest_addr, len);
}
/* bind to the local address if not multicast or if the multicast