aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/udp.c
diff options
context:
space:
mode:
authorVincent Bernat <vincent@bernat.im>2014-05-23 15:26:32 +0200
committerMichael Niedermayer <michaelni@gmx.at>2014-11-27 19:53:09 +0100
commit5269cef4087f3e46e734eb5dfc38085e630514d9 (patch)
tree30dd5c8d1f1c0ad2f308a1d867e431bd27cfe172 /libavformat/udp.c
parent970a8f1c256f08d2f6414d573a54f2fa035c8e7a (diff)
downloadffmpeg-5269cef4087f3e46e734eb5dfc38085e630514d9.tar.gz
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: Vincent Bernat <vincent@bernat.im>
Diffstat (limited to 'libavformat/udp.c')
-rw-r--r--libavformat/udp.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/libavformat/udp.c b/libavformat/udp.c
index 828b741782..91c7910a95 100644
--- a/libavformat/udp.c
+++ b/libavformat/udp.c
@@ -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)
{
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;
int is_output;
const char *p;
@@ -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)) {
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)) {
s->circular_buffer_size = strtol(buf, NULL, 10);
if (!HAVE_PTHREAD_CANCEL)
@@ -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");
}
+ 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
* receiving UDP packets from other sources aimed at the same UDP
* port. This fails on windows. This makes sending to the same address