mirror of
https://github.com/mpv-player/mpv
synced 2024-10-18 10:25:02 +02:00
Real rtsp Range parameter (Start and End) support.
Patch by rgselk <rgselknospam(at)yahoo(dot)com> git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@11507 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
8e0dd8484f
commit
b84ba866d7
@ -649,6 +649,25 @@ int real_get_rdt_chunk(rtsp_t *rtsp_session, char *buffer) {
|
||||
return n+12;
|
||||
}
|
||||
|
||||
int convert_timestamp(char *str, int *sec, int *msec) {
|
||||
int hh, mm, ss, ms = 0;
|
||||
if (sscanf(str, "%d:%d:%d.%d", &hh, &mm, &ss, &ms) < 3) {
|
||||
hh = 0;
|
||||
if (sscanf(str, "%d:%d.%d", &mm, &ss, &ms) < 2) {
|
||||
mm = 0;
|
||||
if (sscanf(str, "%d.%d", &ss, &ms) < 1) {
|
||||
ss = 0;
|
||||
ms = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (sec)
|
||||
*sec = hh * 3600 + mm * 60 + ss;
|
||||
if (msec)
|
||||
*msec = ms;
|
||||
return 1;
|
||||
}
|
||||
|
||||
rmff_header_t *real_setup_and_get_header(rtsp_t *rtsp_session, uint32_t bandwidth) {
|
||||
|
||||
char *description=NULL;
|
||||
@ -745,10 +764,24 @@ rmff_header_t *real_setup_and_get_header(rtsp_t *rtsp_session, uint32_t bandwid
|
||||
rtsp_schedule_field(rtsp_session, subscribe);
|
||||
rtsp_request_setparameter(rtsp_session,NULL);
|
||||
|
||||
{
|
||||
int s_ss = 0, s_ms = 0, e_ss = 0, e_ms = 0;
|
||||
char *str;
|
||||
if ((str = rtsp_get_param(rtsp_session, "start"))) {
|
||||
convert_timestamp(str, &s_ss, &s_ms);
|
||||
free(str);
|
||||
}
|
||||
if ((str = rtsp_get_param(rtsp_session, "end"))) {
|
||||
convert_timestamp(str, &e_ss, &e_ms);
|
||||
free(str);
|
||||
}
|
||||
str = buf + sprintf(buf, s_ms ? "%s%d.%d-" : "%s%d-", "Range: npt=", s_ss, s_ms);
|
||||
if (e_ss || e_ms)
|
||||
sprintf(str, e_ms ? "%d.%d" : "%d", e_ss, e_ms);
|
||||
}
|
||||
rtsp_schedule_field(rtsp_session, buf);
|
||||
/* and finally send a play request */
|
||||
rtsp_schedule_field(rtsp_session, "Range: npt=0-");
|
||||
rtsp_request_play(rtsp_session,NULL);
|
||||
|
||||
return h;
|
||||
}
|
||||
|
||||
|
@ -65,6 +65,7 @@ struct rtsp_s {
|
||||
char *host;
|
||||
int port;
|
||||
char *path;
|
||||
char *param;
|
||||
char *mrl;
|
||||
char *user_agent;
|
||||
|
||||
@ -622,7 +623,13 @@ rtsp_t *rtsp_connect(int fd, char* mrl, char *path, char *host, int port, char *
|
||||
s->mrl = strdup(mrl);
|
||||
s->host = strdup(host);
|
||||
s->port = port;
|
||||
while (*path == '/')
|
||||
path++;
|
||||
s->path = strdup(path);
|
||||
if ((s->param = strchr(s->path, '?')) != NULL)
|
||||
s->param++;
|
||||
//printf("path=%s\n", s->path);
|
||||
//printf("param=%s\n", s->param ? s->param : "NULL");
|
||||
s->s = fd;
|
||||
|
||||
if (s->s < 0) {
|
||||
@ -716,6 +723,30 @@ char *rtsp_get_mrl(rtsp_t *s) {
|
||||
|
||||
}
|
||||
|
||||
char *rtsp_get_param(rtsp_t *s, char *p) {
|
||||
int len;
|
||||
char *param;
|
||||
if (!s->param)
|
||||
return NULL;
|
||||
if (!p)
|
||||
return strdup(s->param);
|
||||
len = strlen(p);
|
||||
param = s->param;
|
||||
while (param && *param) {
|
||||
char *nparam = strchr(param, '&');
|
||||
if (strncmp(param, p, len) == 0 && param[len] == '=') {
|
||||
param += len + 1;
|
||||
len = nparam ? nparam - param : strlen(param);
|
||||
nparam = malloc(len + 1);
|
||||
memcpy(nparam, param, len);
|
||||
nparam[len] = 0;
|
||||
return nparam;
|
||||
}
|
||||
param = nparam ? nparam + 1 : NULL;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* schedules a field for transmission
|
||||
*/
|
||||
|
@ -62,6 +62,7 @@ void rtsp_set_session(rtsp_t *s, const char *id);
|
||||
char *rtsp_get_session(rtsp_t *s);
|
||||
|
||||
char *rtsp_get_mrl(rtsp_t *s);
|
||||
char *rtsp_get_param(rtsp_t *s, char *param);
|
||||
|
||||
/*int rtsp_peek_header (rtsp_t *this, char *data); */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user