+ state = parse_default;
+ } else if (state != new_set && av_strstart(p, "seg_duration=", &p)) {
+ state = parse_seg_duration;
+ } else if (state != new_set && av_strstart(p, "frag_duration=", &p)) {
+ state = parse_frag_duration;
+ } else if (state == parse_seg_duration || state == parse_frag_duration) {
+ char str[32];
+ int64_t usecs = 0;
+
+ n = strcspn(p, ",");
+ snprintf(str, sizeof(str), "%.*s", n, p);
+ p += n;
+ if (*p)
+ p++;
+
+ ret = av_parse_time(&usecs, str, 1);
+ if (ret < 0) {
+ av_log(s, AV_LOG_ERROR, "Unable to parse option value \"%s\" as duration\n", str);
+ return ret;
+ }
+
+ if (state == parse_seg_duration)
+ as->seg_duration = usecs;
+ else
+ as->frag_duration = usecs;
+ state = parse_default;
+ } else if (state != new_set && av_strstart(p, "frag_type=", &p)) {
+ char type_str[16];
+
+ n = strcspn(p, ",");
+ snprintf(type_str, sizeof(type_str), "%.*s", n, p);
+ p += n;
+ if (*p)
+ p++;
+
+ if (!strcmp(type_str, "duration"))
+ as->frag_type = FRAG_TYPE_DURATION;
+ else if (!strcmp(type_str, "pframes"))
+ as->frag_type = FRAG_TYPE_PFRAMES;
+ else if (!strcmp(type_str, "every_frame"))
+ as->frag_type = FRAG_TYPE_EVERY_FRAME;
+ else if (!strcmp(type_str, "none"))
+ as->frag_type = FRAG_TYPE_NONE;
+ else {
+ av_log(s, AV_LOG_ERROR, "Unable to parse option value \"%s\" as fragment type\n", type_str);
+ return ret;
+ }
+ state = parse_default;
+ } else if (state != new_set && av_strstart(p, "descriptor=", &p)) {
+ n = strcspn(p, ">") + 1; //followed by one comma, so plus 1
+ if (n < strlen(p)) {
+ as->descriptor = av_strndup(p, n);
+ } else {
+ av_log(s, AV_LOG_ERROR, "Parse error, descriptor string should be a self-closing xml tag\n");
+ return AVERROR(EINVAL);
+ }
+ p += n;
+ if (*p)
+ p++;
+ state = parse_default;
+ } else if ((state != new_set) && av_strstart(p, "streams=", &p)) { //descriptor and durations are optional