ISegment * SegmentInformation::getSegment(SegmentInfoType type, uint64_t pos) const { std::vector<ISegment *> retSegments; const size_t size = getSegments( type, retSegments ); if( size ) { if(size == 1 && retSegments[0]->isTemplate()) { MediaSegmentTemplate *templ = dynamic_cast<MediaSegmentTemplate*>(retSegments[0]); if(!templ || templ->segmentTimeline.Get() == NULL || templ->segmentTimeline.Get()->maxElementNumber() > pos) return templ; } else { std::vector<ISegment *>::const_iterator it; for(it = retSegments.begin(); it != retSegments.end(); ++it) { ISegment *seg = *it; if(seg->getSequenceNumber() >= pos) { if(seg->getSequenceNumber() == pos) return seg; else return NULL; } } } } return NULL; }
ISegment * SegmentList::getSegmentByNumber(uint64_t number) { std::vector<ISegment *>::const_iterator it = segments.begin(); for(it = segments.begin(); it != segments.end(); ++it) { ISegment *seg = *it; if(seg->getSequenceNumber() == number) { return seg; } else if (seg->getSequenceNumber() > number) { break; } } return NULL; }
/* 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; }
void SegmentList::pruneBySegmentNumber(uint64_t tobelownum) { std::vector<ISegment *>::iterator it = segments.begin(); while(it != segments.end()) { ISegment *seg = *it; if(seg->getSequenceNumber() >= tobelownum) break; if(seg->chunksuse.Get()) /* can't prune from here, still in use */ break; delete *it; it = segments.erase(it); } }