If the remote address is updated later with this function, the caller shouldn't set the connect option until in this call. Originally committed as revision 26245 to svn://svn.ffmpeg.org/ffmpeg/trunktags/n0.8
| @@ -415,9 +415,13 @@ set the time to live value (for multicast only) | |||||
| @item connect=@var{1|0} | @item connect=@var{1|0} | ||||
| Initialize the UDP socket with @code{connect()}. In this case, the | Initialize the UDP socket with @code{connect()}. In this case, the | ||||
| destination address can't be changed with udp_set_remote_url later. | destination address can't be changed with udp_set_remote_url later. | ||||
| If the destination address isn't known at the start, this option can | |||||
| be specified in udp_set_remote_url, too. | |||||
| This allows finding out the source address for the packets with getsockname, | This allows finding out the source address for the packets with getsockname, | ||||
| and makes writes return with AVERROR(ECONNREFUSED) if "destination | and makes writes return with AVERROR(ECONNREFUSED) if "destination | ||||
| unreachable" is received. | unreachable" is received. | ||||
| For receiving, this gives the benefit of only receiving packets from | |||||
| the specified peer address/port. | |||||
| @end table | @end table | ||||
| Some usage examples of the udp protocol with @file{ffmpeg} follow. | Some usage examples of the udp protocol with @file{ffmpeg} follow. | ||||
| @@ -245,8 +245,9 @@ static int udp_port(struct sockaddr_storage *addr, int addr_len) | |||||
| int udp_set_remote_url(URLContext *h, const char *uri) | int udp_set_remote_url(URLContext *h, const char *uri) | ||||
| { | { | ||||
| UDPContext *s = h->priv_data; | UDPContext *s = h->priv_data; | ||||
| char hostname[256]; | |||||
| char hostname[256], buf[10]; | |||||
| int port; | int port; | ||||
| const char *p; | |||||
| av_url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &port, NULL, 0, uri); | av_url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &port, NULL, 0, uri); | ||||
| @@ -256,6 +257,21 @@ int udp_set_remote_url(URLContext *h, const char *uri) | |||||
| return AVERROR(EIO); | return AVERROR(EIO); | ||||
| } | } | ||||
| s->is_multicast = ff_is_multicast_address((struct sockaddr*) &s->dest_addr); | s->is_multicast = ff_is_multicast_address((struct sockaddr*) &s->dest_addr); | ||||
| p = strchr(uri, '?'); | |||||
| if (p) { | |||||
| if (find_info_tag(buf, sizeof(buf), "connect", p)) { | |||||
| int was_connected = s->is_connected; | |||||
| s->is_connected = strtol(buf, NULL, 10); | |||||
| if (s->is_connected && !was_connected) { | |||||
| if (connect(s->udp_fd, (struct sockaddr *) &s->dest_addr, | |||||
| s->dest_addr_len)) { | |||||
| s->is_connected = 0; | |||||
| av_log(NULL, AV_LOG_ERROR, "connect: %s\n", strerror(errno)); | |||||
| return AVERROR(EIO); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| return 0; | return 0; | ||||
| } | } | ||||