mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-02-17 12:27:18 +00:00
udp: Allow specifying the connect option in udp_set_remote_url, too
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/trunk
This commit is contained in:
parent
babd19ce2e
commit
21a569f302
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user