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) Originally committed as revision 6921 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
4408e75e02
commit
31693e00fc
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user