rtsp: Allow requesting of filtering of source packets
authorMartin Storsjö <martin@martin.st>
Thu, 6 Jan 2011 15:22:58 +0000 (15:22 +0000)
committerMartin Storsjö <martin@martin.st>
Thu, 6 Jan 2011 15:22:58 +0000 (15:22 +0000)
If filtered, only packets from the right source address and port
are received.

To test, play back e.g. some mpeg4 video RTSP stream (where the
video stream is the first stream in the presentation) over UDP.
While receiving this stream, send another stream to the same port:
ffmpeg -re -i <whatever> -vcodec mpeg4 -an -f rtp
rtp://127.0.0.1:5000?localport=1234
Normally, the RTSP playback reports lots of errors at this point.

If the RTSP stream has the ?filter_src option enabled, these
interferring packets are ignored.

Originally committed as revision 26246 to svn://svn.ffmpeg.org/ffmpeg/trunk

doc/protocols.texi
libavformat/rtsp.c
libavformat/rtsp.h

index 600f4704582c652161279808d4f698cded2449b1..29f5c90d81bd4585968a91f6ae53918b15a0e373 100644 (file)
@@ -251,6 +251,9 @@ Use UDP multicast as lower transport protocol.
 @item http
 Use HTTP tunneling as lower transport protocol, which is useful for
 passing proxies.
+
+@item filter_src
+Accept packets only from negotiated peer address and port.
 @end table
 
 Multiple lower transport protocols may be specified, in that case they are
index a38cc42408a07329c16ec4d32ad1b5f21fbca206..b09ebd764232ddbe3448378a4b302ba0333a78cd 100644 (file)
@@ -1186,16 +1186,18 @@ static int make_setup_request(AVFormatContext *s, const char *host, int port,
             break;
 
         case RTSP_LOWER_TRANSPORT_UDP: {
-            char url[1024];
+            char url[1024], options[30] = "";
 
+            if (rt->filter_source)
+                av_strlcpy(options, "?connect=1", sizeof(options));
             /* Use source address if specified */
             if (reply->transports[0].source[0]) {
                 ff_url_join(url, sizeof(url), "rtp", NULL,
                             reply->transports[0].source,
-                            reply->transports[0].server_port_min, NULL);
+                            reply->transports[0].server_port_min, options);
             } else {
                 ff_url_join(url, sizeof(url), "rtp", NULL, host,
-                            reply->transports[0].server_port_min, NULL);
+                            reply->transports[0].server_port_min, options);
             }
             if (!(rt->server_type == RTSP_SERVER_WMS && i > 1) &&
                 rtp_set_remote_url(rtsp_st->rtp_handle, url) < 0) {
@@ -1315,6 +1317,8 @@ redirect:
             } else if(!strcmp(option, "http")) {
                 lower_transport_mask |= (1<< RTSP_LOWER_TRANSPORT_TCP);
                 rt->control_transport = RTSP_MODE_TUNNEL;
+            } else if (!strcmp(option, "filter_src")) {
+                rt->filter_source = 1;
             } else {
                 /* Write options back into the buffer, using memmove instead
                  * of strcpy since the strings may overlap. */
index 628ce370ecb865e9ef7caf899cf31194daf57e13..eee07ac0e7e5fac766bf2bbb8ae6ff74f86b6644 100644 (file)
@@ -309,6 +309,10 @@ typedef struct RTSPState {
 
     /** Reusable buffer for receiving packets */
     uint8_t* recvbuf;
+
+    /** Filter incoming UDP packets - receive packets only from the right
+     * source address and port. */
+    int filter_source;
 } RTSPState;
 
 /**