You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	rtsp: Parse RTP-Info headers
Originally committed as revision 26236 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
		| @@ -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, | void ff_rtsp_parse_line(RTSPMessageHeader *reply, const char *buf, | ||||||
|                         RTSPState *rt, const char *method) |                         RTSPState *rt, const char *method) | ||||||
| { | { | ||||||
| @@ -728,6 +783,10 @@ void ff_rtsp_parse_line(RTSPMessageHeader *reply, const char *buf, | |||||||
|         p += strspn(p, SPACE_CHARS); |         p += strspn(p, SPACE_CHARS); | ||||||
|         if (method && !strcmp(method, "DESCRIBE")) |         if (method && !strcmp(method, "DESCRIBE")) | ||||||
|             av_strlcpy(rt->control_uri, p , sizeof(rt->control_uri)); |             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); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user