On 18/06/14 08:21, Martin Storsjö wrote: > On Tue, 17 Jun 2014, Luca Barbato wrote: > >> From: Joshua Kordani <[email protected]> >> >> Issue present in Avigilon IP cameras. >> --- >> >> Amended adding strlcpy and resetting the seen flags on 'm', some >> testing welcome =) >> >> libavformat/rtsp.c | 19 ++++++++++++++++--- >> 1 file changed, 16 insertions(+), 3 deletions(-) >> >> diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c >> index adea3c6..23d7da1 100644 >> --- a/libavformat/rtsp.c >> +++ b/libavformat/rtsp.c >> @@ -292,6 +292,9 @@ typedef struct SDPParseState { >> struct RTSPSource **default_include_source_addrs; /**< >> Source-specific multicast include source IP address (from SDP content) */ >> int nb_default_exclude_source_addrs; /**< Number of >> source-specific multicast exclude source IP address (from SDP content) */ >> struct RTSPSource **default_exclude_source_addrs; /**< >> Source-specific multicast exclude source IP address (from SDP content) */ >> + int seen_rtpmap; >> + int seen_fmtp; >> + char delayed_fmtp[2048]; >> } SDPParseState; >> >> static void copy_default_source_addrs(struct RTSPSource **addrs, int >> count, >> @@ -381,7 +384,9 @@ static void sdp_parse_line(AVFormatContext *s, >> SDPParseState *s1, >> break; >> case 'm': >> /* new stream */ >> - s1->skip_media = 0; >> + s1->skip_media = 0; >> + s1->seen_fmtp = 0; >> + s1->seen_rtpmap = 0; >> codec_type = AVMEDIA_TYPE_UNKNOWN; >> get_word(st_type, sizeof(st_type), &p); >> if (!strcmp(st_type, "audio")) { >> @@ -504,13 +509,21 @@ static void sdp_parse_line(AVFormatContext *s, >> SDPParseState *s1, >> st = s->streams[rtsp_st->stream_index]; >> sdp_parse_rtpmap(s, st, rtsp_st, payload_type, p); >> } >> + s1->seen_rtpmap = 1; >> + if (s1->seen_fmtp) { >> + parse_fmtp(s, rt, payload_type, s1->delayed_fmtp); >> + } >> } else if (av_strstart(p, "fmtp:", &p) || >> av_strstart(p, "framesize:", &p)) { >> - /* NOTE: fmtp is only supported AFTER the 'a=rtpmap:xxx' >> tag */ >> // let dynamic protocol handlers have a stab at the line. >> get_word(buf1, sizeof(buf1), &p); >> payload_type = atoi(buf1); >> - parse_fmtp(s, rt, payload_type, buf); >> + if (s1->seen_rtpmap) { >> + parse_fmtp(s, rt, payload_type, buf); >> + } else { >> + s1->seen_fmtp = 1; >> + av_strlcpy(s1->delayed_fmtp, buf, >> sizeof(s1->delayed_fmtp)); >> + } > > If one would want to reduce the amount of possibly ambigous state, one > could check whether delayed_fmtp[0] is non-null instead of using > seen_fmtp (but I don't mind having it like this either - this is clearer > at least).
Considered that, then I maintained the submitter approach using clearer names. > Tested on a couple files with multiple stream (where each stream has got > a fmtp line), so seems ok to me. I'll push in a while with the rest. Thank you lu _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
