@@ -524,6 +524,17 @@ int ff_rtp_get_local_rtp_port(URLContext *h)
return ff_udp_get_local_port(s->rtp_hd);
}
+/**
+ * Return the remote rtcp port used by the RTP connection
+ * @param h media file context
+ * @return the remote port number
+ */
+int ff_rtp_get_remote_rtcp_port(URLContext *h)
+{
+ RTPContext *s = h->priv_data;
+ return s->rtcp_port;
+}
+
/**
* Return the local rtcp port used by the RTP connection
* @param h media file context
@@ -27,4 +27,6 @@ int ff_rtp_set_remote_url(URLContext *h, const char *uri);
int ff_rtp_get_local_rtp_port(URLContext *h);
+int ff_rtp_get_remote_rtcp_port(URLContext *h);
+
#endif /* AVFORMAT_RTPPROTO_H */
@@ -577,6 +577,10 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1,
if (s1->seen_fmtp) {
parse_fmtp(s, rt, payload_type, s1->delayed_fmtp);
}
+ } else if (av_strstart(p, "rtcp:", &p) && s->nb_streams > 0) {
+ rtsp_st = rt->rtsp_streams[rt->nb_rtsp_streams - 1];
+ get_word(buf1, sizeof(buf1), &p);
+ rtsp_st->rtcp_port = strtol(buf1, NULL, 10);
} else if (av_strstart(p, "fmtp:", &p) ||
av_strstart(p, "framesize:", &p)) {
// let dynamic protocol handlers have a stab at the line.
@@ -2367,6 +2371,7 @@ static int sdp_read_header(AVFormatContext *s)
if (!(rt->rtsp_flags & RTSP_FLAG_CUSTOM_IO)) {
AVDictionary *opts = map_to_opts(rt);
+ int rtcp_port = rtsp_st->rtcp_port;
err = getnameinfo((struct sockaddr*) &rtsp_st->sdp_ip,
sizeof(rtsp_st->sdp_ip),
@@ -2377,10 +2382,13 @@ static int sdp_read_header(AVFormatContext *s)
av_dict_free(&opts);
goto fail;
}
+
+ if (rtcp_port <= 0)
+ rtcp_port = rtsp_st->sdp_port + 1;
ff_url_join(url, sizeof(url), "rtp", NULL,
namebuf, rtsp_st->sdp_port,
- "?localport=%d&ttl=%d&connect=%d&write_to_source=%d",
- rtsp_st->sdp_port, rtsp_st->sdp_ttl,
+ "?localport=%d&localrtcpport=%d&ttl=%d&connect=%d&write_to_source=%d",
+ rtsp_st->sdp_port, rtcp_port, rtsp_st->sdp_ttl,
rt->rtsp_flags & RTSP_FLAG_FILTER_SRC ? 1 : 0,
rt->rtsp_flags & RTSP_FLAG_RTCP_TO_SOURCE ? 1 : 0);
@@ -448,6 +448,7 @@ typedef struct RTSPStream {
/** The following are used only in SDP, not RTSP */
//@{
int sdp_port; /**< port (from SDP content) */
+ int rtcp_port; /**< rtcp port (from SDP content) */
struct sockaddr_storage sdp_ip; /**< IP address (from SDP content) */
int nb_include_source_addrs; /**< Number of source-specific multicast include source IP addresses (from SDP content) */
struct RTSPSource **include_source_addrs; /**< Source-specific multicast include source IP addresses (from SDP content) */
@@ -26,11 +26,13 @@
#include "libavutil/opt.h"
#include "libavcodec/xiph.h"
#include "libavcodec/mpeg4audio.h"
+#include "avio_internal.h"
#include "avformat.h"
#include "internal.h"
#include "avc.h"
#include "hevc.h"
#include "rtp.h"
+#include "rtpproto.h"
#if CONFIG_NETWORK
#include "network.h"
#endif
@@ -480,10 +482,16 @@ static char *latm_context2config(AVFormatContext *s, AVCodecParameters *par)
return config;
}
-static char *sdp_write_media_attributes(char *buff, int size, AVStream *st, int payload_type, AVFormatContext *fmt)
+static char *sdp_write_media_attributes(char *buff, int size, AVStream *st, int payload_type, AVFormatContext *fmt, int port)
{
char *config = NULL;
AVCodecParameters *p = st->codecpar;
+ URLContext* url_ctx = ffio_geturlcontext(fmt->pb);
+ if (url_ctx) {
+ int rtcp_port = ff_rtp_get_remote_rtcp_port(url_ctx);
+ if (rtcp_port > 0 && rtcp_port != port+1)
+ av_strlcatf(buff, size, "a=rtcp:%d\r\n", rtcp_port);
+ }
switch (p->codec_id) {
case AV_CODEC_ID_DIRAC:
@@ -766,7 +774,7 @@ void ff_sdp_write_media(char *buff, int size, AVStream *st, int idx,
av_strlcatf(buff, size, "b=AS:%"PRId64"\r\n", p->bit_rate / 1000);
}
- sdp_write_media_attributes(buff, size, st, payload_type, fmt);
+ sdp_write_media_attributes(buff, size, st, payload_type, fmt, port);
}
int av_sdp_create(AVFormatContext *ac[], int n_files, char *buf, int size)
Fix #8479 1. write rtcpport to sdp file when rtpport is specified in url 2. apply rtcpport when sdp file contains rtcp attribute Signed-off-by: Jun Li <junli1026@gmail.com> --- libavformat/rtpproto.c | 11 +++++++++++ libavformat/rtpproto.h | 2 ++ libavformat/rtsp.c | 12 ++++++++++-- libavformat/rtsp.h | 1 + libavformat/sdp.c | 12 ++++++++++-- 5 files changed, 34 insertions(+), 4 deletions(-)