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, | ||||
|                         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); | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user