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 |
Context | Check | Description |
---|---|---|
andriy/ffmpeg-patchwork | success | Make fate finished |
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
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 --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)
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(-)