diff libmpdemux/realrtsp/real.c @ 11506:fff1b6f1a9cc

Real rtsp Range parameter (Start and End) support. Patch by rgselk <rgselknospam(at)yahoo(dot)com>
author rtognimp
date Sun, 23 Nov 2003 13:35:55 +0000
parents 0ddf649cff61
children 95413c6d76a0
line wrap: on
line diff
--- a/libmpdemux/realrtsp/real.c	Sun Nov 23 13:31:44 2003 +0000
+++ b/libmpdemux/realrtsp/real.c	Sun Nov 23 13:35:55 2003 +0000
@@ -649,6 +649,25 @@
   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 @@
   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;
 }
-