+static int resolve_content_path(AVFormatContext *s, const char *url, int *max_url_size, xmlNodePtr *baseurl_nodes, int n_baseurl_nodes) {
+
+ char *tmp_str = NULL;
+ char *path = NULL;
+ char *mpdName = NULL;
+ xmlNodePtr node = NULL;
+ char *baseurl = NULL;
+ char *root_url = NULL;
+ char *text = NULL;
+
+ int isRootHttp = 0;
+ char token ='/';
+ int start = 0;
+ int rootId = 0;
+ int updated = 0;
+ int size = 0;
+ int i;
+ int tmp_max_url_size = strlen(url);
+
+ for (i = n_baseurl_nodes-1; i >= 0 ; i--) {
+ text = xmlNodeGetContent(baseurl_nodes[i]);
+ if (!text)
+ continue;
+ tmp_max_url_size += strlen(text);
+ if (ishttp(text)) {
+ xmlFree(text);
+ break;
+ }
+ xmlFree(text);
+ }
+
+ tmp_max_url_size = aligned(tmp_max_url_size);
+ text = av_mallocz(tmp_max_url_size);
+ if (!text) {
+ updated = AVERROR(ENOMEM);
+ goto end;
+ }
+ av_strlcpy(text, url, strlen(url)+1);
+ while (mpdName = av_strtok(text, "/", &text)) {
+ size = strlen(mpdName);
+ }
+
+ path = av_mallocz(tmp_max_url_size);
+ tmp_str = av_mallocz(tmp_max_url_size);
+ if (!tmp_str || !path) {
+ updated = AVERROR(ENOMEM);
+ goto end;
+ }
+
+ av_strlcpy (path, url, strlen(url) - size + 1);
+ for (rootId = n_baseurl_nodes - 1; rootId > 0; rootId --) {
+ if (!(node = baseurl_nodes[rootId])) {
+ continue;
+ }
+ if (ishttp(xmlNodeGetContent(node))) {
+ break;
+ }
+ }
+
+ node = baseurl_nodes[rootId];
+ baseurl = xmlNodeGetContent(node);
+ root_url = (av_strcasecmp(baseurl, "")) ? baseurl : path;
+ if (node) {
+ xmlNodeSetContent(node, root_url);
+ updated = 1;
+ }
+
+ size = strlen(root_url);
+ isRootHttp = ishttp(root_url);
+
+ if (root_url[size - 1] != token) {
+ av_strlcat(root_url, "/", size + 2);
+ size += 2;
+ }
+
+ for (i = 0; i < n_baseurl_nodes; ++i) {
+ if (i == rootId) {
+ continue;
+ }
+ text = xmlNodeGetContent(baseurl_nodes[i]);
+ if (text) {
+ memset(tmp_str, 0, strlen(tmp_str));
+ if (!ishttp(text) && isRootHttp) {
+ av_strlcpy(tmp_str, root_url, size + 1);
+ }
+ start = (text[0] == token);
+ av_strlcat(tmp_str, text + start, tmp_max_url_size);
+ xmlNodeSetContent(baseurl_nodes[i], tmp_str);
+ updated = 1;
+ xmlFree(text);
+ }
+ }
+
+end:
+ if (tmp_max_url_size > *max_url_size) {
+ *max_url_size = tmp_max_url_size;
+ }
+ av_free(path);
+ av_free(tmp_str);
+ return updated;
+
+}
+