[FFmpeg-cvslog] rtsp: Support misordered fmtp rtpmap

Joshua Kordani git at videolan.org
Wed Jun 18 23:32:51 CEST 2014


ffmpeg | branch: master | Joshua Kordani <jkordani at lsa2.com> | Tue Jun 17 02:49:46 2014 +0200| [c385313d2590fd26e26bb9bdacddef78162ab490] | committer: Luca Barbato

rtsp: Support misordered fmtp rtpmap

Issue present in Avigilon IP cameras.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=c385313d2590fd26e26bb9bdacddef78162ab490
---

 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));
+            }
         } else if (av_strstart(p, "range:", &p)) {
             int64_t start, end;
 



More information about the ffmpeg-cvslog mailing list