aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2012-01-21 23:28:11 +0200
committerMartin Storsjö <martin@martin.st>2012-01-22 01:10:02 +0200
commitdbb06b8c0d7020d4a95ef8b2831aa58ec00145c7 (patch)
treef0dd57ddf71d5edffa7250f2cc0eba4a57ebf151
parentbc495bad3d8cbae71c82142906f7d36baf25a848 (diff)
downloadffmpeg-dbb06b8c0d7020d4a95ef8b2831aa58ec00145c7.tar.gz
rtsp: Allow specifying the UDP port range via AVOptions
Signed-off-by: Martin Storsjö <martin@martin.st>
-rw-r--r--libavformat/rtsp.c13
-rw-r--r--libavformat/rtsp.h5
2 files changed, 16 insertions, 2 deletions
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index 77aeb63a5a..0e56d37a1f 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -81,6 +81,8 @@ const AVOption ff_rtsp_options[] = {
{ "http", "HTTP tunneling", 0, AV_OPT_TYPE_CONST, {(1 << RTSP_LOWER_TRANSPORT_HTTP)}, 0, 0, DEC, "rtsp_transport" },
RTSP_FLAG_OPTS("rtsp_flags", "RTSP flags"),
RTSP_MEDIATYPE_OPTS("allowed_media_types", "Media types to accept from the server"),
+ { "min_port", "Minimum local UDP port", OFFSET(rtp_port_min), AV_OPT_TYPE_INT, {RTSP_RTP_PORT_MIN}, 0, 65535, DEC|ENC },
+ { "max_port", "Maximum local UDP port", OFFSET(rtp_port_max), AV_OPT_TYPE_INT, {RTSP_RTP_PORT_MAX}, 0, 65535, DEC|ENC },
{ NULL },
};
@@ -1121,7 +1123,7 @@ int ff_rtsp_make_setup_request(AVFormatContext *s, const char *host, int port,
/* XXX: we assume the same server is used for the control of each
* RTSP stream */
- for (j = RTSP_RTP_PORT_MIN, i = 0; i < rt->nb_rtsp_streams; ++i) {
+ for (j = rt->rtp_port_min, i = 0; i < rt->nb_rtsp_streams; ++i) {
char transport[2048];
/*
@@ -1158,7 +1160,7 @@ int ff_rtsp_make_setup_request(AVFormatContext *s, const char *host, int port,
}
/* first try in specified port range */
- while (j <= RTSP_RTP_PORT_MAX) {
+ while (j <= rt->rtp_port_max) {
ff_url_join(buf, sizeof(buf), "rtp", NULL, host, -1,
"?localport=%d", j);
/* we will use two ports per rtp stream (rtp and rtcp) */
@@ -1356,6 +1358,13 @@ int ff_rtsp_connect(AVFormatContext *s)
struct sockaddr_storage peer;
socklen_t peer_len = sizeof(peer);
+ if (rt->rtp_port_max < rt->rtp_port_min) {
+ av_log(s, AV_LOG_ERROR, "Invalid UDP port range, max port %d less "
+ "than min port %d\n", rt->rtp_port_max,
+ rt->rtp_port_min);
+ return AVERROR(EINVAL);
+ }
+
if (!ff_network_init())
return AVERROR(EIO);
diff --git a/libavformat/rtsp.h b/libavformat/rtsp.h
index 9d05289a91..6872a51a24 100644
--- a/libavformat/rtsp.h
+++ b/libavformat/rtsp.h
@@ -359,6 +359,11 @@ typedef struct RTSPState {
* Mask of all requested media types
*/
int media_type_mask;
+
+ /**
+ * Minimum and maximum local UDP ports.
+ */
+ int rtp_port_min, rtp_port_max;
} RTSPState;
#define RTSP_FLAG_FILTER_SRC 0x1 /**< Filter incoming UDP packets -