]> granicus.if.org Git - rtmpdump/commitdiff
Fix tcUrl generation, free it on close if needed
authorhyc <hyc@400ebc74-4327-4243-bc38-086b20814532>
Tue, 29 Jun 2010 01:31:17 +0000 (01:31 +0000)
committerhyc <hyc@400ebc74-4327-4243-bc38-086b20814532>
Tue, 29 Jun 2010 01:31:17 +0000 (01:31 +0000)
git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@521 400ebc74-4327-4243-bc38-086b20814532

librtmp/rtmp.c
librtmp/rtmp.h

index c41acccbdcb6d647d607ab0eaf929d5abbb03758..29da0934b0a9673f70403d3d0bf22191b85da87d 100644 (file)
@@ -654,12 +654,13 @@ int RTMP_SetupURL(RTMP *r, char *url)
 {
   AVal opt, arg;
   char *p1, *p2, *ptr = strchr(url, ' ');
-  int ret;
+  int ret, len;
   unsigned int port = 0;
 
   if (ptr)
     *ptr = '\0';
 
+  len = strlen(url);
   ret = RTMP_ParseURL(url, &r->Link.protocol, &r->Link.hostname,
        &port, &r->Link.playpath0, &r->Link.app);
   if (!ret)
@@ -714,10 +715,28 @@ int RTMP_SetupURL(RTMP *r, char *url)
   if (!r->Link.tcUrl.av_len)
     {
          r->Link.tcUrl.av_val = url;
-         if (r->Link.app.av_len)
-           r->Link.tcUrl.av_len = r->Link.app.av_len + (r->Link.app.av_val - url);
-         else
+         if (r->Link.app.av_len) {
+           if (r->Link.app.av_val < url + len)
+                 {
+                   /* if app is part of original url, just use it */
+               r->Link.tcUrl.av_len = r->Link.app.av_len + (r->Link.app.av_val - url);
+                 }
+               else
+                 {
+                   len = r->Link.hostname.av_len + r->Link.app.av_len +
+                         sizeof("rtmpte://65535/");
+                       r->Link.tcUrl.av_val = malloc(len);
+                       r->Link.tcUrl.av_len = snprintf(r->Link.tcUrl.av_val, len,
+                         "%s://%.*s:%d/%.*s",
+                     RTMPProtocolStringsLower[r->Link.protocol],
+                         r->Link.hostname.av_len, r->Link.hostname.av_val,
+                         r->Link.port,
+                         r->Link.app.av_len, r->Link.app.av_val);
+                       r->Link.lFlags |= RTMP_LF_FTCU;
+                 }
+         } else {
            r->Link.tcUrl.av_len = strlen(url);
+         }
        }
 
 #ifdef CRYPTO
@@ -3428,6 +3447,13 @@ RTMP_Close(RTMP *r)
   free(r->Link.playpath0.av_val);
   r->Link.playpath0.av_val = NULL;
 
+  if (r->Link.lFlags & RTMP_LF_FTCU)
+    {
+         free(r->Link.tcUrl.av_val);
+         r->Link.tcUrl.av_val = NULL;
+         r->Link.lFlags ^= RTMP_LF_FTCU;
+       }
+
 #ifdef CRYPTO
   if (r->Link.dh)
     {
index 12fc4e7fa85d7905bb679560341d4a50bdebf8b8..f1da6a57ee14fce1cea0a35855931d84a29065a7 100644 (file)
@@ -147,6 +147,7 @@ extern "C"
 #define RTMP_LF_SWFV   0x0004  /* do SWF verification */
 #define RTMP_LF_PLST   0x0008  /* send playlist before play */
 #define RTMP_LF_BUFX   0x0010  /* toggle stream on BufferEmpty msg */
+#define RTMP_LF_FTCU   0x0020  /* free tcUrl on close */
     int lFlags;
 
     int swfAge;