| 
				
				
					
				
				
				 | 
			
			 | 
			@@ -684,6 +684,61 @@ static void rtsp_parse_transport(RTSPMessageHeader *reply, const char *p) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			static void handle_rtp_info(RTSPState *rt, const char *url, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                            uint32_t seq, uint32_t rtptime) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int i; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (!rtptime || !url[0]) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (rt->transport != RTSP_TRANSPORT_RTP) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    for (i = 0; i < rt->nb_rtsp_streams; i++) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        RTSPStream *rtsp_st = rt->rtsp_streams[i]; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        RTPDemuxContext *rtpctx = rtsp_st->transport_priv; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (!rtpctx) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            continue; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (!strcmp(rtsp_st->control_url, url)) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            rtpctx->base_timestamp = rtptime; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            break; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			static void rtsp_parse_rtp_info(RTSPState *rt, const char *p) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int read = 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    char key[20], value[1024], url[1024] = ""; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    uint32_t seq = 0, rtptime = 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    for (;;) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        p += strspn(p, SPACE_CHARS); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (!*p) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            break; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        get_word_sep(key, sizeof(key), "=", &p); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (*p != '=') | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            break; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        p++; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        get_word_sep(value, sizeof(value), ";, ", &p); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        read++; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (!strcmp(key, "url")) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            av_strlcpy(url, value, sizeof(url)); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        else if (!strcmp(key, "seq")) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            seq = strtol(value, NULL, 10); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        else if (!strcmp(key, "rtptime")) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            rtptime = strtol(value, NULL, 10); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (*p == ',') { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            handle_rtp_info(rt, url, seq, rtptime); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            url[0] = '\0'; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            seq = rtptime = 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            read = 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (*p) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            p++; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (read > 0) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        handle_rtp_info(rt, url, seq, rtptime); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			void ff_rtsp_parse_line(RTSPMessageHeader *reply, const char *buf, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                        RTSPState *rt, const char *method) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -728,6 +783,10 @@ void ff_rtsp_parse_line(RTSPMessageHeader *reply, const char *buf, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        p += strspn(p, SPACE_CHARS); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (method && !strcmp(method, "DESCRIBE")) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            av_strlcpy(rt->control_uri, p , sizeof(rt->control_uri)); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } else if (av_stristart(p, "RTP-Info:", &p) && rt) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        p += strspn(p, SPACE_CHARS); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (method && !strcmp(method, "PLAY")) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            rtsp_parse_rtp_info(rt, p); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
	
		
			
				| 
				
					
				
				
				
				 | 
			
			 | 
			
  |