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
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard.
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 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
21 #include "avformat.h"
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
22 #include <unistd.h>
1754
1f7a6dc01100 move networking #includes into separate file
mru
parents: 1672
diff changeset
23 #include "network.h"
2773
13b65f62e3a6 Include os_support.h only when needed
lucabe
parents: 2768
diff changeset
24 #include "os_support.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
25
834
2ad855f5a156 FreeBSD ipv6 multicast patch from ports tree
alex
parents: 825
diff changeset
26 #ifndef IPV6_ADD_MEMBERSHIP
2ad855f5a156 FreeBSD ipv6 multicast patch from ports tree
alex
parents: 825
diff changeset
27 #define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
2ad855f5a156 FreeBSD ipv6 multicast patch from ports tree
alex
parents: 825
diff changeset
28 #define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP
2ad855f5a156 FreeBSD ipv6 multicast patch from ports tree
alex
parents: 825
diff changeset
29 #endif
2ad855f5a156 FreeBSD ipv6 multicast patch from ports tree
alex
parents: 825
diff changeset
30
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
31 typedef struct {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
32 int udp_fd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
33 int ttl;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
34 int is_multicast;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
43 } UDPContext;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
44
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
45 #define UDP_TX_BUF_SIZE 32768
2391
2298213e3016 Set UDP receive buffer to 64k
ramiro
parents: 2351
diff changeset
46 #define UDP_MAX_PKT_SIZE 65536
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
20156cdb5f84 Remove perror() usage from udp.c
lucabe
parents: 2752
diff changeset
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
20156cdb5f84 Remove perror() usage from udp.c
lucabe
parents: 2752
diff changeset
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
20156cdb5f84 Remove perror() usage from udp.c
lucabe
parents: 2752
diff changeset
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
20156cdb5f84 Remove perror() usage from udp.c
lucabe
parents: 2752
diff changeset
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
20156cdb5f84 Remove perror() usage from udp.c
lucabe
parents: 2752
diff changeset
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
20156cdb5f84 Remove perror() usage from udp.c
lucabe
parents: 2752
diff changeset
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
1bbcf7b444ae dissallow sprintf
michael
parents: 579
diff changeset
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
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
138 memset(&hints, 0, sizeof(hints));
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
139 hints.ai_socktype = type;
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
140 hints.ai_family = family;
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
141 hints.ai_flags = flags;
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
142 if ((error = getaddrinfo(node, service, &hints, &res))) {
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
143 av_log(NULL, AV_LOG_ERROR, "udp_ipv6_resolve_host: %s\n", gai_strerror(error));
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
144 }
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
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
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
162 static int udp_socket_create(UDPContext *s, struct sockaddr_storage *addr, int *addr_len)
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
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
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 834
diff changeset
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
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
171 if (res0 == 0)
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
172 goto fail;
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
173 for (res = res0; res; res=res->ai_next) {
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
174 udp_fd = socket(res->ai_family, SOCK_DGRAM, 0);
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
175 if (udp_fd > 0) break;
2768
20156cdb5f84 Remove perror() usage from udp.c
lucabe
parents: 2752
diff changeset
176 av_log(NULL, AV_LOG_ERROR, "socket: %s\n", strerror(errno));
2688
fffdcae6654c Reindent after last commit
lucabe
parents: 2687
diff changeset
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
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 834
diff changeset
181
2752
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
182 memcpy(addr, res->ai_addr, res->ai_addrlen);
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
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
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
185 freeaddrinfo(res0);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 834
diff changeset
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
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 834
diff changeset
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
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
197 static int udp_port(struct sockaddr_storage *addr, int addr_len)
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
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
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
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
20156cdb5f84 Remove perror() usage from udp.c
lucabe
parents: 2752
diff changeset
202 av_log(NULL, AV_LOG_ERROR, "getnameinfo: %s\n", strerror(errno));
2752
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
203 return -1;
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
204 }
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
205
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
206 return strtol(sbuf, NULL, 10);
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
207 }
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
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
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
222 static int udp_socket_create(UDPContext *s, struct sockaddr_in *addr, int *addr_len)
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
223 {
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
224 int fd;
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
225
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
226 fd = socket(AF_INET, SOCK_DGRAM, 0);
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
227 if (fd < 0)
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
228 return -1;
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
229
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
230 addr->sin_family = AF_INET;
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
231 addr->sin_addr.s_addr = htonl (INADDR_ANY);
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
232 addr->sin_port = htons(s->local_port);
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
233 *addr_len = sizeof(struct sockaddr_in);
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
234
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
235 return fd;
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
236 }
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
237
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
238 static int udp_port(struct sockaddr_in *addr, int len)
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
239 {
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
240 return ntohs(addr->sin_port);
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
241 }
2162
f0b9505b7b8b Add some explanatory comments to #endif directives.
diego
parents: 2161
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
245 /**
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
246 * If no filename is given to av_open_input_file because you want to
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
247 * get the local port first, then you must call this function to set
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
248 * the remote server address.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
249 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
250 * url syntax: udp://host:port[?option=val...]
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 834
diff changeset
251 * option: 'multicast=1' : enable multicast
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
252 * 'ttl=n' : set the ttl value (for multicast only)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
253 * 'localport=n' : set the local port
62
56a6676125b4 variable UDP packet size patch by Max Krasnyansky
bellard
parents: 0
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
256 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
257 * @param s1 media file context
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
258 * @param uri of the remote server
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
259 * @return zero if no error.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
260 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
261 int udp_set_remote_url(URLContext *h, const char *uri)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
262 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
263 UDPContext *s = h->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
264 char hostname[256];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
265 int port;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 834
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
268
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
275 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
276 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
277
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
278 /**
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
279 * Return the local port used by the UDP connexion
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
280 * @param s1 media file context
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
281 * @return the local port number
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
282 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
283 int udp_get_local_port(URLContext *h)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
284 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
285 UDPContext *s = h->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
286 return s->local_port;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
287 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
288
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
289 /**
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
290 * Return the udp file handle for select() usage to wait for several RTP
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
291 * streams at the same time.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
292 * @param h media file context
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
293 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
294 int udp_get_file_handle(URLContext *h)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
295 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
296 UDPContext *s = h->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
297 return s->udp_fd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
298 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
299
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
300 /* put it in UDP context */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
301 /* return non zero if error */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
302 static int udp_open(URLContext *h, const char *uri, int flags)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
303 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
304 char hostname[1024];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
305 int port, udp_fd = -1, tmp;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
308 const char *p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
d174591c742b Remove the useless variable "my_addr1"
lucabe
parents: 2750
diff changeset
311 struct sockaddr_in my_addr;
2752
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
312 #else
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
313 struct sockaddr_storage my_addr;
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
314 #endif
683
095009fc2f35 kill warnings patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents: 644
diff changeset
315 int len;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
316
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
317 h->is_streamed = 1;
62
56a6676125b4 variable UDP packet size patch by Max Krasnyansky
bellard
parents: 0
diff changeset
318 h->max_packet_size = 1472;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
319
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
320 is_output = (flags & URL_WRONLY);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 834
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
325
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
326 h->priv_data = s;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
327 s->ttl = 16;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
328 p = strchr(uri, '?');
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
329 if (p) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
332 if (find_info_tag(buf, sizeof(buf), "ttl", p)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
333 s->ttl = strtol(buf, NULL, 10);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
334 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
335 if (find_info_tag(buf, sizeof(buf), "localport", p)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
336 s->local_port = strtol(buf, NULL, 10);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
337 }
62
56a6676125b4 variable UDP packet size patch by Max Krasnyansky
bellard
parents: 0
diff changeset
338 if (find_info_tag(buf, sizeof(buf), "pkt_size", p)) {
56a6676125b4 variable UDP packet size patch by Max Krasnyansky
bellard
parents: 0
diff changeset
339 h->max_packet_size = strtol(buf, NULL, 10);
56a6676125b4 variable UDP packet size patch by Max Krasnyansky
bellard
parents: 0
diff changeset
340 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
341 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
342
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 834
diff changeset
345
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
346 /* XXX: fix url_split */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
347 if (hostname[0] == '\0' || hostname[0] == '?') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
348 /* only accepts null hostname if input */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
349 if (s->is_multicast || (flags & URL_WRONLY))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
350 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
351 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
352 udp_set_remote_url(h, uri);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
353 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
360 udp_fd = udp_socket_create(s, &my_addr, &len);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
361 if (udp_fd < 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
362 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
368 /* the bind is needed to give a port to the socket now */
2752
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
369 if (bind(udp_fd,(struct sockaddr *)&my_addr, len) < 0)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
370 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
371
2751
d174591c742b Remove the useless variable "my_addr1"
lucabe
parents: 2750
diff changeset
372 len = sizeof(my_addr);
d174591c742b Remove the useless variable "my_addr1"
lucabe
parents: 2750
diff changeset
373 getsockname(udp_fd, (struct sockaddr *)&my_addr, &len);
2752
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
374 s->local_port = udp_port(&my_addr, len);
9f60c60d8d57 Remove some more duplicated code
lucabe
parents: 2751
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
387
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
388 if (is_output) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
389 /* limit the tx buf size to limit latency */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
390 tmp = UDP_TX_BUF_SIZE;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
391 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
392 av_log(NULL, AV_LOG_ERROR, "setsockopt(SO_SNDBUF): %s\n", strerror(errno));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
393 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
394 }
2391
2298213e3016 Set UDP receive buffer to 64k
ramiro
parents: 2351
diff changeset
395 } else {
2298213e3016 Set UDP receive buffer to 64k
ramiro
parents: 2351
diff changeset
396 /* 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
397 * avoid losing data on OSes that set this too low by default. */
2298213e3016 Set UDP receive buffer to 64k
ramiro
parents: 2351
diff changeset
398 tmp = UDP_MAX_PKT_SIZE;
2298213e3016 Set UDP receive buffer to 64k
ramiro
parents: 2351
diff changeset
399 setsockopt(udp_fd, SOL_SOCKET, SO_RCVBUF, &tmp, sizeof(tmp));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
400 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
401
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
402 s->udp_fd = udp_fd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
403 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
404 fail:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
405 if (udp_fd >= 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
406 closesocket(udp_fd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
409 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
410
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 62
diff changeset
411 static int udp_read(URLContext *h, uint8_t *buf, int size)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
412 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
413 UDPContext *s = h->priv_data;
1332
7474cc6383d4 fix some signedness warnings
mru
parents: 1124
diff changeset
414 int len;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
415
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
422 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
423 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
424 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
425 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
426 return len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
427 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
428
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 62
diff changeset
429 static int udp_write(URLContext *h, uint8_t *buf, int size)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
430 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
431 UDPContext *s = h->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
432 int ret;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
433
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
434 for(;;) {
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 834
diff changeset
435 ret = sendto (s->udp_fd, buf, size, 0,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
442 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
443 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
444 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
445 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
446 return size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
447 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
448
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
449 static int udp_close(URLContext *h)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
450 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
451 UDPContext *s = h->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
455 closesocket(s->udp_fd);
2351
b9a881c0967e Add initialization and cleanup functions for Winsock
ramiro
parents: 2274
diff changeset
456 ff_network_close();
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
457 av_free(s);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
458 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
459 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
460
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
461 URLProtocol udp_protocol = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
462 "udp",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
463 udp_open,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
464 udp_read,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
465 udp_write,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
466 NULL, /* seek */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
467 udp_close,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
468 };