mirror of
https://github.com/mpv-player/mpv
synced 2025-04-11 04:01:31 +00:00
better RTSP RFC compliance (fixes in CSeq and TEARDOWN handling)
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@18775 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
60f223f766
commit
dbd687fd37
@ -800,7 +800,7 @@ rmff_header_t *real_setup_and_get_header(rtsp_t *rtsp_session, uint32_t bandwid
|
|||||||
rtsp_schedule_field(rtsp_session, "Transport: x-pn-tng/tcp;mode=play,rtp/avp/tcp;unicast;mode=play");
|
rtsp_schedule_field(rtsp_session, "Transport: x-pn-tng/tcp;mode=play,rtp/avp/tcp;unicast;mode=play");
|
||||||
buf = xbuffer_ensure_size(buf, strlen(mrl) + 32);
|
buf = xbuffer_ensure_size(buf, strlen(mrl) + 32);
|
||||||
sprintf(buf, "%s/streamid=0", mrl);
|
sprintf(buf, "%s/streamid=0", mrl);
|
||||||
rtsp_request_setup(rtsp_session,buf);
|
rtsp_request_setup(rtsp_session,buf,NULL);
|
||||||
|
|
||||||
if (h->prop->num_streams > 1) {
|
if (h->prop->num_streams > 1) {
|
||||||
rtsp_schedule_field(rtsp_session, "Transport: x-pn-tng/tcp;mode=play,rtp/avp/tcp;unicast;mode=play");
|
rtsp_schedule_field(rtsp_session, "Transport: x-pn-tng/tcp;mode=play,rtp/avp/tcp;unicast;mode=play");
|
||||||
@ -810,7 +810,7 @@ rmff_header_t *real_setup_and_get_header(rtsp_t *rtsp_session, uint32_t bandwid
|
|||||||
|
|
||||||
buf = xbuffer_ensure_size(buf, strlen(mrl) + 32);
|
buf = xbuffer_ensure_size(buf, strlen(mrl) + 32);
|
||||||
sprintf(buf, "%s/streamid=1", mrl);
|
sprintf(buf, "%s/streamid=1", mrl);
|
||||||
rtsp_request_setup(rtsp_session,buf);
|
rtsp_request_setup(rtsp_session,buf,NULL);
|
||||||
}
|
}
|
||||||
/* set stream parameter (bandwidth) with our subscribe string */
|
/* set stream parameter (bandwidth) with our subscribe string */
|
||||||
rtsp_schedule_field(rtsp_session, subscribe);
|
rtsp_schedule_field(rtsp_session, subscribe);
|
||||||
|
@ -24,6 +24,9 @@
|
|||||||
*
|
*
|
||||||
* a minimalistic implementation of rtsp protocol,
|
* a minimalistic implementation of rtsp protocol,
|
||||||
* *not* RFC 2326 compilant yet.
|
* *not* RFC 2326 compilant yet.
|
||||||
|
*
|
||||||
|
* 2006, Benjamin Zores and Vincent Mussard
|
||||||
|
* fixed a lot of RFC compliance issues.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@ -382,7 +385,7 @@ static void rtsp_schedule_standard(rtsp_t *s) {
|
|||||||
|
|
||||||
char tmp[16];
|
char tmp[16];
|
||||||
|
|
||||||
snprintf(tmp, 16, "Cseq: %u", s->cseq);
|
snprintf(tmp, 16, "CSeq: %u", s->cseq);
|
||||||
rtsp_schedule_field(s, tmp);
|
rtsp_schedule_field(s, tmp);
|
||||||
|
|
||||||
if (s->session) {
|
if (s->session) {
|
||||||
@ -419,11 +422,11 @@ static int rtsp_get_answers(rtsp_t *s) {
|
|||||||
if (!answer)
|
if (!answer)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!strncmp(answer,"Cseq:",5)) {
|
if (!strncmp(answer,"CSeq:",5)) {
|
||||||
sscanf(answer,"Cseq: %u",&answer_seq);
|
sscanf(answer,"CSeq: %u",&answer_seq);
|
||||||
if (s->cseq != answer_seq) {
|
if (s->cseq != answer_seq) {
|
||||||
#ifdef LOG
|
#ifdef LOG
|
||||||
mp_msg(MSGT_OPEN, MSGL_WARN, "librtsp: warning: Cseq mismatch. got %u, assumed %u", answer_seq, s->cseq);
|
mp_msg(MSGT_OPEN, MSGL_WARN, "librtsp: warning: CSeq mismatch. got %u, assumed %u", answer_seq, s->cseq);
|
||||||
#endif
|
#endif
|
||||||
s->cseq=answer_seq;
|
s->cseq=answer_seq;
|
||||||
}
|
}
|
||||||
@ -518,11 +521,26 @@ int rtsp_request_describe(rtsp_t *s, const char *what) {
|
|||||||
return rtsp_get_answers(s);
|
return rtsp_get_answers(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
int rtsp_request_setup(rtsp_t *s, const char *what) {
|
int rtsp_request_setup(rtsp_t *s, const char *what, char *control) {
|
||||||
|
|
||||||
rtsp_send_request(s,"SETUP",what);
|
char *buf = NULL;
|
||||||
|
|
||||||
|
if (what)
|
||||||
|
buf = strdup (what);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int len = strlen (s->host) + strlen (s->path) + 16;
|
||||||
|
if (control)
|
||||||
|
len += strlen (control) + 1;
|
||||||
|
|
||||||
|
buf = malloc (len);
|
||||||
|
sprintf (buf, "rtsp://%s:%i/%s%s%s", s->host, s->port, s->path,
|
||||||
|
control ? "/" : "", control ? control : "");
|
||||||
|
}
|
||||||
|
|
||||||
return rtsp_get_answers(s);
|
rtsp_send_request (s, "SETUP", buf);
|
||||||
|
free (buf);
|
||||||
|
return rtsp_get_answers (s);
|
||||||
}
|
}
|
||||||
|
|
||||||
int rtsp_request_setparameter(rtsp_t *s, const char *what) {
|
int rtsp_request_setparameter(rtsp_t *s, const char *what) {
|
||||||
@ -545,7 +563,8 @@ int rtsp_request_setparameter(rtsp_t *s, const char *what) {
|
|||||||
int rtsp_request_play(rtsp_t *s, const char *what) {
|
int rtsp_request_play(rtsp_t *s, const char *what) {
|
||||||
|
|
||||||
char *buf;
|
char *buf;
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (what) {
|
if (what) {
|
||||||
buf=strdup(what);
|
buf=strdup(what);
|
||||||
} else
|
} else
|
||||||
@ -556,13 +575,28 @@ int rtsp_request_play(rtsp_t *s, const char *what) {
|
|||||||
rtsp_send_request(s,"PLAY",buf);
|
rtsp_send_request(s,"PLAY",buf);
|
||||||
free(buf);
|
free(buf);
|
||||||
|
|
||||||
return rtsp_get_answers(s);
|
ret = rtsp_get_answers (s);
|
||||||
|
if (ret == 200)
|
||||||
|
s->server_state = RTSP_PLAYING;
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int rtsp_request_tearoff(rtsp_t *s, const char *what) {
|
int rtsp_request_teardown(rtsp_t *s, const char *what) {
|
||||||
|
|
||||||
rtsp_send_request(s,"TEAROFF",what);
|
char *buf;
|
||||||
|
|
||||||
|
if (what)
|
||||||
|
buf = strdup (what);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
buf =
|
||||||
|
malloc (strlen (s->host) + strlen (s->path) + 16);
|
||||||
|
sprintf (buf, "rtsp://%s:%i/%s", s->host, s->port, s->path);
|
||||||
|
}
|
||||||
|
rtsp_send_request (s, "TEARDOWN", buf);
|
||||||
|
free (buf);
|
||||||
|
|
||||||
return rtsp_get_answers(s);
|
return rtsp_get_answers(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -596,7 +630,7 @@ int rtsp_read_data(rtsp_t *s, char *buffer, unsigned int size) {
|
|||||||
free(rest);
|
free(rest);
|
||||||
if (seq<0) {
|
if (seq<0) {
|
||||||
#ifdef LOG
|
#ifdef LOG
|
||||||
mp_msg(MSGT_OPEN, MSGL_WARN, "rtsp: warning: cseq not recognized!\n");
|
mp_msg(MSGT_OPEN, MSGL_WARN, "rtsp: warning: CSeq not recognized!\n");
|
||||||
#endif
|
#endif
|
||||||
seq=1;
|
seq=1;
|
||||||
}
|
}
|
||||||
@ -640,7 +674,7 @@ rtsp_t *rtsp_connect(int fd, char* mrl, char *path, char *host, int port, char *
|
|||||||
s->server_state=0;
|
s->server_state=0;
|
||||||
s->server_caps=0;
|
s->server_caps=0;
|
||||||
|
|
||||||
s->cseq=1;
|
s->cseq=0;
|
||||||
s->session=NULL;
|
s->session=NULL;
|
||||||
|
|
||||||
if (user_agent)
|
if (user_agent)
|
||||||
@ -690,7 +724,13 @@ rtsp_t *rtsp_connect(int fd, char* mrl, char *path, char *host, int port, char *
|
|||||||
|
|
||||||
void rtsp_close(rtsp_t *s) {
|
void rtsp_close(rtsp_t *s) {
|
||||||
|
|
||||||
if (s->server_state) closesocket(s->s); /* TODO: send a TEAROFF */
|
if (s->server_state)
|
||||||
|
{
|
||||||
|
if (s->server_state == RTSP_PLAYING)
|
||||||
|
rtsp_request_teardown (s, NULL);
|
||||||
|
closesocket (s->s);
|
||||||
|
}
|
||||||
|
|
||||||
if (s->path) free(s->path);
|
if (s->path) free(s->path);
|
||||||
if (s->host) free(s->host);
|
if (s->host) free(s->host);
|
||||||
if (s->mrl) free(s->mrl);
|
if (s->mrl) free(s->mrl);
|
||||||
@ -805,6 +845,8 @@ void rtsp_unschedule_field(rtsp_t *s, const char *string) {
|
|||||||
while(*ptr) {
|
while(*ptr) {
|
||||||
if (!strncmp(*ptr, string, strlen(string)))
|
if (!strncmp(*ptr, string, strlen(string)))
|
||||||
break;
|
break;
|
||||||
|
else
|
||||||
|
ptr++;
|
||||||
}
|
}
|
||||||
if (*ptr) free(*ptr);
|
if (*ptr) free(*ptr);
|
||||||
ptr++;
|
ptr++;
|
||||||
|
@ -24,6 +24,9 @@
|
|||||||
*
|
*
|
||||||
* a minimalistic implementation of rtsp protocol,
|
* a minimalistic implementation of rtsp protocol,
|
||||||
* *not* RFC 2326 compilant yet.
|
* *not* RFC 2326 compilant yet.
|
||||||
|
*
|
||||||
|
* 2006, Benjamin Zores and Vincent Mussard
|
||||||
|
* fixed a lot of RFC compliance issues.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef HAVE_RTSP_H
|
#ifndef HAVE_RTSP_H
|
||||||
@ -41,10 +44,10 @@ rtsp_t* rtsp_connect (int fd, char *mrl, char *path, char *host, int port, char
|
|||||||
|
|
||||||
int rtsp_request_options(rtsp_t *s, const char *what);
|
int rtsp_request_options(rtsp_t *s, const char *what);
|
||||||
int rtsp_request_describe(rtsp_t *s, const char *what);
|
int rtsp_request_describe(rtsp_t *s, const char *what);
|
||||||
int rtsp_request_setup(rtsp_t *s, const char *what);
|
int rtsp_request_setup(rtsp_t *s, const char *what, char *control);
|
||||||
int rtsp_request_setparameter(rtsp_t *s, const char *what);
|
int rtsp_request_setparameter(rtsp_t *s, const char *what);
|
||||||
int rtsp_request_play(rtsp_t *s, const char *what);
|
int rtsp_request_play(rtsp_t *s, const char *what);
|
||||||
int rtsp_request_tearoff(rtsp_t *s, const char *what);
|
int rtsp_request_teardown(rtsp_t *s, const char *what);
|
||||||
|
|
||||||
int rtsp_send_ok(rtsp_t *s);
|
int rtsp_send_ok(rtsp_t *s);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user