Mercurial > libavformat.hg
changeset 1453:c0235bab9e92 libavformat
Add support for getting duration of a RTP stream (for seeking in stream)
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)
author | gpoirier |
---|---|
date | Mon, 06 Nov 2006 21:58:43 +0000 |
parents | 5ac6f973ba2f |
children | d7b946a1ec57 |
files | rtsp.c |
diffstat | 1 files changed, 34 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- a/rtsp.c Mon Nov 06 19:01:03 2006 +0000 +++ b/rtsp.c Mon Nov 06 21:58:43 2006 +0000 @@ -345,6 +345,32 @@ } } +/** 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 @@ } } } + } 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_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 @@ } 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); } }