/* Returns wanted segment, or next in sequence if not found */ ISegment * SegmentInformation::getNextSegment(SegmentInfoType type, uint64_t i_pos, uint64_t *pi_newpos, bool *pb_gap) const { *pb_gap = false; *pi_newpos = i_pos; if( type != INFOTYPE_MEDIA ) return NULL; std::vector<ISegment *> retSegments; const size_t size = getSegments( type, retSegments ); if( size ) { std::vector<ISegment *>::const_iterator it; for(it = retSegments.begin(); it != retSegments.end(); ++it) { ISegment *seg = *it; if(seg->isTemplate()) /* we don't care about seq number */ { /* Check if we don't exceed timeline */ MediaSegmentTemplate *templ = dynamic_cast<MediaSegmentTemplate*>(retSegments[0]); SegmentTimeline *timeline = (templ) ? templ->segmentTimeline.Get() : NULL; if(timeline) { *pi_newpos = std::max(timeline->minElementNumber(), i_pos); if(timeline->maxElementNumber() < i_pos) return NULL; } else { *pi_newpos = i_pos; /* start number */ *pi_newpos = std::max((uint64_t)templ->startNumber.Get(), i_pos); } return seg; } else if(seg->getSequenceNumber() >= i_pos) { *pi_newpos = seg->getSequenceNumber(); *pb_gap = (*pi_newpos != i_pos); return seg; } } } return NULL; }
uint64_t SegmentInformation::getLiveStartSegmentNumber(uint64_t def) const { if( mediaSegmentTemplate ) { SegmentTimeline *timeline = mediaSegmentTemplate->segmentTimeline.Get(); if(timeline) { const uint64_t start = timeline->minElementNumber(); const uint64_t end = timeline->maxElementNumber(); if(end > 2 && (end - start >= 2)) return end - 2; else return start; } return mediaSegmentTemplate->startNumber.Get(); } else if ( segmentList && !segmentList->getSegments().empty() ) { const std::vector<ISegment *> list = segmentList->getSegments(); if(list.size() > 3) return list.at(list.size() - 3)->getSequenceNumber(); else if(!list.empty()) return list.front()->getSequenceNumber(); else return segmentList->getStartIndex(); } else if( segmentBase ) { const std::vector<ISegment *> list = segmentBase->subSegments(); if(list.size() > 3) return list.at(list.size() - 3)->getSequenceNumber(); else if(!list.empty()) return list.front()->getSequenceNumber(); else return segmentBase->getSequenceNumber(); } if(parent) return parent->getLiveStartSegmentNumber(def); else return def; }