changeset 18772:eb60c209a117

better RTSP RFC compliance (fixes in CSeq and TEARDOWN handling)
author ben
date Wed, 21 Jun 2006 17:39:27 +0000
parents a1807995e2ab
children 518b5935a909
files libmpdemux/realrtsp/real.c libmpdemux/realrtsp/rtsp.c libmpdemux/realrtsp/rtsp.h
diffstat 3 files changed, 63 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/realrtsp/real.c	Wed Jun 21 14:49:09 2006 +0000
+++ b/libmpdemux/realrtsp/real.c	Wed Jun 21 17:39:27 2006 +0000
@@ -800,7 +800,7 @@
   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);
   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) {
     rtsp_schedule_field(rtsp_session, "Transport: x-pn-tng/tcp;mode=play,rtp/avp/tcp;unicast;mode=play");
@@ -810,7 +810,7 @@
 
     buf = xbuffer_ensure_size(buf, strlen(mrl) + 32);
     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 */
   rtsp_schedule_field(rtsp_session, subscribe);
--- a/libmpdemux/realrtsp/rtsp.c	Wed Jun 21 14:49:09 2006 +0000
+++ b/libmpdemux/realrtsp/rtsp.c	Wed Jun 21 17:39:27 2006 +0000
@@ -24,6 +24,9 @@
  *
  * a minimalistic implementation of rtsp protocol,
  * *not* RFC 2326 compilant yet.
+ *
+ *    2006, Benjamin Zores and Vincent Mussard
+ *      fixed a lot of RFC compliance issues.
  */
 
 #include <unistd.h>
@@ -382,7 +385,7 @@
 
   char tmp[16];
   
-  snprintf(tmp, 16, "Cseq: %u", s->cseq);
+  snprintf(tmp, 16, "CSeq: %u", s->cseq);
   rtsp_schedule_field(s, tmp);
   
   if (s->session) {
@@ -419,11 +422,11 @@
     if (!answer)
       return 0;
     
-    if (!strncmp(answer,"Cseq:",5)) {
-      sscanf(answer,"Cseq: %u",&answer_seq);
+    if (!strncmp(answer,"CSeq:",5)) {
+      sscanf(answer,"CSeq: %u",&answer_seq);
       if (s->cseq != answer_seq) {
 #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
         s->cseq=answer_seq;
       }
@@ -518,11 +521,26 @@
   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) {
+
+  char *buf = NULL;
 
-  rtsp_send_request(s,"SETUP",what);
+  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) {
@@ -545,7 +563,8 @@
 int rtsp_request_play(rtsp_t *s, const char *what) {
 
   char *buf;
-
+  int ret;
+  
   if (what) {
     buf=strdup(what);
   } else
@@ -556,13 +575,28 @@
   rtsp_send_request(s,"PLAY",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);
 }
 
@@ -596,7 +630,7 @@
       free(rest);
       if (seq<0) {
 #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
         seq=1;
       }
@@ -640,7 +674,7 @@
   s->server_state=0;
   s->server_caps=0;
   
-  s->cseq=1;
+  s->cseq=0;
   s->session=NULL;
   
   if (user_agent)
@@ -690,7 +724,13 @@
 
 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->host) free(s->host);
   if (s->mrl) free(s->mrl);
@@ -805,6 +845,8 @@
   while(*ptr) {
     if (!strncmp(*ptr, string, strlen(string)))
       break;
+    else
+      ptr++;
   }
   if (*ptr) free(*ptr);
   ptr++;
--- a/libmpdemux/realrtsp/rtsp.h	Wed Jun 21 14:49:09 2006 +0000
+++ b/libmpdemux/realrtsp/rtsp.h	Wed Jun 21 17:39:27 2006 +0000
@@ -24,6 +24,9 @@
  *
  * a minimalistic implementation of rtsp protocol,
  * *not* RFC 2326 compilant yet.
+ *
+ *    2006, Benjamin Zores and Vincent Mussard
+ *      fixed a lot of RFC compliance issues.
  */
  
 #ifndef HAVE_RTSP_H
@@ -41,10 +44,10 @@
 
 int rtsp_request_options(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_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);