size_t IsoffMainParser::parseSegmentList(Node * segListNode, SegmentInformation *info) { size_t total = 0; if(segListNode) { std::vector<Node *> segments = DOMHelper::getElementByTagName(segListNode, "SegmentURL", false); SegmentList *list; if((list = new (std::nothrow) SegmentList(info))) { parseInitSegment(DOMHelper::getFirstChildElementByName(segListNode, "Initialization"), list, info); if(segListNode->hasAttribute("duration")) list->duration.Set(Integer<stime_t>(segListNode->getAttributeValue("duration"))); if(segListNode->hasAttribute("timescale")) list->setTimescale(Integer<uint64_t>(segListNode->getAttributeValue("timescale"))); uint64_t nzStartTime = 0; std::vector<Node *>::const_iterator it; for(it = segments.begin(); it != segments.end(); ++it) { Node *segmentURL = *it; Segment *seg = new (std::nothrow) Segment(info); if(!seg) continue; std::string mediaUrl = segmentURL->getAttributeValue("media"); if(!mediaUrl.empty()) seg->setSourceUrl(mediaUrl); 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(list->duration.Get()) { seg->startTime.Set(nzStartTime); seg->duration.Set(list->duration.Get()); nzStartTime += list->duration.Get(); } seg->setSequenceNumber(total); list->addSegment(seg); total++; } info->appendSegmentList(list, true); } } return total; }