Mercurial > libavformat.hg
annotate udp.c @ 3068:9cc9ff5aff9c libavformat
set bps to uncompressed original sound data for compressed audio
according to aiff specs, qt set it to 16 for mace and ima4,
fail if block align is not set.
author | bcoudurier |
---|---|
date | Mon, 25 Feb 2008 12:00:31 +0000 |
parents | 41d68d056417 |
children | e17b25e8a34e |
rev | line source |
---|---|
0 | 1 /* |
2 * UDP prototype streaming system | |
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard. | |
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 | 8 * modify it under the terms of the GNU Lesser General Public |
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 | 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 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
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 | 20 */ |
21 #include "avformat.h" | |
22 #include <unistd.h> | |
1754 | 23 #include "network.h" |
2773 | 24 #include "os_support.h" |
0 | 25 |
834 | 26 #ifndef IPV6_ADD_MEMBERSHIP |
27 #define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP | |
28 #define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP | |
29 #endif | |
30 | |
0 | 31 typedef struct { |
32 int udp_fd; | |
33 int ttl; | |
34 int is_multicast; | |
35 int local_port; | |
1428
7316227e64eb
Make it possible to reuse UDP socket (optional, disabled by default)
gpoirier
parents:
1358
diff
changeset
|
36 int reuse_socket; |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
37 #ifndef CONFIG_IPV6 |
0 | 38 struct sockaddr_in dest_addr; |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
39 #else |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
40 struct sockaddr_storage dest_addr; |
2738
1f5c5c223764
Remove some ifdefs by using the "dest_addr_len" field in both the IPv4-only
lucabe
parents:
2689
diff
changeset
|
41 #endif |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
42 size_t dest_addr_len; |
0 | 43 } UDPContext; |
44 | |
45 #define UDP_TX_BUF_SIZE 32768 | |
2391 | 46 #define UDP_MAX_PKT_SIZE 65536 |
0 | 47 |
2740
e23eaab1a894
Give better names to multicast functions (they are not IPv6-only)
lucabe
parents:
2739
diff
changeset
|
48 static int udp_set_multicast_ttl(int sockfd, int mcastTTL, struct sockaddr *addr) { |
2739
091af9f47edf
Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents:
2738
diff
changeset
|
49 #ifdef IP_MULTICAST_TTL |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
50 if (addr->sa_family == AF_INET) { |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
51 if (setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, &mcastTTL, sizeof(mcastTTL)) < 0) { |
2768 | 52 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
|
53 return -1; |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
54 } |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
55 } |
2739
091af9f47edf
Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents:
2738
diff
changeset
|
56 #endif |
091af9f47edf
Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents:
2738
diff
changeset
|
57 #ifdef CONFIG_IPV6 |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
58 if (addr->sa_family == AF_INET6) { |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
59 if (setsockopt(sockfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &mcastTTL, sizeof(mcastTTL)) < 0) { |
2768 | 60 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
|
61 return -1; |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
62 } |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
63 } |
2739
091af9f47edf
Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents:
2738
diff
changeset
|
64 #endif |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
65 return 0; |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
66 } |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
67 |
2740
e23eaab1a894
Give better names to multicast functions (they are not IPv6-only)
lucabe
parents:
2739
diff
changeset
|
68 static int udp_join_multicast_group(int sockfd, struct sockaddr *addr) { |
2739
091af9f47edf
Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents:
2738
diff
changeset
|
69 #ifdef IP_ADD_MEMBERSHIP |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
70 if (addr->sa_family == AF_INET) { |
2739
091af9f47edf
Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents:
2738
diff
changeset
|
71 struct ip_mreq mreq; |
091af9f47edf
Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents:
2738
diff
changeset
|
72 |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
73 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
|
74 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
|
75 if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const void *)&mreq, sizeof(mreq)) < 0) { |
2768 | 76 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
|
77 return -1; |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
78 } |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
79 } |
2739
091af9f47edf
Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents:
2738
diff
changeset
|
80 #endif |
091af9f47edf
Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents:
2738
diff
changeset
|
81 #ifdef CONFIG_IPV6 |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
82 if (addr->sa_family == AF_INET6) { |
2739
091af9f47edf
Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents:
2738
diff
changeset
|
83 struct ipv6_mreq mreq6; |
091af9f47edf
Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents:
2738
diff
changeset
|
84 |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
85 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
|
86 mreq6.ipv6mr_interface= 0; |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
87 if (setsockopt(sockfd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, &mreq6, sizeof(mreq6)) < 0) { |
2768 | 88 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
|
89 return -1; |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
90 } |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
91 } |
2739
091af9f47edf
Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents:
2738
diff
changeset
|
92 #endif |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
93 return 0; |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
94 } |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
95 |
2740
e23eaab1a894
Give better names to multicast functions (they are not IPv6-only)
lucabe
parents:
2739
diff
changeset
|
96 static int udp_leave_multicast_group(int sockfd, struct sockaddr *addr) { |
2739
091af9f47edf
Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents:
2738
diff
changeset
|
97 #ifdef IP_DROP_MEMBERSHIP |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
98 if (addr->sa_family == AF_INET) { |
2739
091af9f47edf
Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents:
2738
diff
changeset
|
99 struct ip_mreq mreq; |
091af9f47edf
Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents:
2738
diff
changeset
|
100 |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
101 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
|
102 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
|
103 if (setsockopt(sockfd, IPPROTO_IP, IP_DROP_MEMBERSHIP, (const void *)&mreq, sizeof(mreq)) < 0) { |
2768 | 104 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
|
105 return -1; |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
106 } |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
107 } |
2739
091af9f47edf
Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents:
2738
diff
changeset
|
108 #endif |
091af9f47edf
Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents:
2738
diff
changeset
|
109 #ifdef CONFIG_IPV6 |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
110 if (addr->sa_family == AF_INET6) { |
2739
091af9f47edf
Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents:
2738
diff
changeset
|
111 struct ipv6_mreq mreq6; |
091af9f47edf
Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents:
2738
diff
changeset
|
112 |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
113 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
|
114 mreq6.ipv6mr_interface= 0; |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
115 if (setsockopt(sockfd, IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, &mreq6, sizeof(mreq6)) < 0) { |
2768 | 116 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
|
117 return -1; |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
118 } |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
119 } |
2739
091af9f47edf
Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents:
2738
diff
changeset
|
120 #endif |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
121 return 0; |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
122 } |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
123 |
2739
091af9f47edf
Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents:
2738
diff
changeset
|
124 #ifdef CONFIG_IPV6 |
1124
d3aff2c607f9
Add const to (mostly) char* and make some functions static, which aren't used
diego
parents:
896
diff
changeset
|
125 static struct addrinfo* udp_ipv6_resolve_host(const char *hostname, int port, int type, int family, int flags) { |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
126 struct addrinfo hints, *res = 0; |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
127 int error; |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
128 char sport[16]; |
2687
f4d24b10d33d
Resolve hosts and bind sockets even when the local_port is not set (0)
lucabe
parents:
2391
diff
changeset
|
129 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
|
130 |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
131 if (port > 0) { |
644 | 132 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
|
133 service = sport; |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
134 } |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
135 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
|
136 node = hostname; |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
137 } |
2688 | 138 memset(&hints, 0, sizeof(hints)); |
139 hints.ai_socktype = type; | |
140 hints.ai_family = family; | |
141 hints.ai_flags = flags; | |
142 if ((error = getaddrinfo(node, service, &hints, &res))) { | |
143 av_log(NULL, AV_LOG_ERROR, "udp_ipv6_resolve_host: %s\n", gai_strerror(error)); | |
144 } | |
145 | |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
146 return res; |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
147 } |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
148 |
2743
a847a9eda9b2
Simplify set_remote_url(), and remove some code duplication
lucabe
parents:
2742
diff
changeset
|
149 static int udp_set_url(struct sockaddr_storage *addr, const char *hostname, int port) { |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
150 struct addrinfo *res0; |
2743
a847a9eda9b2
Simplify set_remote_url(), and remove some code duplication
lucabe
parents:
2742
diff
changeset
|
151 int addr_len; |
a847a9eda9b2
Simplify set_remote_url(), and remove some code duplication
lucabe
parents:
2742
diff
changeset
|
152 |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
153 res0 = udp_ipv6_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
|
154 if (res0 == 0) return AVERROR(EIO); |
2743
a847a9eda9b2
Simplify set_remote_url(), and remove some code duplication
lucabe
parents:
2742
diff
changeset
|
155 memcpy(addr, res0->ai_addr, res0->ai_addrlen); |
a847a9eda9b2
Simplify set_remote_url(), and remove some code duplication
lucabe
parents:
2742
diff
changeset
|
156 addr_len = res0->ai_addrlen; |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
157 freeaddrinfo(res0); |
2743
a847a9eda9b2
Simplify set_remote_url(), and remove some code duplication
lucabe
parents:
2742
diff
changeset
|
158 |
a847a9eda9b2
Simplify set_remote_url(), and remove some code duplication
lucabe
parents:
2742
diff
changeset
|
159 return addr_len; |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
160 } |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
161 |
2752 | 162 static int udp_socket_create(UDPContext *s, struct sockaddr_storage *addr, int *addr_len) |
163 { | |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
164 int udp_fd = -1; |
825
c8d4a65729c5
udp ipv6 localhost resolving patch by ("Hans Zandbelt": Hans Zandbelt, telin nl)
michael
parents:
815
diff
changeset
|
165 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
|
166 int family = AF_UNSPEC; |
885 | 167 |
2689
7d25b8de708d
Take the target address family in account when determining the family of
lucabe
parents:
2688
diff
changeset
|
168 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
|
169 family = ((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
|
170 res0 = udp_ipv6_resolve_host(0, s->local_port, SOCK_DGRAM, family, AI_PASSIVE); |
2688 | 171 if (res0 == 0) |
172 goto fail; | |
173 for (res = res0; res; res=res->ai_next) { | |
174 udp_fd = socket(res->ai_family, SOCK_DGRAM, 0); | |
175 if (udp_fd > 0) break; | |
2768 | 176 av_log(NULL, AV_LOG_ERROR, "socket: %s\n", strerror(errno)); |
2688 | 177 } |
825
c8d4a65729c5
udp ipv6 localhost resolving patch by ("Hans Zandbelt": Hans Zandbelt, telin nl)
michael
parents:
815
diff
changeset
|
178 |
c8d4a65729c5
udp ipv6 localhost resolving patch by ("Hans Zandbelt": Hans Zandbelt, telin nl)
michael
parents:
815
diff
changeset
|
179 if (udp_fd < 0) |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
180 goto fail; |
885 | 181 |
2752 | 182 memcpy(addr, res->ai_addr, res->ai_addrlen); |
183 *addr_len = res->ai_addrlen; | |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
184 |
2752 | 185 freeaddrinfo(res0); |
885 | 186 |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
187 return udp_fd; |
885 | 188 |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
189 fail: |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
190 if (udp_fd >= 0) |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
191 closesocket(udp_fd); |
683
095009fc2f35
kill warnings patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents:
644
diff
changeset
|
192 if(res0) |
095009fc2f35
kill warnings patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents:
644
diff
changeset
|
193 freeaddrinfo(res0); |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
194 return -1; |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
195 } |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
196 |
2752 | 197 static int udp_port(struct sockaddr_storage *addr, int addr_len) |
198 { | |
3025
41d68d056417
Do not use GNU-specific (or BSD-specific or whatever they may be)
rfelker
parents:
2773
diff
changeset
|
199 char sbuf[sizeof(int)*3+1]; |
2752 | 200 |
3025
41d68d056417
Do not use GNU-specific (or BSD-specific or whatever they may be)
rfelker
parents:
2773
diff
changeset
|
201 if (getnameinfo((struct sockaddr *)addr, addr_len, NULL, 0, sbuf, sizeof(sbuf), NI_NUMERICSERV) != 0) { |
2768 | 202 av_log(NULL, AV_LOG_ERROR, "getnameinfo: %s\n", strerror(errno)); |
2752 | 203 return -1; |
204 } | |
205 | |
206 return strtol(sbuf, NULL, 10); | |
207 } | |
208 | |
2743
a847a9eda9b2
Simplify set_remote_url(), and remove some code duplication
lucabe
parents:
2742
diff
changeset
|
209 #else |
a847a9eda9b2
Simplify set_remote_url(), and remove some code duplication
lucabe
parents:
2742
diff
changeset
|
210 |
a847a9eda9b2
Simplify set_remote_url(), and remove some code duplication
lucabe
parents:
2742
diff
changeset
|
211 static int udp_set_url(struct sockaddr_in *addr, const char *hostname, int port) |
a847a9eda9b2
Simplify set_remote_url(), and remove some code duplication
lucabe
parents:
2742
diff
changeset
|
212 { |
a847a9eda9b2
Simplify set_remote_url(), and remove some code duplication
lucabe
parents:
2742
diff
changeset
|
213 /* set the destination address */ |
a847a9eda9b2
Simplify set_remote_url(), and remove some code duplication
lucabe
parents:
2742
diff
changeset
|
214 if (resolve_host(&addr->sin_addr, hostname) < 0) |
a847a9eda9b2
Simplify set_remote_url(), and remove some code duplication
lucabe
parents:
2742
diff
changeset
|
215 return AVERROR(EIO); |
a847a9eda9b2
Simplify set_remote_url(), and remove some code duplication
lucabe
parents:
2742
diff
changeset
|
216 addr->sin_family = AF_INET; |
a847a9eda9b2
Simplify set_remote_url(), and remove some code duplication
lucabe
parents:
2742
diff
changeset
|
217 addr->sin_port = htons(port); |
a847a9eda9b2
Simplify set_remote_url(), and remove some code duplication
lucabe
parents:
2742
diff
changeset
|
218 |
a847a9eda9b2
Simplify set_remote_url(), and remove some code duplication
lucabe
parents:
2742
diff
changeset
|
219 return sizeof(struct sockaddr_in); |
a847a9eda9b2
Simplify set_remote_url(), and remove some code duplication
lucabe
parents:
2742
diff
changeset
|
220 } |
a847a9eda9b2
Simplify set_remote_url(), and remove some code duplication
lucabe
parents:
2742
diff
changeset
|
221 |
2752 | 222 static int udp_socket_create(UDPContext *s, struct sockaddr_in *addr, int *addr_len) |
223 { | |
224 int fd; | |
225 | |
226 fd = socket(AF_INET, SOCK_DGRAM, 0); | |
227 if (fd < 0) | |
228 return -1; | |
229 | |
230 addr->sin_family = AF_INET; | |
231 addr->sin_addr.s_addr = htonl (INADDR_ANY); | |
232 addr->sin_port = htons(s->local_port); | |
233 *addr_len = sizeof(struct sockaddr_in); | |
234 | |
235 return fd; | |
236 } | |
237 | |
238 static int udp_port(struct sockaddr_in *addr, int len) | |
239 { | |
240 return ntohs(addr->sin_port); | |
241 } | |
2162 | 242 #endif /* CONFIG_IPV6 */ |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
243 |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
244 |
0 | 245 /** |
246 * If no filename is given to av_open_input_file because you want to | |
247 * get the local port first, then you must call this function to set | |
248 * the remote server address. | |
249 * | |
250 * url syntax: udp://host:port[?option=val...] | |
885 | 251 * option: 'multicast=1' : enable multicast |
0 | 252 * 'ttl=n' : set the ttl value (for multicast only) |
253 * 'localport=n' : set the local port | |
62 | 254 * '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
|
255 * 'reuse=1' : enable reusing the socket |
0 | 256 * |
257 * @param s1 media file context | |
258 * @param uri of the remote server | |
259 * @return zero if no error. | |
260 */ | |
261 int udp_set_remote_url(URLContext *h, const char *uri) | |
262 { | |
263 UDPContext *s = h->priv_data; | |
264 char hostname[256]; | |
265 int port; | |
885 | 266 |
511
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
482
diff
changeset
|
267 url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &port, NULL, 0, uri); |
0 | 268 |
269 /* set the destination address */ | |
2743
a847a9eda9b2
Simplify set_remote_url(), and remove some code duplication
lucabe
parents:
2742
diff
changeset
|
270 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
|
271 if (s->dest_addr_len < 0) { |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2162
diff
changeset
|
272 return AVERROR(EIO); |
2743
a847a9eda9b2
Simplify set_remote_url(), and remove some code duplication
lucabe
parents:
2742
diff
changeset
|
273 } |
a847a9eda9b2
Simplify set_remote_url(), and remove some code duplication
lucabe
parents:
2742
diff
changeset
|
274 |
0 | 275 return 0; |
276 } | |
277 | |
278 /** | |
279 * Return the local port used by the UDP connexion | |
280 * @param s1 media file context | |
281 * @return the local port number | |
282 */ | |
283 int udp_get_local_port(URLContext *h) | |
284 { | |
285 UDPContext *s = h->priv_data; | |
286 return s->local_port; | |
287 } | |
288 | |
289 /** | |
290 * Return the udp file handle for select() usage to wait for several RTP | |
291 * streams at the same time. | |
292 * @param h media file context | |
293 */ | |
294 int udp_get_file_handle(URLContext *h) | |
295 { | |
296 UDPContext *s = h->priv_data; | |
297 return s->udp_fd; | |
298 } | |
299 | |
300 /* put it in UDP context */ | |
301 /* return non zero if error */ | |
302 static int udp_open(URLContext *h, const char *uri, int flags) | |
303 { | |
304 char hostname[1024]; | |
305 int port, udp_fd = -1, tmp; | |
306 UDPContext *s = NULL; | |
683
095009fc2f35
kill warnings patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents:
644
diff
changeset
|
307 int is_output; |
0 | 308 const char *p; |
309 char buf[256]; | |
683
095009fc2f35
kill warnings patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents:
644
diff
changeset
|
310 #ifndef CONFIG_IPV6 |
2751 | 311 struct sockaddr_in my_addr; |
2752 | 312 #else |
313 struct sockaddr_storage my_addr; | |
314 #endif | |
683
095009fc2f35
kill warnings patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents:
644
diff
changeset
|
315 int len; |
0 | 316 |
317 h->is_streamed = 1; | |
62 | 318 h->max_packet_size = 1472; |
0 | 319 |
320 is_output = (flags & URL_WRONLY); | |
885 | 321 |
2689
7d25b8de708d
Take the target address family in account when determining the family of
lucabe
parents:
2688
diff
changeset
|
322 s = av_mallocz(sizeof(UDPContext)); |
0 | 323 if (!s) |
1787
eb16c64144ee
This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents:
1754
diff
changeset
|
324 return AVERROR(ENOMEM); |
0 | 325 |
326 h->priv_data = s; | |
327 s->ttl = 16; | |
328 p = strchr(uri, '?'); | |
329 if (p) { | |
330 s->is_multicast = find_info_tag(buf, sizeof(buf), "multicast", p); | |
1428
7316227e64eb
Make it possible to reuse UDP socket (optional, disabled by default)
gpoirier
parents:
1358
diff
changeset
|
331 s->reuse_socket = find_info_tag(buf, sizeof(buf), "reuse", p); |
0 | 332 if (find_info_tag(buf, sizeof(buf), "ttl", p)) { |
333 s->ttl = strtol(buf, NULL, 10); | |
334 } | |
335 if (find_info_tag(buf, sizeof(buf), "localport", p)) { | |
336 s->local_port = strtol(buf, NULL, 10); | |
337 } | |
62 | 338 if (find_info_tag(buf, sizeof(buf), "pkt_size", p)) { |
339 h->max_packet_size = strtol(buf, NULL, 10); | |
340 } | |
0 | 341 } |
342 | |
343 /* fill the dest addr */ | |
511
056991ab9f10
HTTP Authentication Patch by (Petr Doubek <doubek at vision dot ee dot ethz dot ch>)
michael
parents:
482
diff
changeset
|
344 url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &port, NULL, 0, uri); |
885 | 345 |
0 | 346 /* XXX: fix url_split */ |
347 if (hostname[0] == '\0' || hostname[0] == '?') { | |
348 /* only accepts null hostname if input */ | |
349 if (s->is_multicast || (flags & URL_WRONLY)) | |
350 goto fail; | |
351 } else { | |
352 udp_set_remote_url(h, uri); | |
353 } | |
354 | |
2351
b9a881c0967e
Add initialization and cleanup functions for Winsock
ramiro
parents:
2274
diff
changeset
|
355 if(!ff_network_init()) |
b9a881c0967e
Add initialization and cleanup functions for Winsock
ramiro
parents:
2274
diff
changeset
|
356 return AVERROR(EIO); |
b9a881c0967e
Add initialization and cleanup functions for Winsock
ramiro
parents:
2274
diff
changeset
|
357 |
2750
b3a11a0966af
Use the same code to set local_port in the IPv4-only case and in the
lucabe
parents:
2744
diff
changeset
|
358 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
|
359 s->local_port = port; |
2752 | 360 udp_fd = udp_socket_create(s, &my_addr, &len); |
0 | 361 if (udp_fd < 0) |
362 goto fail; | |
363 | |
1428
7316227e64eb
Make it possible to reuse UDP socket (optional, disabled by default)
gpoirier
parents:
1358
diff
changeset
|
364 if (s->reuse_socket) |
7316227e64eb
Make it possible to reuse UDP socket (optional, disabled by default)
gpoirier
parents:
1358
diff
changeset
|
365 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
|
366 goto fail; |
7316227e64eb
Make it possible to reuse UDP socket (optional, disabled by default)
gpoirier
parents:
1358
diff
changeset
|
367 |
0 | 368 /* the bind is needed to give a port to the socket now */ |
2752 | 369 if (bind(udp_fd,(struct sockaddr *)&my_addr, len) < 0) |
0 | 370 goto fail; |
371 | |
2751 | 372 len = sizeof(my_addr); |
373 getsockname(udp_fd, (struct sockaddr *)&my_addr, &len); | |
2752 | 374 s->local_port = udp_port(&my_addr, len); |
375 | |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
376 if (s->is_multicast) { |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
377 if (h->flags & URL_WRONLY) { |
2739
091af9f47edf
Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents:
2738
diff
changeset
|
378 /* output */ |
2740
e23eaab1a894
Give better names to multicast functions (they are not IPv6-only)
lucabe
parents:
2739
diff
changeset
|
379 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
|
380 goto fail; |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
381 } else { |
2739
091af9f47edf
Avoid to duplicate the multicast code between the IPv4-only and
lucabe
parents:
2738
diff
changeset
|
382 /* input */ |
2740
e23eaab1a894
Give better names to multicast functions (they are not IPv6-only)
lucabe
parents:
2739
diff
changeset
|
383 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
|
384 goto fail; |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
385 } |
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
386 } |
0 | 387 |
388 if (is_output) { | |
389 /* limit the tx buf size to limit latency */ | |
390 tmp = UDP_TX_BUF_SIZE; | |
391 if (setsockopt(udp_fd, SOL_SOCKET, SO_SNDBUF, &tmp, sizeof(tmp)) < 0) { | |
2768 | 392 av_log(NULL, AV_LOG_ERROR, "setsockopt(SO_SNDBUF): %s\n", strerror(errno)); |
0 | 393 goto fail; |
394 } | |
2391 | 395 } else { |
396 /* set udp recv buffer size to the largest possible udp packet size to | |
397 * avoid losing data on OSes that set this too low by default. */ | |
398 tmp = UDP_MAX_PKT_SIZE; | |
399 setsockopt(udp_fd, SOL_SOCKET, SO_RCVBUF, &tmp, sizeof(tmp)); | |
0 | 400 } |
401 | |
402 s->udp_fd = udp_fd; | |
403 return 0; | |
404 fail: | |
405 if (udp_fd >= 0) | |
406 closesocket(udp_fd); | |
407 av_free(s); | |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2162
diff
changeset
|
408 return AVERROR(EIO); |
0 | 409 } |
410 | |
65 | 411 static int udp_read(URLContext *h, uint8_t *buf, int size) |
0 | 412 { |
413 UDPContext *s = h->priv_data; | |
1332 | 414 int len; |
0 | 415 |
416 for(;;) { | |
2742
c51f5ad5d131
Use recv() instead of recvfrom() (removes some other differences between
lucabe
parents:
2741
diff
changeset
|
417 len = recv(s->udp_fd, buf, size, 0); |
0 | 418 if (len < 0) { |
2056
eeea52739ff3
use ff_neterrno() and FF_NETERROR() for networking error handling
alex
parents:
1810
diff
changeset
|
419 if (ff_neterrno() != FF_NETERROR(EAGAIN) && |
eeea52739ff3
use ff_neterrno() and FF_NETERROR() for networking error handling
alex
parents:
1810
diff
changeset
|
420 ff_neterrno() != FF_NETERROR(EINTR)) |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2162
diff
changeset
|
421 return AVERROR(EIO); |
0 | 422 } else { |
423 break; | |
424 } | |
425 } | |
426 return len; | |
427 } | |
428 | |
65 | 429 static int udp_write(URLContext *h, uint8_t *buf, int size) |
0 | 430 { |
431 UDPContext *s = h->priv_data; | |
432 int ret; | |
433 | |
434 for(;;) { | |
885 | 435 ret = sendto (s->udp_fd, buf, size, 0, |
0 | 436 (struct sockaddr *) &s->dest_addr, |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
437 s->dest_addr_len); |
0 | 438 if (ret < 0) { |
2056
eeea52739ff3
use ff_neterrno() and FF_NETERROR() for networking error handling
alex
parents:
1810
diff
changeset
|
439 if (ff_neterrno() != FF_NETERROR(EINTR) && |
eeea52739ff3
use ff_neterrno() and FF_NETERROR() for networking error handling
alex
parents:
1810
diff
changeset
|
440 ff_neterrno() != FF_NETERROR(EAGAIN)) |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2162
diff
changeset
|
441 return AVERROR(EIO); |
0 | 442 } else { |
443 break; | |
444 } | |
445 } | |
446 return size; | |
447 } | |
448 | |
449 static int udp_close(URLContext *h) | |
450 { | |
451 UDPContext *s = h->priv_data; | |
452 | |
579
117ece7c24a6
IPv6 support patch by ("Hans Zandbelt" <Hans.Zandbelt <at> telin {dot} nl>)
michael
parents:
511
diff
changeset
|
453 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
|
454 udp_leave_multicast_group(s->udp_fd, (struct sockaddr *)&s->dest_addr); |
0 | 455 closesocket(s->udp_fd); |
2351
b9a881c0967e
Add initialization and cleanup functions for Winsock
ramiro
parents:
2274
diff
changeset
|
456 ff_network_close(); |
0 | 457 av_free(s); |
458 return 0; | |
459 } | |
460 | |
461 URLProtocol udp_protocol = { | |
462 "udp", | |
463 udp_open, | |
464 udp_read, | |
465 udp_write, | |
466 NULL, /* seek */ | |
467 udp_close, | |
468 }; |