Commit 5269cef4 authored by Vincent Bernat's avatar Vincent Bernat Committed by Michael Niedermayer

avformat/udp: Allow to specify DSCP class

By appending `?dscp=26` to the URL, IP packets will be classified as
AF31 (assured forwarding for multimedia flows with low probability of
loss). On congested network, this allows a user to assign priorities to
flows.
Signed-off-by: 's avatarVincent Bernat <vincent@bernat.im>
parent 970a8f1c
...@@ -556,7 +556,7 @@ static int parse_source_list(char *buf, char **sources, int *num_sources, ...@@ -556,7 +556,7 @@ static int parse_source_list(char *buf, char **sources, int *num_sources,
static int udp_open(URLContext *h, const char *uri, int flags) static int udp_open(URLContext *h, const char *uri, int flags)
{ {
char hostname[1024], localaddr[1024] = ""; char hostname[1024], localaddr[1024] = "";
int port, udp_fd = -1, tmp, bind_ret = -1; int port, udp_fd = -1, tmp, bind_ret = -1, dscp = -1;
UDPContext *s = h->priv_data; UDPContext *s = h->priv_data;
int is_output; int is_output;
const char *p; const char *p;
...@@ -612,6 +612,9 @@ static int udp_open(URLContext *h, const char *uri, int flags) ...@@ -612,6 +612,9 @@ static int udp_open(URLContext *h, const char *uri, int flags)
if (av_find_info_tag(buf, sizeof(buf), "connect", p)) { if (av_find_info_tag(buf, sizeof(buf), "connect", p)) {
s->is_connected = strtol(buf, NULL, 10); s->is_connected = strtol(buf, NULL, 10);
} }
if (av_find_info_tag(buf, sizeof(buf), "dscp", p)) {
dscp = strtol(buf, NULL, 10);
}
if (av_find_info_tag(buf, sizeof(buf), "fifo_size", p)) { if (av_find_info_tag(buf, sizeof(buf), "fifo_size", p)) {
s->circular_buffer_size = strtol(buf, NULL, 10); s->circular_buffer_size = strtol(buf, NULL, 10);
if (!HAVE_PTHREAD_CANCEL) if (!HAVE_PTHREAD_CANCEL)
...@@ -695,6 +698,12 @@ static int udp_open(URLContext *h, const char *uri, int flags) ...@@ -695,6 +698,12 @@ static int udp_open(URLContext *h, const char *uri, int flags)
av_log(h, AV_LOG_WARNING, "socket option UDPLITE_RECV_CSCOV not available"); av_log(h, AV_LOG_WARNING, "socket option UDPLITE_RECV_CSCOV not available");
} }
if (dscp >= 0) {
dscp <<= 2;
if (setsockopt (udp_fd, IPPROTO_IP, IP_TOS, &dscp, sizeof(dscp)) != 0)
goto fail;
}
/* If multicast, try binding the multicast address first, to avoid /* If multicast, try binding the multicast address first, to avoid
* receiving UDP packets from other sources aimed at the same UDP * receiving UDP packets from other sources aimed at the same UDP
* port. This fails on windows. This makes sending to the same address * port. This fails on windows. This makes sending to the same address
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment