@ -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 , & re ply - > range_end ) ;
}
}