size_t IsoffMainParser::parseSegmentList(Node * segListNode, SegmentInformation *info) { size_t total = 0; mtime_t totaltime = 0; if(segListNode) { std::vector<Node *> segments = DOMHelper::getElementByTagName(segListNode, "SegmentURL", false); SegmentList *list; if((list = new (std::nothrow) SegmentList())) { parseInitSegment(DOMHelper::getFirstChildElementByName(segListNode, "Initialization"), list, info); if(segListNode->hasAttribute("duration")) list->setDuration(Integer<mtime_t>(segListNode->getAttributeValue("duration"))); if(segListNode->hasAttribute("timescale")) list->timescale.Set(Integer<uint64_t>(segListNode->getAttributeValue("timescale"))); std::vector<Node *>::const_iterator it; for(it = segments.begin(); it != segments.end(); ++it) { Node *segmentURL = *it; std::string mediaUrl = segmentURL->getAttributeValue("media"); if(mediaUrl.empty()) continue; Segment *seg = new (std::nothrow) Segment(info); if(!seg) continue; seg->setSourceUrl(segmentURL->getAttributeValue("media")); if(segmentURL->hasAttribute("mediaRange")) { std::string range = segmentURL->getAttributeValue("mediaRange"); size_t pos = range.find("-"); seg->setByteRange(atoi(range.substr(0, pos).c_str()), atoi(range.substr(pos + 1, range.size()).c_str())); } if(totaltime || list->getDuration()) { seg->startTime.Set(totaltime); totaltime += list->getDuration(); } list->addSegment(seg); total++; } info->setSegmentList(list); } } return total; }