Add support for getting duration of a RTP stream (for seeking in stream)
authorRyan Martell <rdm4@martellventures.com>
Mon, 6 Nov 2006 21:58:43 +0000 (21:58 +0000)
committerGuillaume Poirier <gpoirier@mplayerhq.hu>
Mon, 6 Nov 2006 21:58:43 +0000 (21:58 +0000)
Patch by Ryan Martell % rdm4 A martellventures P com %
Original thread:
Date: Nov 6, 2006 6:39 PM
Subject: [Ffmpeg-devel] [PATCH] RTP/Get Duration of file (for seeking in stream)

Originally committed as revision 6921 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/rtsp.c

index 0c5038e..6c01f5e 100644 (file)
@@ -345,6 +345,32 @@ static void sdp_parse_fmtp(AVStream *st, const char *p)
     }
 }
 
+/** Parse a string \p in the form of Range:npt=xx-xx, and determine the start
+ *  and end time.
+ *  Used for seeking in the rtp stream.
+ */
+static void rtsp_parse_range_npt(const char *p, int64_t *start, int64_t *end)
+{
+    char buf[256];
+
+    skip_spaces(&p);
+    if (!stristart(p, "npt=", &p))
+        return;
+
+    *start = AV_NOPTS_VALUE;
+    *end = AV_NOPTS_VALUE;
+
+    get_word_sep(buf, sizeof(buf), "-", &p);
+    *start = parse_date(buf, 1);
+    if (*p == '-') {
+        p++;
+        get_word_sep(buf, sizeof(buf), "-", &p);
+        *end = parse_date(buf, 1);
+    }
+//    av_log(NULL, AV_LOG_DEBUG, "Range Start: %lld\n", *start);
+//    av_log(NULL, AV_LOG_DEBUG, "Range End: %lld\n", *end);
+}
+
 typedef struct SDPParseState {
     /* SDP only */
     struct in_addr default_ip;
@@ -506,6 +532,13 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1,
                     }
                 }
             }
+        } else if(strstart(p, "range:", &p)) {
+            int64_t start, end;
+
+            // this is so that seeking on a streamed file can work.
+            rtsp_parse_range_npt(p, &start, &end);
+            s->start_time= start;
+            s->duration= (end==AV_NOPTS_VALUE)?AV_NOPTS_VALUE:end-start; // AV_NOPTS_VALUE means live broadcast (and can't seek)
         }
         break;
     }
@@ -660,26 +693,6 @@ static void rtsp_parse_transport(RTSPHeader *reply, const char *p)
     }
 }
 
-static void rtsp_parse_range_npt(RTSPHeader *reply, const char *p)
-{
-    char buf[256];
-
-    skip_spaces(&p);
-    if (!stristart(p, "npt=", &p))
-        return;
-
-    reply->range_start = AV_NOPTS_VALUE;
-    reply->range_end = AV_NOPTS_VALUE;
-
-    get_word_sep(buf, sizeof(buf), "-", &p);
-    reply->range_start = parse_date(buf, 1);
-    if (*p == '-') {
-        p++;
-        get_word_sep(buf, sizeof(buf), "-", &p);
-        reply->range_end = parse_date(buf, 1);
-    }
-}
-
 void rtsp_parse_line(RTSPHeader *reply, const char *buf)
 {
     const char *p;
@@ -695,7 +708,7 @@ void rtsp_parse_line(RTSPHeader *reply, const char *buf)
     } else if (stristart(p, "CSeq:", &p)) {
         reply->seq = strtol(p, NULL, 10);
     } else if (stristart(p, "Range:", &p)) {
-        rtsp_parse_range_npt(reply, p);
+        rtsp_parse_range_npt(p, &reply->range_start, &reply->range_end);
     }
 }