return false;
}
+ mtime_t minsegmentTime = 0;
+ for(int type=0; type<Streams::count; type++)
+ {
+ if(!streams[type])
+ continue;
+ mtime_t segmentTime = streams[type]->getPosition();
+ if(!minsegmentTime || segmentTime < minsegmentTime)
+ minsegmentTime = segmentTime;
+ }
+
MPD *newmpd = MPDFactory::create(parser.getRootNode(), mpdstream, parser.getProfile());
if(newmpd)
{
- mpd->mergeWith(newmpd);
+ mpd->mergeWith(newmpd, minsegmentTime);
delete newmpd;
}
stream_Delete(mpdstream);
}
return false;
}
+
+mtime_t SegmentTracker::getSegmentStart() const
+{
+ if(prevRepresentation)
+ return prevRepresentation->getPlaybackTimeBySegmentNumber(count);
+ else
+ return 0;
+}
void resetCounter();
http::Chunk* getNextChunk(Streams::Type);
bool setPosition(mtime_t, bool);
+ mtime_t getSegmentStart() const;
private:
bool initializing;
return ret;
}
+mtime_t Stream::getPosition() const
+{
+ return segmentTracker->getSegmentStart();
+}
+
AbstractStreamOutput::AbstractStreamOutput(demux_t *demux)
{
realdemux = demux;
bool seekAble() const;
size_t read(http::HTTPConnectionManager *);
bool setPosition(mtime_t, bool);
+ mtime_t getPosition() const;
private:
http::Chunk *getChunk();
}
}
-void MPD::mergeWith(MPD *updatedMPD)
+void MPD::mergeWith(MPD *updatedMPD, mtime_t prunebarrier)
{
availabilityEndTime.Set(updatedMPD->availabilityEndTime.Get());
/* Only merge timelines for now */
updatedMPD->periods.at(i)->collectTimelines(&timelinesUpdate);
for(size_t j = 0; j < timelines.size() && j < timelinesUpdate.size(); j++)
+ {
timelines.at(j)->mergeWith(*timelinesUpdate.at(j));
+ if(prunebarrier)
+ timelines.at(j)->prune(prunebarrier);
+ }
}
}
virtual Period* getFirstPeriod();
virtual Period* getNextPeriod(Period *period);
- void mergeWith(MPD *);
+ void mergeWith(MPD *, mtime_t = 0);
void getTimeLinesBoundaries(mtime_t *, mtime_t *) const;
Property<time_t> duration;