1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-10-06 05:47:18 +02:00

avformat/udp: use ff_parse_opts_from_query_string() to set URL parameters

Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
Marton Balint
2025-08-25 01:51:15 +02:00
parent 2d06ed9308
commit 7e58fff9d0
2 changed files with 19 additions and 81 deletions

View File

@@ -2114,7 +2114,12 @@ The required syntax for an UDP URL is:
udp://@var{hostname}:@var{port}[?@var{options}] udp://@var{hostname}:@var{port}[?@var{options}]
@end example @end example
@var{options} contains a list of &-separated options of the form @var{key}=@var{val}. @var{options} contains a list of &-separated options of the form
@var{key}=@var{val}. Standard percent-encoding (and using the plus sign for
space) can be used to escape keys and values.
Options can also can be specified via command line options (or in code via
@code{AVOption}s).
In case threading is enabled on the system, a circular buffer is used In case threading is enabled on the system, a circular buffer is used
to store the incoming data, which allows one to reduce loss of data due to to store the incoming data, which allows one to reduce loss of data due to

View File

@@ -36,6 +36,7 @@
#include "libavutil/opt.h" #include "libavutil/opt.h"
#include "libavutil/log.h" #include "libavutil/log.h"
#include "libavutil/time.h" #include "libavutil/time.h"
#include "internal.h"
#include "network.h" #include "network.h"
#include "os_support.h" #include "os_support.h"
#include "url.h" #include "url.h"
@@ -695,7 +696,6 @@ static int udp_open(URLContext *h, const char *uri, int flags)
UDPContext *s = h->priv_data; UDPContext *s = h->priv_data;
int is_output; int is_output;
const char *p; const char *p;
char buf[256];
struct sockaddr_storage my_addr; struct sockaddr_storage my_addr;
socklen_t len; socklen_t len;
int ret; int ret;
@@ -706,87 +706,11 @@ static int udp_open(URLContext *h, const char *uri, int flags)
if (s->buffer_size < 0) if (s->buffer_size < 0)
s->buffer_size = is_output ? UDP_TX_BUF_SIZE : UDP_RX_BUF_SIZE; s->buffer_size = is_output ? UDP_TX_BUF_SIZE : UDP_RX_BUF_SIZE;
if (s->sources) {
if ((ret = ff_ip_parse_sources(h, s->sources, &s->filters)) < 0)
goto fail;
}
if (s->block) {
if ((ret = ff_ip_parse_blocks(h, s->block, &s->filters)) < 0)
goto fail;
}
p = strchr(uri, '?'); p = strchr(uri, '?');
if (p) { if (p) {
if (av_find_info_tag(buf, sizeof(buf), "reuse", p)) { ret = ff_parse_opts_from_query_string(s, p, 1);
char *endptr = NULL; if (ret < 0)
s->reuse_socket = strtol(buf, &endptr, 10); goto fail;
/* assume if no digits were found it is a request to enable it */
if (buf == endptr)
s->reuse_socket = 1;
}
if (av_find_info_tag(buf, sizeof(buf), "overrun_nonfatal", p)) {
char *endptr = NULL;
s->overrun_nonfatal = strtol(buf, &endptr, 10);
/* assume if no digits were found it is a request to enable it */
if (buf == endptr)
s->overrun_nonfatal = 1;
}
if (av_find_info_tag(buf, sizeof(buf), "ttl", p)) {
s->ttl = strtol(buf, NULL, 10);
if (s->ttl < 0 || s->ttl > 255) {
av_log(h, AV_LOG_ERROR, "ttl(%d) should be in range [0,255]\n", s->ttl);
ret = AVERROR(EINVAL);
goto fail;
}
}
if (av_find_info_tag(buf, sizeof(buf), "udplite_coverage", p)) {
s->udplite_coverage = strtol(buf, NULL, 10);
}
if (av_find_info_tag(buf, sizeof(buf), "localport", p)) {
s->local_port = strtol(buf, NULL, 10);
}
if (av_find_info_tag(buf, sizeof(buf), "pkt_size", p)) {
s->pkt_size = strtol(buf, NULL, 10);
}
if (av_find_info_tag(buf, sizeof(buf), "buffer_size", p)) {
s->buffer_size = strtol(buf, NULL, 10);
}
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)) {
s->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 (av_find_info_tag(buf, sizeof(buf), "bitrate", p)) {
s->bitrate = strtoll(buf, NULL, 10);
}
if (av_find_info_tag(buf, sizeof(buf), "burst_bits", p)) {
s->burst_bits = strtoll(buf, NULL, 10);
}
if (av_find_info_tag(buf, sizeof(buf), "localaddr", p)) {
av_freep(&s->localaddr);
s->localaddr = av_strdup(buf);
if (!s->localaddr) {
ret = AVERROR(ENOMEM);
goto fail;
}
}
if (av_find_info_tag(buf, sizeof(buf), "sources", p)) {
if ((ret = ff_ip_parse_sources(h, buf, &s->filters)) < 0)
goto fail;
}
if (av_find_info_tag(buf, sizeof(buf), "block", p)) {
if ((ret = ff_ip_parse_blocks(h, buf, &s->filters)) < 0)
goto fail;
}
if (!is_output && av_find_info_tag(buf, sizeof(buf), "timeout", p))
s->timeout = strtol(buf, NULL, 10);
if (is_output && av_find_info_tag(buf, sizeof(buf), "broadcast", p))
s->is_broadcast = strtol(buf, NULL, 10);
} }
if (!HAVE_PTHREAD_CANCEL) { if (!HAVE_PTHREAD_CANCEL) {
int64_t optvals[] = {s->overrun_nonfatal, s->bitrate, s->circular_buffer_size}; int64_t optvals[] = {s->overrun_nonfatal, s->bitrate, s->circular_buffer_size};
@@ -798,6 +722,15 @@ static int udp_open(URLContext *h, const char *uri, int flags)
"on this build (pthread support is required)\n", optnames[i]); "on this build (pthread support is required)\n", optnames[i]);
} }
} }
if (s->sources) {
if ((ret = ff_ip_parse_sources(h, s->sources, &s->filters)) < 0)
goto fail;
}
if (s->block) {
if ((ret = ff_ip_parse_blocks(h, s->block, &s->filters)) < 0)
goto fail;
}
/* handling needed to support options picking from both AVOption and URL */ /* handling needed to support options picking from both AVOption and URL */
s->circular_buffer_size *= 188; s->circular_buffer_size *= 188;
if (flags & AVIO_FLAG_WRITE) { if (flags & AVIO_FLAG_WRITE) {