Re: [FFmpeg-devel] [PATCH v1] avformat/sdp, rtsp: add rtcp attribute to sdp file

2020-02-02 Thread Carl Eugen Hoyos


> Am 02.02.2020 um 04:48 schrieb Jun Li :
> 
> 1. write rtcpport to sdp file when rtpport is specified in url
> 2. apply rtcpport when sdp file contains rtcp attribute


Please split in two self-contained patches.

Thank you, Carl Eugen
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

[FFmpeg-devel] [PATCH v1] avformat/sdp, rtsp: add rtcp attribute to sdp file

2020-02-01 Thread Jun Li
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 
---
 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(-)

diff --git a/libavformat/rtpproto.c b/libavformat/rtpproto.c
index 1f0a82ac7e..81a39cc3de 100644
--- a/libavformat/rtpproto.c
+++ b/libavformat/rtpproto.c
@@ -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
diff --git a/libavformat/rtpproto.h b/libavformat/rtpproto.h
index 131aac5f3c..d42327ea5c 100644
--- a/libavformat/rtpproto.h
+++ b/libavformat/rtpproto.h
@@ -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 */
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index cd6fc32a29..c892f21142 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -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:", ) && s->nb_streams > 0) {
+rtsp_st = rt->rtsp_streams[rt->nb_rtsp_streams - 1];
+get_word(buf1, sizeof(buf1), );
+rtsp_st->rtcp_port = strtol(buf1, NULL, 10);
 } else if (av_strstart(p, "fmtp:", ) ||
av_strstart(p, "framesize:", )) {
 // 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*) _st->sdp_ip,
   sizeof(rtsp_st->sdp_ip),
@@ -2377,10 +2382,13 @@ static int sdp_read_header(AVFormatContext *s)
 av_dict_free();
 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=%d=%d_to_source=%d",
-rtsp_st->sdp_port, rtsp_st->sdp_ttl,
+
"?localport=%d=%d=%d=%d_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);
 
diff --git a/libavformat/rtsp.h b/libavformat/rtsp.h
index 54a9a30c16..15747fe6d1 100644
--- a/libavformat/rtsp.h
+++ b/libavformat/rtsp.h
@@ -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) */
diff --git a/libavformat/sdp.c b/libavformat/sdp.c
index 34e9839b67..c3c2909090 100644
--- a/libavformat/sdp.c
+++ b/libavformat/sdp.c
@@ -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);
+