Commit 91a13634 authored by Marton Balint's avatar Marton Balint

avformat/udp: add support for generic source filtering

This allows getting data only from a specific source IP. This is useful not
only for unicast but for multicast as well because multicast source
subscriptions do not act as source filters for the incoming packets.
Signed-off-by: 's avatarMarton Balint <cus@passwd.hu>
parent 9d4829f3
...@@ -1569,12 +1569,12 @@ For receiving, this gives the benefit of only receiving packets from ...@@ -1569,12 +1569,12 @@ For receiving, this gives the benefit of only receiving packets from
the specified peer address/port. the specified peer address/port.
@item sources=@var{address}[,@var{address}] @item sources=@var{address}[,@var{address}]
Only receive packets sent to the multicast group from one of the Only receive packets sent from the specified addresses. In case of multicast,
specified sender IP addresses. also subscribe to multicast traffic coming from these addresses only.
@item block=@var{address}[,@var{address}] @item block=@var{address}[,@var{address}]
Ignore packets sent to the multicast group from the specified Ignore packets sent from the specified addresses. In case of multicast, also
sender IP addresses. exclude the source addresses in the multicast subscription.
@item fifo_size=@var{units} @item fifo_size=@var{units}
Set the UDP receiving circular buffer size, expressed as a number of Set the UDP receiving circular buffer size, expressed as a number of
......
...@@ -458,13 +458,15 @@ static void *circular_buffer_task_rx( void *_URLContext) ...@@ -458,13 +458,15 @@ static void *circular_buffer_task_rx( void *_URLContext)
} }
while(1) { while(1) {
int len; int len;
struct sockaddr_storage addr;
socklen_t addr_len = sizeof(addr);
pthread_mutex_unlock(&s->mutex); pthread_mutex_unlock(&s->mutex);
/* Blocking operations are always cancellation points; /* Blocking operations are always cancellation points;
see "General Information" / "Thread Cancelation Overview" see "General Information" / "Thread Cancelation Overview"
in Single Unix. */ in Single Unix. */
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &old_cancelstate); pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &old_cancelstate);
len = recv(s->udp_fd, s->tmp+4, sizeof(s->tmp)-4, 0); len = recvfrom(s->udp_fd, s->tmp+4, sizeof(s->tmp)-4, 0, (struct sockaddr *)&addr, &addr_len);
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_cancelstate); pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old_cancelstate);
pthread_mutex_lock(&s->mutex); pthread_mutex_lock(&s->mutex);
if (len < 0) { if (len < 0) {
...@@ -474,6 +476,8 @@ static void *circular_buffer_task_rx( void *_URLContext) ...@@ -474,6 +476,8 @@ static void *circular_buffer_task_rx( void *_URLContext)
} }
continue; continue;
} }
if (ff_ip_check_source_lists(&addr, &s->filters))
continue;
AV_WL32(s->tmp, len); AV_WL32(s->tmp, len);
if(av_fifo_space(s->fifo) < len + 4) { if(av_fifo_space(s->fifo) < len + 4) {
...@@ -926,6 +930,8 @@ static int udp_read(URLContext *h, uint8_t *buf, int size) ...@@ -926,6 +930,8 @@ static int udp_read(URLContext *h, uint8_t *buf, int size)
{ {
UDPContext *s = h->priv_data; UDPContext *s = h->priv_data;
int ret; int ret;
struct sockaddr_storage addr;
socklen_t addr_len = sizeof(addr);
#if HAVE_PTHREAD_CANCEL #if HAVE_PTHREAD_CANCEL
int avail, nonblock = h->flags & AVIO_FLAG_NONBLOCK; int avail, nonblock = h->flags & AVIO_FLAG_NONBLOCK;
...@@ -976,9 +982,12 @@ static int udp_read(URLContext *h, uint8_t *buf, int size) ...@@ -976,9 +982,12 @@ static int udp_read(URLContext *h, uint8_t *buf, int size)
if (ret < 0) if (ret < 0)
return ret; return ret;
} }
ret = recv(s->udp_fd, buf, size, 0); ret = recvfrom(s->udp_fd, buf, size, 0, (struct sockaddr *)&addr, &addr_len);
if (ret < 0)
return ret < 0 ? ff_neterrno() : ret; return ff_neterrno();
if (ff_ip_check_source_lists(&addr, &s->filters))
return AVERROR(EINTR);
return ret;
} }
static int udp_write(URLContext *h, const uint8_t *buf, int size) static int udp_write(URLContext *h, const uint8_t *buf, int size)
......
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