And forward it to rtp and udp.
Signed-off-by: Luca Barbato <[email protected]>
---
libavformat/rtsp.c | 32 +++++++++++++++++++++++++-------
libavformat/rtsp.h | 1 +
libavformat/rtspdec.c | 6 +++++-
3 files changed, 31 insertions(+), 8 deletions(-)
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index 55a7896..0197ad9 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -72,8 +72,10 @@
{ "audio", "Audio", 0, AV_OPT_TYPE_CONST, {.i64 = 1 << AVMEDIA_TYPE_AUDIO}, 0, 0,
DEC, "allowed_media_types" }, \
{ "data", "Data", 0, AV_OPT_TYPE_CONST, {.i64 = 1 << AVMEDIA_TYPE_DATA}, 0, 0, DEC,
"allowed_media_types" }
-#define RTSP_REORDERING_OPTS() \
- { "reorder_queue_size", "Number of packets to buffer for handling of reordered
packets", OFFSET(reordering_queue_size), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, DEC }
+#define COMMON_OPTS() \
+ { "reorder_queue_size", "Number of packets to buffer for handling of reordered
packets", OFFSET(reordering_queue_size), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, DEC }, \
+ { "buffer_size", "Underlying protocol send/receive buffer size",
OFFSET(buffer_size), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, DEC|ENC }
\
+
const AVOption ff_rtsp_options[] = {
{ "initial_pause", "Don't start playing the stream immediately",
OFFSET(initial_pause), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, DEC },
@@ -89,7 +91,7 @@ const AVOption ff_rtsp_options[] = {
{ "min_port", "Minimum local UDP port", OFFSET(rtp_port_min),
AV_OPT_TYPE_INT, {.i64 = RTSP_RTP_PORT_MIN}, 0, 65535, DEC|ENC },
{ "max_port", "Maximum local UDP port", OFFSET(rtp_port_max),
AV_OPT_TYPE_INT, {.i64 = RTSP_RTP_PORT_MAX}, 0, 65535, DEC|ENC },
{ "timeout", "Maximum timeout (in seconds) to wait for incoming connections. -1
is infinite. Implies flag listen", OFFSET(initial_timeout), AV_OPT_TYPE_INT, {.i64 = -1},
INT_MIN, INT_MAX, DEC },
- RTSP_REORDERING_OPTS(),
+ COMMON_OPTS(),
{ NULL },
};
@@ -98,16 +100,28 @@ static const AVOption sdp_options[] = {
{ "custom_io", "Use custom IO", 0, AV_OPT_TYPE_CONST, {.i64 = RTSP_FLAG_CUSTOM_IO},
0, 0, DEC, "rtsp_flags" },
{ "rtcp_to_source", "Send RTCP packets to the source address of received packets", 0,
AV_OPT_TYPE_CONST, {.i64 = RTSP_FLAG_RTCP_TO_SOURCE}, 0, 0, DEC, "rtsp_flags" },
RTSP_MEDIATYPE_OPTS("allowed_media_types", "Media types to accept from the
server"),
- RTSP_REORDERING_OPTS(),
+ COMMON_OPTS(),
{ NULL },
};
static const AVOption rtp_options[] = {
RTSP_FLAG_OPTS("rtp_flags", "RTP flags"),
- RTSP_REORDERING_OPTS(),
+ COMMON_OPTS(),
{ NULL },
};
+
+static AVDictionary *map_to_opts(RTSPState *rt)
+{
+ AVDictionary *opts = NULL;
+ char buf[256];
+
+ snprintf(buf, sizeof(buf), "%d", rt->buffer_size);
+ av_dict_set(&opts, "buffer_size", buf, 0);
+
+ return opts;
+}
+
static void get_word_until_chars(char *buf, int buf_size,
const char *sep, const char **pp)
{
@@ -1433,12 +1447,14 @@ int ff_rtsp_make_setup_request(AVFormatContext *s,
const char *host, int port,
/* first try in specified port range */
while (j <= rt->rtp_port_max) {
+ AVDictionary *opts = map_to_opts(rt);
+
ff_url_join(buf, sizeof(buf), "rtp", NULL, host, -1,
"?localport=%d", j);
/* we will use two ports per rtp stream (rtp and rtcp) */
j += 2;
if (!ffurl_open(&rtsp_st->rtp_handle, buf, AVIO_FLAG_READ_WRITE,
- &s->interrupt_callback, NULL))
+ &s->interrupt_callback, &opts))
goto rtp_opened;
}