annotate udp.c @ 6455:3f50c7effad1 libavformat

rtsp: 10l, try to update the correct rtp stream This fixes a bug from rev 22917. Now RTSP streams where the individual RTCP sender reports aren't sent at the same time actually are synced properly.
author mstorsjo
date Fri, 03 Sep 2010 07:10:21 +0000
parents 9bd0ce3f9b64
children 1e6ebac87d44
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1 /*
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2 * UDP prototype streaming system
4251
77e0c7511d41 cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 4206
diff changeset
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
4 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1332
diff changeset
5 * This file is part of FFmpeg.
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1332
diff changeset
6 *
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1332
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1332
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
11 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1332
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
15 * Lesser General Public License for more details.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
16 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1332
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
896
edbe5c3717f9 Update licensing information: The FSF changed postal address.
diego
parents: 885
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
20 */
3231
956fc24819df doxy header for udp protocol
lu_zero
parents: 3221
diff changeset
21
956fc24819df doxy header for udp protocol
lu_zero
parents: 3221
diff changeset
22 /**
5969
178de7695c6c Remove explicit filename from Doxygen @file commands.
diego
parents: 5896
diff changeset
23 * @file
3231
956fc24819df doxy header for udp protocol
lu_zero
parents: 3221
diff changeset
24 * UDP protocol
956fc24819df doxy header for udp protocol
lu_zero
parents: 3221
diff changeset
25 */
956fc24819df doxy header for udp protocol
lu_zero
parents: 3221
diff changeset
26
3776
8329c0373f69 Fix udp.c compilation with recent glibc (>= 2.8)
lucabe
parents: 3753
diff changeset
27 #define _BSD_SOURCE /* Needed for using struct ip_mreq with recent glibc */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
28 #include "avformat.h"
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
29 #include <unistd.h>
5837
d605f589f0be move ff_url_split() and ff_url_join() declarations to internal.h
aurel
parents: 5775
diff changeset
30 #include "internal.h"
1754
1f7a6dc01100 move networking #includes into separate file
mru
parents: 1672
diff changeset
31 #include "network.h"
2773
13b65f62e3a6 Include os_support.h only when needed
lucabe
parents: 2768
diff changeset
32 #include "os_support.h"
4206
c3102b189cb6 Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 4083
diff changeset
33 #if HAVE_SYS_SELECT_H
4024
459dd8d5ad86 check for interrupt when receiving from socket
henry
parents: 4021
diff changeset
34 #include <sys/select.h>
459dd8d5ad86 check for interrupt when receiving from socket
henry
parents: 4021
diff changeset
35 #endif
4083
2de14ee7b25f Add sys/time.h header #include, fixes compilation on OS/2.
diego
parents: 4070
diff changeset
36 #include <sys/time.h>
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
37
834
2ad855f5a156 FreeBSD ipv6 multicast patch from ports tree
alex
parents: 825
diff changeset
38 #ifndef IPV6_ADD_MEMBERSHIP
2ad855f5a156 FreeBSD ipv6 multicast patch from ports tree
alex
parents: 825
diff changeset
39 #define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
2ad855f5a156 FreeBSD ipv6 multicast patch from ports tree
alex
parents: 825
diff changeset
40 #define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP
2ad855f5a156 FreeBSD ipv6 multicast patch from ports tree
alex
parents: 825
diff changeset
41 #endif
3221
e17b25e8a34e Remove the "multicast=" tag from UDP and RTP URLs
lucabe
parents: 3025
diff changeset
42 #ifndef IN_MULTICAST
e17b25e8a34e Remove the "multicast=" tag from UDP and RTP URLs
lucabe
parents: 3025
diff changeset
43 #define IN_MULTICAST(a) ((((uint32_t)(a)) & 0xf0000000) == 0xe0000000)
e17b25e8a34e Remove the "multicast=" tag from UDP and RTP URLs
lucabe
parents: 3025
diff changeset
44 #endif
e17b25e8a34e Remove the "multicast=" tag from UDP and RTP URLs
lucabe
parents: 3025
diff changeset
45 #ifndef IN6_IS_ADDR_MULTICAST
e17b25e8a34e Remove the "multicast=" tag from UDP and RTP URLs
lucabe
parents: 3025
diff changeset
46 #define IN6_IS_ADDR_MULTICAST(a) (((uint8_t *) (a))[0] == 0xff)
e17b25e8a34e Remove the "multicast=" tag from UDP and RTP URLs
lucabe
parents: 3025
diff changeset
47 #endif
834
2ad855f5a156 FreeBSD ipv6 multicast patch from ports tree
alex
parents: 825
diff changeset
48
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
49 typedef struct {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
50 int udp_fd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
51 int ttl;
4021
6390b29b59f2 Allow the UDP socket buffer size to be adjusted using a
andoma
parents: 3776
diff changeset
52 int buffer_size;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
53 int is_multicast;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
54 int local_port;
1428
7316227e64eb Make it possible to reuse UDP socket (optional, disabled by default)
gpoirier
parents: 1358
diff changeset
55 int reuse_socket;
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
56 struct sockaddr_storage dest_addr;
3287
8570df039c75 Fix type of dest_addr_len to respect return value of udp_set_url.
cehoyos
parents: 3231
diff changeset
57 int dest_addr_len;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
58 } UDPContext;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
59
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
60 #define UDP_TX_BUF_SIZE 32768
2391
2298213e3016 Set UDP receive buffer to 64k
ramiro
parents: 2351
diff changeset
61 #define UDP_MAX_PKT_SIZE 65536
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
62
5576
1a89eae96a27 Make style a little bit more K&R'ish.
rbultje
parents: 5575
diff changeset
63 static int udp_set_multicast_ttl(int sockfd, int mcastTTL,
1a89eae96a27 Make style a little bit more K&R'ish.
rbultje
parents: 5575
diff changeset
64 struct sockaddr *addr)
1a89eae96a27 Make style a little bit more K&R'ish.
rbultje
parents: 5575
diff changeset
65 {
2739
091af9f47edf Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents: 2738
diff changeset
66 #ifdef IP_MULTICAST_TTL
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
67 if (addr->sa_family == AF_INET) {
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
68 if (setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, &mcastTTL, sizeof(mcastTTL)) < 0) {
2768
20156cdb5f84 Remove perror() usage from udp.c
lucabe
parents: 2752
diff changeset
69 av_log(NULL, AV_LOG_ERROR, "setsockopt(IP_MULTICAST_TTL): %s\n", strerror(errno));
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
70 return -1;
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
71 }
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
72 }
2739
091af9f47edf Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents: 2738
diff changeset
73 #endif
5567
9934ca658946 Remove IPv4-only codepath. Patch by Martin Storsj <$first $first st>.
rbultje
parents: 4640
diff changeset
74 #if defined(IPPROTO_IPV6) && defined(IPV6_MULTICAST_HOPS)
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
75 if (addr->sa_family == AF_INET6) {
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
76 if (setsockopt(sockfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &mcastTTL, sizeof(mcastTTL)) < 0) {
2768
20156cdb5f84 Remove perror() usage from udp.c
lucabe
parents: 2752
diff changeset
77 av_log(NULL, AV_LOG_ERROR, "setsockopt(IPV6_MULTICAST_HOPS): %s\n", strerror(errno));
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
78 return -1;
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
79 }
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
80 }
2739
091af9f47edf Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents: 2738
diff changeset
81 #endif
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
82 return 0;
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
83 }
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
84
5576
1a89eae96a27 Make style a little bit more K&R'ish.
rbultje
parents: 5575
diff changeset
85 static int udp_join_multicast_group(int sockfd, struct sockaddr *addr)
1a89eae96a27 Make style a little bit more K&R'ish.
rbultje
parents: 5575
diff changeset
86 {
2739
091af9f47edf Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents: 2738
diff changeset
87 #ifdef IP_ADD_MEMBERSHIP
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
88 if (addr->sa_family == AF_INET) {
2739
091af9f47edf Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents: 2738
diff changeset
89 struct ip_mreq mreq;
091af9f47edf Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents: 2738
diff changeset
90
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
91 mreq.imr_multiaddr.s_addr = ((struct sockaddr_in *)addr)->sin_addr.s_addr;
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
92 mreq.imr_interface.s_addr= INADDR_ANY;
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
93 if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const void *)&mreq, sizeof(mreq)) < 0) {
2768
20156cdb5f84 Remove perror() usage from udp.c
lucabe
parents: 2752
diff changeset
94 av_log(NULL, AV_LOG_ERROR, "setsockopt(IP_ADD_MEMBERSHIP): %s\n", strerror(errno));
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
95 return -1;
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
96 }
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
97 }
2739
091af9f47edf Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents: 2738
diff changeset
98 #endif
5567
9934ca658946 Remove IPv4-only codepath. Patch by Martin Storsj <$first $first st>.
rbultje
parents: 4640
diff changeset
99 #if HAVE_STRUCT_IPV6_MREQ
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
100 if (addr->sa_family == AF_INET6) {
2739
091af9f47edf Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents: 2738
diff changeset
101 struct ipv6_mreq mreq6;
091af9f47edf Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents: 2738
diff changeset
102
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
103 memcpy(&mreq6.ipv6mr_multiaddr, &(((struct sockaddr_in6 *)addr)->sin6_addr), sizeof(struct in6_addr));
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
104 mreq6.ipv6mr_interface= 0;
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
105 if (setsockopt(sockfd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, &mreq6, sizeof(mreq6)) < 0) {
2768
20156cdb5f84 Remove perror() usage from udp.c
lucabe
parents: 2752
diff changeset
106 av_log(NULL, AV_LOG_ERROR, "setsockopt(IPV6_ADD_MEMBERSHIP): %s\n", strerror(errno));
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
107 return -1;
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
108 }
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
109 }
2739
091af9f47edf Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents: 2738
diff changeset
110 #endif
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
111 return 0;
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
112 }
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
113
5576
1a89eae96a27 Make style a little bit more K&R'ish.
rbultje
parents: 5575
diff changeset
114 static int udp_leave_multicast_group(int sockfd, struct sockaddr *addr)
1a89eae96a27 Make style a little bit more K&R'ish.
rbultje
parents: 5575
diff changeset
115 {
2739
091af9f47edf Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents: 2738
diff changeset
116 #ifdef IP_DROP_MEMBERSHIP
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
117 if (addr->sa_family == AF_INET) {
2739
091af9f47edf Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents: 2738
diff changeset
118 struct ip_mreq mreq;
091af9f47edf Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents: 2738
diff changeset
119
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
120 mreq.imr_multiaddr.s_addr = ((struct sockaddr_in *)addr)->sin_addr.s_addr;
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
121 mreq.imr_interface.s_addr= INADDR_ANY;
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
122 if (setsockopt(sockfd, IPPROTO_IP, IP_DROP_MEMBERSHIP, (const void *)&mreq, sizeof(mreq)) < 0) {
2768
20156cdb5f84 Remove perror() usage from udp.c
lucabe
parents: 2752
diff changeset
123 av_log(NULL, AV_LOG_ERROR, "setsockopt(IP_DROP_MEMBERSHIP): %s\n", strerror(errno));
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
124 return -1;
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
125 }
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
126 }
2739
091af9f47edf Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents: 2738
diff changeset
127 #endif
5567
9934ca658946 Remove IPv4-only codepath. Patch by Martin Storsj <$first $first st>.
rbultje
parents: 4640
diff changeset
128 #if HAVE_STRUCT_IPV6_MREQ
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
129 if (addr->sa_family == AF_INET6) {
2739
091af9f47edf Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents: 2738
diff changeset
130 struct ipv6_mreq mreq6;
091af9f47edf Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents: 2738
diff changeset
131
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
132 memcpy(&mreq6.ipv6mr_multiaddr, &(((struct sockaddr_in6 *)addr)->sin6_addr), sizeof(struct in6_addr));
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
133 mreq6.ipv6mr_interface= 0;
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
134 if (setsockopt(sockfd, IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, &mreq6, sizeof(mreq6)) < 0) {
2768
20156cdb5f84 Remove perror() usage from udp.c
lucabe
parents: 2752
diff changeset
135 av_log(NULL, AV_LOG_ERROR, "setsockopt(IPV6_DROP_MEMBERSHIP): %s\n", strerror(errno));
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
136 return -1;
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
137 }
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
138 }
2739
091af9f47edf Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents: 2738
diff changeset
139 #endif
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
140 return 0;
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
141 }
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
142
5576
1a89eae96a27 Make style a little bit more K&R'ish.
rbultje
parents: 5575
diff changeset
143 static struct addrinfo* udp_resolve_host(const char *hostname, int port,
1a89eae96a27 Make style a little bit more K&R'ish.
rbultje
parents: 5575
diff changeset
144 int type, int family, int flags)
1a89eae96a27 Make style a little bit more K&R'ish.
rbultje
parents: 5575
diff changeset
145 {
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
146 struct addrinfo hints, *res = 0;
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
147 int error;
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
148 char sport[16];
2687
f4d24b10d33d Resolve hosts and bind sockets even when the local_port is not set (0)
lucabe
parents: 2391
diff changeset
149 const char *node = 0, *service = "0";
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
150
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
151 if (port > 0) {
644
1bbcf7b444ae dissallow sprintf
michael
parents: 579
diff changeset
152 snprintf(sport, sizeof(sport), "%d", port);
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
153 service = sport;
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
154 }
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
155 if ((hostname) && (hostname[0] != '\0') && (hostname[0] != '?')) {
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
156 node = hostname;
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
157 }
2688
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
158 memset(&hints, 0, sizeof(hints));
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
159 hints.ai_socktype = type;
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
160 hints.ai_family = family;
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
161 hints.ai_flags = flags;
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
162 if ((error = getaddrinfo(node, service, &hints, &res))) {
5731
c5a662ed3ab5 Explicitly set struct addrinfo to NULL if getaddrinfo failed instead of
reimar
parents: 5576
diff changeset
163 res = NULL;
5575
d40a7e8259ff Rename a function which is no longer ipv6-specific. Patch by Martin Storsj
rbultje
parents: 5567
diff changeset
164 av_log(NULL, AV_LOG_ERROR, "udp_resolve_host: %s\n", gai_strerror(error));
2688
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
165 }
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
166
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
167 return res;
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
168 }
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
169
5576
1a89eae96a27 Make style a little bit more K&R'ish.
rbultje
parents: 5575
diff changeset
170 static int udp_set_url(struct sockaddr_storage *addr,
1a89eae96a27 Make style a little bit more K&R'ish.
rbultje
parents: 5575
diff changeset
171 const char *hostname, int port)
1a89eae96a27 Make style a little bit more K&R'ish.
rbultje
parents: 5575
diff changeset
172 {
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
173 struct addrinfo *res0;
2743
a847a9eda9b2 Simplify set_remote_url(), and remove some code duplication
lucabe
parents: 2742
diff changeset
174 int addr_len;
a847a9eda9b2 Simplify set_remote_url(), and remove some code duplication
lucabe
parents: 2742
diff changeset
175
5575
d40a7e8259ff Rename a function which is no longer ipv6-specific. Patch by Martin Storsj
rbultje
parents: 5567
diff changeset
176 res0 = udp_resolve_host(hostname, port, SOCK_DGRAM, AF_UNSPEC, 0);
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2162
diff changeset
177 if (res0 == 0) return AVERROR(EIO);
2743
a847a9eda9b2 Simplify set_remote_url(), and remove some code duplication
lucabe
parents: 2742
diff changeset
178 memcpy(addr, res0->ai_addr, res0->ai_addrlen);
a847a9eda9b2 Simplify set_remote_url(), and remove some code duplication
lucabe
parents: 2742
diff changeset
179 addr_len = res0->ai_addrlen;
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
180 freeaddrinfo(res0);
2743
a847a9eda9b2 Simplify set_remote_url(), and remove some code duplication
lucabe
parents: 2742
diff changeset
181
a847a9eda9b2 Simplify set_remote_url(), and remove some code duplication
lucabe
parents: 2742
diff changeset
182 return addr_len;
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
183 }
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
184
3221
e17b25e8a34e Remove the "multicast=" tag from UDP and RTP URLs
lucabe
parents: 3025
diff changeset
185 static int is_multicast_address(struct sockaddr_storage *addr)
e17b25e8a34e Remove the "multicast=" tag from UDP and RTP URLs
lucabe
parents: 3025
diff changeset
186 {
e17b25e8a34e Remove the "multicast=" tag from UDP and RTP URLs
lucabe
parents: 3025
diff changeset
187 if (addr->ss_family == AF_INET) {
e17b25e8a34e Remove the "multicast=" tag from UDP and RTP URLs
lucabe
parents: 3025
diff changeset
188 return IN_MULTICAST(ntohl(((struct sockaddr_in *)addr)->sin_addr.s_addr));
e17b25e8a34e Remove the "multicast=" tag from UDP and RTP URLs
lucabe
parents: 3025
diff changeset
189 }
5567
9934ca658946 Remove IPv4-only codepath. Patch by Martin Storsj <$first $first st>.
rbultje
parents: 4640
diff changeset
190 #if HAVE_STRUCT_SOCKADDR_IN6
3221
e17b25e8a34e Remove the "multicast=" tag from UDP and RTP URLs
lucabe
parents: 3025
diff changeset
191 if (addr->ss_family == AF_INET6) {
e17b25e8a34e Remove the "multicast=" tag from UDP and RTP URLs
lucabe
parents: 3025
diff changeset
192 return IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6 *)addr)->sin6_addr);
e17b25e8a34e Remove the "multicast=" tag from UDP and RTP URLs
lucabe
parents: 3025
diff changeset
193 }
5567
9934ca658946 Remove IPv4-only codepath. Patch by Martin Storsj <$first $first st>.
rbultje
parents: 4640
diff changeset
194 #endif
3221
e17b25e8a34e Remove the "multicast=" tag from UDP and RTP URLs
lucabe
parents: 3025
diff changeset
195
e17b25e8a34e Remove the "multicast=" tag from UDP and RTP URLs
lucabe
parents: 3025
diff changeset
196 return 0;
e17b25e8a34e Remove the "multicast=" tag from UDP and RTP URLs
lucabe
parents: 3025
diff changeset
197 }
e17b25e8a34e Remove the "multicast=" tag from UDP and RTP URLs
lucabe
parents: 3025
diff changeset
198
5576
1a89eae96a27 Make style a little bit more K&R'ish.
rbultje
parents: 5575
diff changeset
199 static int udp_socket_create(UDPContext *s,
1a89eae96a27 Make style a little bit more K&R'ish.
rbultje
parents: 5575
diff changeset
200 struct sockaddr_storage *addr, int *addr_len)
2752
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
201 {
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
202 int udp_fd = -1;
825
c8d4a65729c5 udp ipv6 localhost resolving patch by ("Hans Zandbelt": Hans Zandbelt, telin nl)
michael
parents: 815
diff changeset
203 struct addrinfo *res0 = NULL, *res = NULL;
2689
7d25b8de708d Take the target address family in account when determining the family of
lucabe
parents: 2688
diff changeset
204 int family = AF_UNSPEC;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 834
diff changeset
205
2689
7d25b8de708d Take the target address family in account when determining the family of
lucabe
parents: 2688
diff changeset
206 if (((struct sockaddr *) &s->dest_addr)->sa_family)
7d25b8de708d Take the target address family in account when determining the family of
lucabe
parents: 2688
diff changeset
207 family = ((struct sockaddr *) &s->dest_addr)->sa_family;
5575
d40a7e8259ff Rename a function which is no longer ipv6-specific. Patch by Martin Storsj
rbultje
parents: 5567
diff changeset
208 res0 = udp_resolve_host(0, s->local_port, SOCK_DGRAM, family, AI_PASSIVE);
2688
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
209 if (res0 == 0)
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
210 goto fail;
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
211 for (res = res0; res; res=res->ai_next) {
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
212 udp_fd = socket(res->ai_family, SOCK_DGRAM, 0);
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
213 if (udp_fd > 0) break;
2768
20156cdb5f84 Remove perror() usage from udp.c
lucabe
parents: 2752
diff changeset
214 av_log(NULL, AV_LOG_ERROR, "socket: %s\n", strerror(errno));
2688
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
215 }
825
c8d4a65729c5 udp ipv6 localhost resolving patch by ("Hans Zandbelt": Hans Zandbelt, telin nl)
michael
parents: 815
diff changeset
216
c8d4a65729c5 udp ipv6 localhost resolving patch by ("Hans Zandbelt": Hans Zandbelt, telin nl)
michael
parents: 815
diff changeset
217 if (udp_fd < 0)
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
218 goto fail;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 834
diff changeset
219
2752
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
220 memcpy(addr, res->ai_addr, res->ai_addrlen);
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
221 *addr_len = res->ai_addrlen;
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
222
2752
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
223 freeaddrinfo(res0);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 834
diff changeset
224
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
225 return udp_fd;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 834
diff changeset
226
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
227 fail:
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
228 if (udp_fd >= 0)
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
229 closesocket(udp_fd);
683
095009fc2f35 kill warnings patch by (Mns Rullgrd <mru inprovide com>)
michael
parents: 644
diff changeset
230 if(res0)
095009fc2f35 kill warnings patch by (Mns Rullgrd <mru inprovide com>)
michael
parents: 644
diff changeset
231 freeaddrinfo(res0);
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
232 return -1;
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
233 }
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
234
2752
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
235 static int udp_port(struct sockaddr_storage *addr, int addr_len)
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
236 {
3025
41d68d056417 Do not use GNU-specific (or BSD-specific or whatever they may be)
rfelker
parents: 2773
diff changeset
237 char sbuf[sizeof(int)*3+1];
2752
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
238
3025
41d68d056417 Do not use GNU-specific (or BSD-specific or whatever they may be)
rfelker
parents: 2773
diff changeset
239 if (getnameinfo((struct sockaddr *)addr, addr_len, NULL, 0, sbuf, sizeof(sbuf), NI_NUMERICSERV) != 0) {
2768
20156cdb5f84 Remove perror() usage from udp.c
lucabe
parents: 2752
diff changeset
240 av_log(NULL, AV_LOG_ERROR, "getnameinfo: %s\n", strerror(errno));
2752
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
241 return -1;
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
242 }
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
243
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
244 return strtol(sbuf, NULL, 10);
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
245 }
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
246
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
247
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
248 /**
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
249 * If no filename is given to av_open_input_file because you want to
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
250 * get the local port first, then you must call this function to set
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
251 * the remote server address.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
252 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
253 * url syntax: udp://host:port[?option=val...]
3221
e17b25e8a34e Remove the "multicast=" tag from UDP and RTP URLs
lucabe
parents: 3025
diff changeset
254 * option: 'ttl=n' : set the ttl value (for multicast only)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
255 * 'localport=n' : set the local port
62
56a6676125b4 variable UDP packet size patch by Max Krasnyansky
bellard
parents: 0
diff changeset
256 * 'pkt_size=n' : set max packet size
1428
7316227e64eb Make it possible to reuse UDP socket (optional, disabled by default)
gpoirier
parents: 1358
diff changeset
257 * 'reuse=1' : enable reusing the socket
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
258 *
6215
ccb05424c391 Fix misspelled parameter names in Doxygen documentation.
diego
parents: 6182
diff changeset
259 * @param h media file context
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
260 * @param uri of the remote server
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
261 * @return zero if no error.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
262 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
263 int udp_set_remote_url(URLContext *h, const char *uri)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
264 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
265 UDPContext *s = h->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
266 char hostname[256];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
267 int port;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 834
diff changeset
268
6182
4fc5e0e4e1cd Make ff_url_split() public
mru
parents: 6131
diff changeset
269 av_url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &port, NULL, 0, uri);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
270
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
271 /* set the destination address */
2743
a847a9eda9b2 Simplify set_remote_url(), and remove some code duplication
lucabe
parents: 2742
diff changeset
272 s->dest_addr_len = udp_set_url(&s->dest_addr, hostname, port);
a847a9eda9b2 Simplify set_remote_url(), and remove some code duplication
lucabe
parents: 2742
diff changeset
273 if (s->dest_addr_len < 0) {
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2162
diff changeset
274 return AVERROR(EIO);
2743
a847a9eda9b2 Simplify set_remote_url(), and remove some code duplication
lucabe
parents: 2742
diff changeset
275 }
3221
e17b25e8a34e Remove the "multicast=" tag from UDP and RTP URLs
lucabe
parents: 3025
diff changeset
276 s->is_multicast = is_multicast_address(&s->dest_addr);
2743
a847a9eda9b2 Simplify set_remote_url(), and remove some code duplication
lucabe
parents: 2742
diff changeset
277
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
278 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
279 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
280
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
281 /**
6131
68fba42e1dea Cosmetics: Change connexion to connection in code comments
mstorsjo
parents: 6068
diff changeset
282 * Return the local port used by the UDP connection
6215
ccb05424c391 Fix misspelled parameter names in Doxygen documentation.
diego
parents: 6182
diff changeset
283 * @param h media file context
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
284 * @return the local port number
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
285 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
286 int udp_get_local_port(URLContext *h)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
287 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
288 UDPContext *s = h->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
289 return s->local_port;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
290 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
291
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
292 /**
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
293 * Return the udp file handle for select() usage to wait for several RTP
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
294 * streams at the same time.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
295 * @param h media file context
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
296 */
4640
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4331
diff changeset
297 #if (LIBAVFORMAT_VERSION_MAJOR >= 53)
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4331
diff changeset
298 static
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4331
diff changeset
299 #endif
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
300 int udp_get_file_handle(URLContext *h)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
301 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
302 UDPContext *s = h->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
303 return s->udp_fd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
304 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
305
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
306 /* put it in UDP context */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
307 /* return non zero if error */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
308 static int udp_open(URLContext *h, const char *uri, int flags)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
309 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
310 char hostname[1024];
4070
7f9fb963926c bind to the multicast address if possible
henry
parents: 4035
diff changeset
311 int port, udp_fd = -1, tmp, bind_ret = -1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
312 UDPContext *s = NULL;
683
095009fc2f35 kill warnings patch by (Mns Rullgrd <mru inprovide com>)
michael
parents: 644
diff changeset
313 int is_output;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
314 const char *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
315 char buf[256];
2752
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
316 struct sockaddr_storage my_addr;
683
095009fc2f35 kill warnings patch by (Mns Rullgrd <mru inprovide com>)
michael
parents: 644
diff changeset
317 int len;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
318
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
319 h->is_streamed = 1;
62
56a6676125b4 variable UDP packet size patch by Max Krasnyansky
bellard
parents: 0
diff changeset
320 h->max_packet_size = 1472;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
321
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
322 is_output = (flags & URL_WRONLY);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 834
diff changeset
323
2689
7d25b8de708d Take the target address family in account when determining the family of
lucabe
parents: 2688
diff changeset
324 s = av_mallocz(sizeof(UDPContext));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
325 if (!s)
1787
eb16c64144ee This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents: 1754
diff changeset
326 return AVERROR(ENOMEM);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
327
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
328 h->priv_data = s;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
329 s->ttl = 16;
4021
6390b29b59f2 Allow the UDP socket buffer size to be adjusted using a
andoma
parents: 3776
diff changeset
330 s->buffer_size = is_output ? UDP_TX_BUF_SIZE : UDP_MAX_PKT_SIZE;
6390b29b59f2 Allow the UDP socket buffer size to be adjusted using a
andoma
parents: 3776
diff changeset
331
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
332 p = strchr(uri, '?');
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
333 if (p) {
1428
7316227e64eb Make it possible to reuse UDP socket (optional, disabled by default)
gpoirier
parents: 1358
diff changeset
334 s->reuse_socket = find_info_tag(buf, sizeof(buf), "reuse", p);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
335 if (find_info_tag(buf, sizeof(buf), "ttl", p)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
336 s->ttl = strtol(buf, NULL, 10);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
337 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
338 if (find_info_tag(buf, sizeof(buf), "localport", p)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
339 s->local_port = strtol(buf, NULL, 10);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
340 }
62
56a6676125b4 variable UDP packet size patch by Max Krasnyansky
bellard
parents: 0
diff changeset
341 if (find_info_tag(buf, sizeof(buf), "pkt_size", p)) {
56a6676125b4 variable UDP packet size patch by Max Krasnyansky
bellard
parents: 0
diff changeset
342 h->max_packet_size = strtol(buf, NULL, 10);
56a6676125b4 variable UDP packet size patch by Max Krasnyansky
bellard
parents: 0
diff changeset
343 }
4021
6390b29b59f2 Allow the UDP socket buffer size to be adjusted using a
andoma
parents: 3776
diff changeset
344 if (find_info_tag(buf, sizeof(buf), "buffer_size", p)) {
6390b29b59f2 Allow the UDP socket buffer size to be adjusted using a
andoma
parents: 3776
diff changeset
345 s->buffer_size = strtol(buf, NULL, 10);
6390b29b59f2 Allow the UDP socket buffer size to be adjusted using a
andoma
parents: 3776
diff changeset
346 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
347 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
348
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
349 /* fill the dest addr */
6182
4fc5e0e4e1cd Make ff_url_split() public
mru
parents: 6131
diff changeset
350 av_url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &port, NULL, 0, uri);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 834
diff changeset
351
6182
4fc5e0e4e1cd Make ff_url_split() public
mru
parents: 6131
diff changeset
352 /* XXX: fix av_url_split */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
353 if (hostname[0] == '\0' || hostname[0] == '?') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
354 /* only accepts null hostname if input */
3221
e17b25e8a34e Remove the "multicast=" tag from UDP and RTP URLs
lucabe
parents: 3025
diff changeset
355 if (flags & URL_WRONLY)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
356 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
357 } else {
6336
9bd0ce3f9b64 Check for udp_set_remote_url error.
reimar
parents: 6215
diff changeset
358 if (udp_set_remote_url(h, uri) < 0)
9bd0ce3f9b64 Check for udp_set_remote_url error.
reimar
parents: 6215
diff changeset
359 goto fail;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
360 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
361
2750
b3a11a0966af Use the same code to set local_port in the IPv4-only case and in the
lucabe
parents: 2744
diff changeset
362 if (s->is_multicast && !(h->flags & URL_WRONLY))
b3a11a0966af Use the same code to set local_port in the IPv4-only case and in the
lucabe
parents: 2744
diff changeset
363 s->local_port = port;
2752
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
364 udp_fd = udp_socket_create(s, &my_addr, &len);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
365 if (udp_fd < 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
366 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
367
1428
7316227e64eb Make it possible to reuse UDP socket (optional, disabled by default)
gpoirier
parents: 1358
diff changeset
368 if (s->reuse_socket)
7316227e64eb Make it possible to reuse UDP socket (optional, disabled by default)
gpoirier
parents: 1358
diff changeset
369 if (setsockopt (udp_fd, SOL_SOCKET, SO_REUSEADDR, &(s->reuse_socket), sizeof(s->reuse_socket)) != 0)
7316227e64eb Make it possible to reuse UDP socket (optional, disabled by default)
gpoirier
parents: 1358
diff changeset
370 goto fail;
7316227e64eb Make it possible to reuse UDP socket (optional, disabled by default)
gpoirier
parents: 1358
diff changeset
371
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
372 /* the bind is needed to give a port to the socket now */
4070
7f9fb963926c bind to the multicast address if possible
henry
parents: 4035
diff changeset
373 /* if multicast, try the multicast address bind first */
7f9fb963926c bind to the multicast address if possible
henry
parents: 4035
diff changeset
374 if (s->is_multicast && !(h->flags & URL_WRONLY)) {
7f9fb963926c bind to the multicast address if possible
henry
parents: 4035
diff changeset
375 bind_ret = bind(udp_fd,(struct sockaddr *)&s->dest_addr, len);
7f9fb963926c bind to the multicast address if possible
henry
parents: 4035
diff changeset
376 }
7f9fb963926c bind to the multicast address if possible
henry
parents: 4035
diff changeset
377 /* bind to the local address if not multicast or if the multicast
7f9fb963926c bind to the multicast address if possible
henry
parents: 4035
diff changeset
378 * bind failed */
7f9fb963926c bind to the multicast address if possible
henry
parents: 4035
diff changeset
379 if (bind_ret < 0 && bind(udp_fd,(struct sockaddr *)&my_addr, len) < 0)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
380 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
381
2751
d174591c742b Remove the useless variable "my_addr1"
lucabe
parents: 2750
diff changeset
382 len = sizeof(my_addr);
d174591c742b Remove the useless variable "my_addr1"
lucabe
parents: 2750
diff changeset
383 getsockname(udp_fd, (struct sockaddr *)&my_addr, &len);
2752
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
384 s->local_port = udp_port(&my_addr, len);
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
385
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
386 if (s->is_multicast) {
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
387 if (h->flags & URL_WRONLY) {
2739
091af9f47edf Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents: 2738
diff changeset
388 /* output */
2740
e23eaab1a894 Give better names to multicast functions (they are not IPv6-only)
lucabe
parents: 2739
diff changeset
389 if (udp_set_multicast_ttl(udp_fd, s->ttl, (struct sockaddr *)&s->dest_addr) < 0)
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
390 goto fail;
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
391 } else {
2739
091af9f47edf Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents: 2738
diff changeset
392 /* input */
2740
e23eaab1a894 Give better names to multicast functions (they are not IPv6-only)
lucabe
parents: 2739
diff changeset
393 if (udp_join_multicast_group(udp_fd, (struct sockaddr *)&s->dest_addr) < 0)
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
394 goto fail;
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
395 }
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
396 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
397
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
398 if (is_output) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
399 /* limit the tx buf size to limit latency */
4021
6390b29b59f2 Allow the UDP socket buffer size to be adjusted using a
andoma
parents: 3776
diff changeset
400 tmp = s->buffer_size;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
401 if (setsockopt(udp_fd, SOL_SOCKET, SO_SNDBUF, &tmp, sizeof(tmp)) < 0) {
2768
20156cdb5f84 Remove perror() usage from udp.c
lucabe
parents: 2752
diff changeset
402 av_log(NULL, AV_LOG_ERROR, "setsockopt(SO_SNDBUF): %s\n", strerror(errno));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
403 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
404 }
2391
2298213e3016 Set UDP receive buffer to 64k
ramiro
parents: 2351
diff changeset
405 } else {
2298213e3016 Set UDP receive buffer to 64k
ramiro
parents: 2351
diff changeset
406 /* set udp recv buffer size to the largest possible udp packet size to
2298213e3016 Set UDP receive buffer to 64k
ramiro
parents: 2351
diff changeset
407 * avoid losing data on OSes that set this too low by default. */
4021
6390b29b59f2 Allow the UDP socket buffer size to be adjusted using a
andoma
parents: 3776
diff changeset
408 tmp = s->buffer_size;
6390b29b59f2 Allow the UDP socket buffer size to be adjusted using a
andoma
parents: 3776
diff changeset
409 if (setsockopt(udp_fd, SOL_SOCKET, SO_RCVBUF, &tmp, sizeof(tmp)) < 0) {
6390b29b59f2 Allow the UDP socket buffer size to be adjusted using a
andoma
parents: 3776
diff changeset
410 av_log(NULL, AV_LOG_WARNING, "setsockopt(SO_RECVBUF): %s\n", strerror(errno));
6390b29b59f2 Allow the UDP socket buffer size to be adjusted using a
andoma
parents: 3776
diff changeset
411 }
4035
8c161751e4c7 Get rid of MSG_DONTWAIT using a more standard way to use a socket
benoit
parents: 4024
diff changeset
412 /* make the socket non-blocking */
8c161751e4c7 Get rid of MSG_DONTWAIT using a more standard way to use a socket
benoit
parents: 4024
diff changeset
413 ff_socket_nonblock(udp_fd, 1);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
414 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
415
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
416 s->udp_fd = udp_fd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
417 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
418 fail:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
419 if (udp_fd >= 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
420 closesocket(udp_fd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
421 av_free(s);
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2162
diff changeset
422 return AVERROR(EIO);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
423 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
424
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 62
diff changeset
425 static int udp_read(URLContext *h, uint8_t *buf, int size)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
426 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
427 UDPContext *s = h->priv_data;
1332
7474cc6383d4 fix some signedness warnings
mru
parents: 1124
diff changeset
428 int len;
4024
459dd8d5ad86 check for interrupt when receiving from socket
henry
parents: 4021
diff changeset
429 fd_set rfds;
459dd8d5ad86 check for interrupt when receiving from socket
henry
parents: 4021
diff changeset
430 int ret;
459dd8d5ad86 check for interrupt when receiving from socket
henry
parents: 4021
diff changeset
431 struct timeval tv;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
432
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
433 for(;;) {
4024
459dd8d5ad86 check for interrupt when receiving from socket
henry
parents: 4021
diff changeset
434 if (url_interrupt_cb())
459dd8d5ad86 check for interrupt when receiving from socket
henry
parents: 4021
diff changeset
435 return AVERROR(EINTR);
459dd8d5ad86 check for interrupt when receiving from socket
henry
parents: 4021
diff changeset
436 FD_ZERO(&rfds);
459dd8d5ad86 check for interrupt when receiving from socket
henry
parents: 4021
diff changeset
437 FD_SET(s->udp_fd, &rfds);
459dd8d5ad86 check for interrupt when receiving from socket
henry
parents: 4021
diff changeset
438 tv.tv_sec = 0;
459dd8d5ad86 check for interrupt when receiving from socket
henry
parents: 4021
diff changeset
439 tv.tv_usec = 100 * 1000;
459dd8d5ad86 check for interrupt when receiving from socket
henry
parents: 4021
diff changeset
440 ret = select(s->udp_fd + 1, &rfds, NULL, NULL, &tv);
5896
395592984ef0 Don't report EINTR from select as an error, retry select instead
mstorsjo
parents: 5837
diff changeset
441 if (ret < 0) {
395592984ef0 Don't report EINTR from select as an error, retry select instead
mstorsjo
parents: 5837
diff changeset
442 if (ff_neterrno() == FF_NETERROR(EINTR))
395592984ef0 Don't report EINTR from select as an error, retry select instead
mstorsjo
parents: 5837
diff changeset
443 continue;
4024
459dd8d5ad86 check for interrupt when receiving from socket
henry
parents: 4021
diff changeset
444 return AVERROR(EIO);
5896
395592984ef0 Don't report EINTR from select as an error, retry select instead
mstorsjo
parents: 5837
diff changeset
445 }
4024
459dd8d5ad86 check for interrupt when receiving from socket
henry
parents: 4021
diff changeset
446 if (!(ret > 0 && FD_ISSET(s->udp_fd, &rfds)))
459dd8d5ad86 check for interrupt when receiving from socket
henry
parents: 4021
diff changeset
447 continue;
4035
8c161751e4c7 Get rid of MSG_DONTWAIT using a more standard way to use a socket
benoit
parents: 4024
diff changeset
448 len = recv(s->udp_fd, buf, size, 0);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
449 if (len < 0) {
2056
eeea52739ff3 use ff_neterrno() and FF_NETERROR() for networking error handling
alex
parents: 1810
diff changeset
450 if (ff_neterrno() != FF_NETERROR(EAGAIN) &&
eeea52739ff3 use ff_neterrno() and FF_NETERROR() for networking error handling
alex
parents: 1810
diff changeset
451 ff_neterrno() != FF_NETERROR(EINTR))
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2162
diff changeset
452 return AVERROR(EIO);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
453 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
454 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
455 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
456 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
457 return len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
458 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
459
6068
7fdda2416684 Declare the url_write buffer parameter as const
mstorsjo
parents: 5969
diff changeset
460 static int udp_write(URLContext *h, const uint8_t *buf, int size)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
461 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
462 UDPContext *s = h->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
463 int ret;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
464
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
465 for(;;) {
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 834
diff changeset
466 ret = sendto (s->udp_fd, buf, size, 0,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
467 (struct sockaddr *) &s->dest_addr,
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
468 s->dest_addr_len);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
469 if (ret < 0) {
2056
eeea52739ff3 use ff_neterrno() and FF_NETERROR() for networking error handling
alex
parents: 1810
diff changeset
470 if (ff_neterrno() != FF_NETERROR(EINTR) &&
eeea52739ff3 use ff_neterrno() and FF_NETERROR() for networking error handling
alex
parents: 1810
diff changeset
471 ff_neterrno() != FF_NETERROR(EAGAIN))
2274
b21c2af60bc9 Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents: 2162
diff changeset
472 return AVERROR(EIO);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
473 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
474 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
475 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
476 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
477 return size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
478 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
479
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
480 static int udp_close(URLContext *h)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
481 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
482 UDPContext *s = h->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
483
579
117ece7c24a6 IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents: 511
diff changeset
484 if (s->is_multicast && !(h->flags & URL_WRONLY))
2740
e23eaab1a894 Give better names to multicast functions (they are not IPv6-only)
lucabe
parents: 2739
diff changeset
485 udp_leave_multicast_group(s->udp_fd, (struct sockaddr *)&s->dest_addr);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
486 closesocket(s->udp_fd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
487 av_free(s);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
488 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
489 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
490
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
491 URLProtocol udp_protocol = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
492 "udp",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
493 udp_open,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
494 udp_read,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
495 udp_write,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
496 NULL, /* seek */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
497 udp_close,
4640
b34d9614b887 Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents: 4331
diff changeset
498 .url_get_file_handle = udp_get_file_handle,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
499 };