On Tue, 17 Jun 2014, Luca Barbato wrote:

From: Joshua Kordani <[email protected]>

Issue present in Avigilon IP cameras.
---
libavformat/rtsp.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index adea3c6..c5a9d51 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_a_line[2048];
} SDPParseState;

static void copy_default_source_addrs(struct RTSPSource **addrs, int count,
@@ -504,13 +507,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_a_line);
+            }
        } 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;
+                strncpy(s1->delayed_a_line, buf, sizeof(s1->delayed_a_line));

I'd rather use av_strlcpy here, because strncpy doesn't do null terminatin in case the buffer isn't large enough.

Also, I think we should clear the seen_fmtp and seen_rtpmap variables at some point (in the 'm' case perhaps?), otherwise this will mess things up for sure in the case of multiple streams.

// Martin
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to