On Tue, Dec 22, 2020 at 12:17 PM Andriy Gelman <andriy.gel...@gmail.com> wrote:
> On Mon, 21. Dec 16:35, Aman Karmani wrote: > > From: Aman Karmani <a...@tmm1.net> > > > > The SAT>IP protocol[1] is similar to RTSP. However SAT>IP servers > > are assumed to speak only MP2T, so DESCRIBE is not used in the same > > way. When no streams are active, DESCRIBE will return 404 according > > to the spec (see section 3.5.7). When streams are active, DESCRIBE > > will return a list of all current streams along with information > > about their signal strengths. > > > > Previously, attemping to use ffmpeg with a rtsp:// url that points > > to a SAT>IP server would work with some devices and fail due to 404 > > response on others. Further, if the SAT>IP server was already > > streaming, ffmpeg would incorrectly consume the DESCRIBE SDP response > > and join an existing tuner instead of requesting a new session with > > the URL provided by the user. These issues have been noted by many > > users across the internet[2][3]. > > > > This commit adds proper spec-compliant support for SAT>IP, including: > > > > - support for the satip:// psuedo-protocol > > - avoiding the use of DESCRIBE > > - parsing and consuming the com.ses.streamID response header > > - using "Transport: RTP/AVP;unicast" because the optional "/UDP" > > suffix confuses some servers > > > > [1] > https://www.satip.info/sites/satip/files/resource/satip_specification_version_1_2_2.pdf > > [2] > https://stackoverflow.com/questions/61194344/does-ffmpeg-violate-the-satip-specification-describe-syntax > > [3] https://github.com/kodi-pvr/pvr.iptvsimple/issues/196 > > --- > > libavformat/rtsp.c | 52 ++++++++++++++++++++++++++++++++++++++----- > > libavformat/rtsp.h | 6 +++++ > > libavformat/rtspdec.c | 1 + > > 3 files changed, 53 insertions(+), 6 deletions(-) > > > > diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c > > index c7ffa07d9e..4a863dbac3 100644 > > --- a/libavformat/rtsp.c > > +++ b/libavformat/rtsp.c > > @@ -252,6 +252,24 @@ static void > finalize_rtp_handler_init(AVFormatContext *s, RTSPStream *rtsp_st, > > } > > } > > > > +static int init_satip_stream(AVFormatContext *s) > > +{ > > + RTSPState *rt = s->priv_data; > > + RTSPStream *rtsp_st; > > + rtsp_st = av_mallocz(sizeof(RTSPStream)); > > + if (!rtsp_st) > > + return AVERROR(ENOMEM); > > + rtsp_st->stream_index = -1; > > + dynarray_add(&rt->rtsp_streams, > > + &rt->nb_rtsp_streams, rtsp_st); > > + av_strlcpy(rtsp_st->control_url, > > + rt->control_uri, sizeof(rtsp_st->control_url)); > > + rtsp_st->sdp_payload_type = 33; // MP2T > > + init_rtp_handler(&ff_mpegts_dynamic_handler, rtsp_st, NULL); > > + finalize_rtp_handler_init(s, rtsp_st, NULL); > > + return 0; > > +} > > + > > /* parse the rtpmap description: <codec_name>/<clock_rate>[/<other > params>] */ > > static int sdp_parse_rtpmap(AVFormatContext *s, > > AVStream *st, RTSPStream *rtsp_st, > > @@ -1116,6 +1134,9 @@ void ff_rtsp_parse_line(AVFormatContext *s, > > } else if (av_stristart(p, "Content-Type:", &p)) { > > p += strspn(p, SPACE_CHARS); > > av_strlcpy(reply->content_type, p, sizeof(reply->content_type)); > > + } else if (av_stristart(p, "com.ses.streamID:", &p)) { > > + p += strspn(p, SPACE_CHARS); > > + av_strlcpy(reply->stream_id, p, sizeof(reply->stream_id)); > > } > > } > > > > @@ -1495,8 +1516,10 @@ int ff_rtsp_make_setup_request(AVFormatContext > *s, const char *host, int port, > > rtp_opened: > > port = ff_rtp_get_local_rtp_port(rtsp_st->rtp_handle); > > have_port: > > > - snprintf(transport, sizeof(transport) - 1, > > - "%s/UDP;", trans_pref); > > + av_strlcat(transport, trans_pref, sizeof(transport)); > > transport needs to be initialized to an empty string. Otherwise av_strlcat > will > keep all the random bytes before the first NULL. Thanks for catching this. Updated the v2 patch to use av_strlcpy, which makes more sense anyway given this code is inside a loop. > > -- > Andriy > _______________________________________________ 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".