diff mbox series

[FFmpeg-devel,v1,2/2] avformat/rtpproto, sdp: write rtcp port to sdp file

Message ID 20200204003407.3545-2-junli1026@gmail.com
State New
Headers show
Series [FFmpeg-devel,v1,1/2] avformat/rtsp: apply rtcp attribute from sdp file | expand

Checks

Context Check Description
andriy/ffmpeg-patchwork success Make fate finished

Commit Message

Jun Li Feb. 4, 2020, 12:34 a.m. UTC
Fix #8474
Write rtcp port attribute to sdp file when necessary.

Signed-off-by: Jun Li <junli1026@gmail.com>
---
 libavformat/rtpproto.c | 11 +++++++++++
 libavformat/rtpproto.h |  2 ++
 libavformat/sdp.c      | 12 ++++++++++--
 3 files changed, 23 insertions(+), 2 deletions(-)

Comments

Jun Li Feb. 9, 2020, 11:01 p.m. UTC | #1
On Mon, Feb 3, 2020 at 4:34 PM Jun Li <junli1026@gmail.com> wrote:

> Fix #8474
> Write rtcp port attribute to sdp file when necessary.
>
> Signed-off-by: Jun Li <junli1026@gmail.com>
> ---
>  libavformat/rtpproto.c | 11 +++++++++++
>  libavformat/rtpproto.h |  2 ++
>  libavformat/sdp.c      | 12 ++++++++++--
>  3 files changed, 23 insertions(+), 2 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/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);
> +        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)
> --
> 2.17.1
>
>
Ping
Jun Li Feb. 20, 2020, 7:03 p.m. UTC | #2
On Sun, Feb 9, 2020 at 3:01 PM Jun Li <junli1026@gmail.com> wrote:

>
>
> On Mon, Feb 3, 2020 at 4:34 PM Jun Li <junli1026@gmail.com> wrote:
>
>> Fix #8474
>> Write rtcp port attribute to sdp file when necessary.
>>
>> Signed-off-by: Jun Li <junli1026@gmail.com>
>> ---
>>  libavformat/rtpproto.c | 11 +++++++++++
>>  libavformat/rtpproto.h |  2 ++
>>  libavformat/sdp.c      | 12 ++++++++++--
>>  3 files changed, 23 insertions(+), 2 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/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);
>> +        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)
>> --
>> 2.17.1
>>
>>
> Ping
>

Ping x 2
diff mbox series

Patch

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/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);
+        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)