You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	Allow cycling between different protocols (TCP, UDP or multicast) so that if
one doesn't work, we can try the next one (i.e. trial-error protocol auto- probing). Discussed and approved in "[PATCH] RTSP alternate protocol 2-3/3". Originally committed as revision 12504 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
		| @@ -922,6 +922,10 @@ make_setup_request (AVFormatContext *s, const char *host, int port, int protocol | ||||
|                  "Transport: %s\r\n", | ||||
|                  rtsp_st->control_url, transport); | ||||
|         rtsp_send_cmd(s, cmd, reply, NULL); | ||||
|         if (reply->status_code == 461 /* Unsupported protocol */ && i == 0) { | ||||
|             err = 1; | ||||
|             goto fail; | ||||
|         } else | ||||
|         if (reply->status_code != RTSP_STATUS_OK || | ||||
|             reply->nb_transports != 1) { | ||||
|             err = AVERROR_INVALIDDATA; | ||||
| @@ -1003,6 +1007,12 @@ make_setup_request (AVFormatContext *s, const char *host, int port, int protocol | ||||
|     return 0; | ||||
|  | ||||
| fail: | ||||
|     for (i=0; i<rt->nb_rtsp_streams; i++) { | ||||
|         if (rt->rtsp_streams[i]->rtp_handle) { | ||||
|             url_close(rt->rtsp_streams[i]->rtp_handle); | ||||
|             rt->rtsp_streams[i]->rtp_handle = NULL; | ||||
|         } | ||||
|     } | ||||
|     return err; | ||||
| } | ||||
|  | ||||
| @@ -1045,7 +1055,7 @@ static int rtsp_read_header(AVFormatContext *s, | ||||
|     } | ||||
|  | ||||
|     if (!protocol_mask) | ||||
|         protocol_mask = rtsp_default_protocols; | ||||
|         protocol_mask = (1 << RTSP_PROTOCOL_RTP_LAST) - 1; | ||||
|  | ||||
|     /* open the tcp connexion */ | ||||
|     snprintf(tcpname, sizeof(tcpname), "tcp://%s:%d", host, port); | ||||
| @@ -1077,9 +1087,18 @@ static int rtsp_read_header(AVFormatContext *s, | ||||
|         goto fail; | ||||
|     } | ||||
|  | ||||
|     err = make_setup_request(s, host, port, protocol_mask); | ||||
|     if (err) | ||||
|     do { | ||||
|         int protocol = protocol_mask & ~(protocol_mask - 1); | ||||
|  | ||||
|         err = make_setup_request(s, host, port, protocol); | ||||
|         if (err < 0) | ||||
|         goto fail; | ||||
|         protocol_mask &= ~protocol; | ||||
|         if (protocol_mask == 0 && err == 1) { | ||||
|             err = AVERROR(EPROTONOSUPPORT); | ||||
|             goto fail; | ||||
|         } | ||||
|     } while (err); | ||||
|  | ||||
|     rt->state = RTSP_STATE_IDLE; | ||||
|     rt->seek_timestamp = 0; /* default is to start stream at position | ||||
|   | ||||
| @@ -29,6 +29,10 @@ enum RTSPProtocol { | ||||
|     RTSP_PROTOCOL_RTP_UDP = 0, | ||||
|     RTSP_PROTOCOL_RTP_TCP = 1, | ||||
|     RTSP_PROTOCOL_RTP_UDP_MULTICAST = 2, | ||||
|     /** | ||||
|      * This is not part of public API and shouldn't be used outside of ffmpeg. | ||||
|      */ | ||||
|     RTSP_PROTOCOL_RTP_LAST | ||||
| }; | ||||
|  | ||||
| #define RTSP_DEFAULT_PORT   554 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user