[SCM] libav/experimental: Support 3xx redirection in rtsp

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 16:53:33 UTC 2013


The following commit has been merged in the experimental branch:
commit d243ba30b824513e75f5836c6dde789034152976
Author: Luca Barbato <lu_zero at gentoo.org>
Date:   Sun Oct 25 00:06:31 2009 +0000

    Support 3xx redirection in rtsp
    
    All the error codes 3xx got managed the same way.
    After setup/early play redirection will not be managed
    REDIRECT method is yet to be supported (if somebody knows a server implementing
    it please contact me)
    
    Originally committed as revision 20369 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index c366ff1..59e537a 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -704,6 +704,9 @@ void rtsp_parse_line(RTSPMessageHeader *reply, const char *buf)
     } else if (av_stristart(p, "Notice:", &p) ||
                av_stristart(p, "X-Notice:", &p)) {
         reply->notice = strtol(p, NULL, 10);
+    } else if (av_stristart(p, "Location:", &p)) {
+        skip_spaces(&p);
+        av_strlcpy(reply->location, p , sizeof(reply->location));
     }
 }
 
@@ -1180,7 +1183,7 @@ static int rtsp_read_header(AVFormatContext *s,
     unsigned char *content = NULL;
     int lower_transport_mask = 0;
     char real_challenge[64];
-
+  redirect:
     /* extract hostname and port */
     url_split(NULL, 0, auth, sizeof(auth),
               host, sizeof(host), &port, path, sizeof(path), s->filename);
@@ -1338,6 +1341,13 @@ static int rtsp_read_header(AVFormatContext *s,
     av_freep(&content);
     url_close(rt->rtsp_hd);
     av_freep(&rt->auth_b64);
+    if (reply->status_code >=300 && reply->status_code < 400) {
+        av_strlcpy(s->filename, reply->location, sizeof(s->filename));
+        av_log(s, AV_LOG_INFO, "Status %d: Redirecting to %s\n",
+               reply->status_code,
+               s->filename);
+        goto redirect;
+    }
     return err;
 }
 
diff --git a/libavformat/rtsp.h b/libavformat/rtsp.h
index 3db8235..8f79c75 100644
--- a/libavformat/rtsp.h
+++ b/libavformat/rtsp.h
@@ -121,6 +121,10 @@ typedef struct RTSPMessageHeader {
      * should be re-transmitted by the client in every RTSP command. */
     char session_id[512];
 
+    /** the "Location:" field. This value is used to handle redirection.
+     */
+    char location[4096];
+
     /** the "RealChallenge1:" field from the server */
     char real_challenge[64];
 

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list