void av_url_split(char *proto, int proto_size,
char *authorization, int authorization_size,
char *hostname, int hostname_size,
int *port_ptr,
char *path, int path_size,
const char *url)
{//{协议}://{用户名}:{密码}@{主机名}:{端口号}/{路径}/{文件}?{参数}
/* parse protocol *///1.解析出协议,如http://,放入proto
if ((p = strchr(url, ':'))) {
av_strlcpy(proto, url, FFMIN(proto_size, p + 1 - url));
p++; /* skip ':' */
if (*p == '/') p++;
if (*p == '/') p++;
} else {
/* no protocol means plain filename */
av_strlcpy(path, url, path_size);
return;
}
/* separate path from hostname */
ls = strchr(p, '/');
ls2 = strchr(p, '?');
if(!ls)
ls = ls2;
else if (ls && ls2)
ls = FFMIN(ls, ls2);
if(ls)
av_strlcpy(path, ls, path_size); //2.得到路径,放入path中
else
ls = &p[strlen(p)]; // XXX
/* the rest is hostname, use that to parse auth/port */
if (ls != p) {
/* authorization (user[:pass]@hostname) */
if ((at = strchr(p, '@')) && at < ls) {
av_strlcpy(authorization, p,
FFMIN(authorization_size, at + 1 - p)); //3.得到{用户名}:{密码},放入authorization中
p = at + 1; /* skip '@' */
}
if (*p == '[' && (brk = strchr(p, ']')) && brk < ls) {
/* [host]:port */
av_strlcpy(hostname, p + 1,
FFMIN(hostname_size, brk - p)); //4.得到主机名,放入hostname中
if (brk[1] == ':' && port_ptr)
*port_ptr = atoi(brk + 2); //5.得到端口号,放入port_ptr中
} else if ((col = strchr(p, ':')) && col < ls) {
av_strlcpy(hostname, p,
FFMIN(col + 1 - p, hostname_size));
if (port_ptr) *port_ptr = atoi(col + 1);
} else
av_strlcpy(hostname, p,
FFMIN(ls + 1 - p, hostname_size));
}
}
ffmpeg——rtsp
猜你喜欢
转载自blog.csdn.net/u012868357/article/details/80235402
今日推荐
周排行