[FFmpeg-devel] [PATCH] libavformat/prompeg.c: Add parameters to control FEC ports.
Romain Beauxis
romain.beauxis at gmail.com
Fri Dec 13 17:42:20 EET 2024
This patch adds parameters to pick specific ports for the two FEC error-
correction streams associated with a Pro-MPEG CoP #3-R2 FEC streams.
Radio France is currently interested in using this technology to do
error-correction on some of their stream. In this context, they may not
have full control over their available UDP ports and would like to be able to
pick any two ports for these streams.
The specifications for this protocol is available online: https://www.yumpu.com/en/document/read/8808550/pro-mpeg-code-of-practice-3-release-2-pro-mpeg-forum
In section 5.2, page 14, port assignments for the FEC streams are under
"shall" thus the changes in this patch should still be valid w.r.t. the
specs.
---
doc/protocols.texi | 8 +++++++-
libavformat/prompeg.c | 8 ++++++--
2 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/doc/protocols.texi b/doc/protocols.texi
index ed70af4b33..3e14b732c6 100644
--- a/doc/protocols.texi
+++ b/doc/protocols.texi
@@ -796,7 +796,7 @@ The required syntax is:
-f rtp_mpegts -fec prompeg=@var{option}=@var{val}... rtp://@var{hostname}:@var{port}
@end example
-The destination UDP ports are @code{port + 2} for the column FEC stream
+The default destination UDP ports are @code{port + 2} for the column FEC stream
and @code{port + 4} for the row FEC stream.
This protocol accepts the following options:
@@ -808,6 +808,12 @@ The number of columns (4-20, LxD <= 100)
@item d=@var{n}
The number of rows (4-20, LxD <= 100)
+ at item column_port_offset=@var{n}
+Port offset, relative to the main stream port, for the column stream
+
+ at item row_port_offset=@var{n}
+Port offset, relative to the main stream port, for the row stream
+
@end table
Example usage:
diff --git a/libavformat/prompeg.c b/libavformat/prompeg.c
index 322eb6560a..398638c66d 100644
--- a/libavformat/prompeg.c
+++ b/libavformat/prompeg.c
@@ -103,6 +103,8 @@ typedef struct PrompegContext {
URLContext *fec_col_hd, *fec_row_hd;
PrompegFec **fec_arr, **fec_col_tmp, **fec_col, *fec_row;
int ttl;
+ int column_port_offset;
+ int row_port_offset;
uint8_t l, d;
uint8_t *rtp_buf;
uint16_t rtp_col_sn, rtp_row_sn;
@@ -123,6 +125,8 @@ static const AVOption options[] = {
{ "ttl", "Time to live (in milliseconds, multicast only)", OFFSET(ttl), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, .flags = E },
{ "l", "FEC L", OFFSET(l), AV_OPT_TYPE_INT, { .i64 = 5 }, 4, 20, .flags = E },
{ "d", "FEC D", OFFSET(d), AV_OPT_TYPE_INT, { .i64 = 5 }, 4, 20, .flags = E },
+ { "column_port_offset", "Port offset, relative to the main stream port, for the column stream", OFFSET(column_port_offset), AV_OPT_TYPE_INT, { .i64 = 2 }, -INT_MAX, INT_MAX, .flags = E },
+ { "row_port_offset", "Port offset, relative to the main stream port, for the row stream", OFFSET(row_port_offset), AV_OPT_TYPE_INT, { .i64 = 4 }, -INT_MAX, INT_MAX, .flags = E },
{ NULL }
};
@@ -293,11 +297,11 @@ static int prompeg_open(URLContext *h, const char *uri, int flags) {
av_dict_set_int(&udp_opts, "ttl", s->ttl, 0);
}
- ff_url_join(buf, sizeof (buf), "udp", NULL, hostname, rtp_port + 2, NULL);
+ ff_url_join(buf, sizeof (buf), "udp", NULL, hostname, rtp_port + s->column_port_offset, NULL);
if (ffurl_open_whitelist(&s->fec_col_hd, buf, flags, &h->interrupt_callback,
&udp_opts, h->protocol_whitelist, h->protocol_blacklist, h) < 0)
goto fail;
- ff_url_join(buf, sizeof (buf), "udp", NULL, hostname, rtp_port + 4, NULL);
+ ff_url_join(buf, sizeof (buf), "udp", NULL, hostname, rtp_port + s->row_port_offset, NULL);
if (ffurl_open_whitelist(&s->fec_row_hd, buf, flags, &h->interrupt_callback,
&udp_opts, h->protocol_whitelist, h->protocol_blacklist, h) < 0)
goto fail;
--
2.39.3 (Apple Git-146)
More information about the ffmpeg-devel
mailing list