mirror of
https://code.videolan.org/videolan/vlc
synced 2024-10-03 01:31:53 +02:00
demux: adaptive: use Times for stream position
This commit is contained in:
parent
adb7bdc2f6
commit
e009424c15
@ -311,10 +311,12 @@ AbstractStream::Status PlaylistManager::dequeue(Times floor, Times *barrier)
|
||||
return i_return;
|
||||
}
|
||||
|
||||
vlc_tick_t PlaylistManager::getResumeTime() const
|
||||
StreamPosition PlaylistManager::getResumePosition() const
|
||||
{
|
||||
vlc_mutex_locker locker(&demux.lock);
|
||||
return demux.times.segment.media;
|
||||
StreamPosition pos;
|
||||
pos.times = demux.times;
|
||||
return pos;
|
||||
}
|
||||
|
||||
Times PlaylistManager::getFirstTimes() const
|
||||
@ -344,10 +346,13 @@ unsigned PlaylistManager::getActiveStreamsCount() const
|
||||
return count;
|
||||
}
|
||||
|
||||
bool PlaylistManager::setPosition(vlc_tick_t time)
|
||||
bool PlaylistManager::setPosition(vlc_tick_t mediatime, double pos)
|
||||
{
|
||||
bool ret = true;
|
||||
bool hasValidStream = false;
|
||||
StreamPosition streampos;
|
||||
streampos.times.segment.media = mediatime;
|
||||
streampos.pos = pos;
|
||||
for(int real = 0; real < 2; real++)
|
||||
{
|
||||
/* Always probe if we can seek first */
|
||||
@ -356,7 +361,7 @@ bool PlaylistManager::setPosition(vlc_tick_t time)
|
||||
if(st->isValid() && !st->isDisabled())
|
||||
{
|
||||
hasValidStream = true;
|
||||
ret &= st->setPosition(time, !real);
|
||||
ret &= st->setPosition(streampos, !real);
|
||||
}
|
||||
}
|
||||
if(!ret)
|
||||
@ -423,7 +428,7 @@ vlc_tick_t PlaylistManager::getMinAheadTime() const
|
||||
|
||||
bool PlaylistManager::reactivateStream(AbstractStream *stream)
|
||||
{
|
||||
return stream->reactivate(getResumeTime());
|
||||
return stream->reactivate(getResumePosition());
|
||||
}
|
||||
|
||||
#define DEMUX_INCREMENT VLC_TICK_FROM_MS(50)
|
||||
@ -626,7 +631,7 @@ int PlaylistManager::doControl(int i_query, va_list args)
|
||||
SeekDebug(msg_Dbg(p_demux, "Seek %f to %ld plstart %ld duration %ld",
|
||||
pos, seekTime, cached.playlistEnd, cached.playlistLength));
|
||||
|
||||
if(!setPosition(seekTime))
|
||||
if(!setPosition(seekTime, pos))
|
||||
{
|
||||
setBufferingRunState(true);
|
||||
return VLC_EGENERIC;
|
||||
|
@ -44,6 +44,8 @@ namespace adaptive
|
||||
using namespace playlist;
|
||||
using namespace logic;
|
||||
|
||||
using StreamPosition = AbstractStream::StreamPosition;
|
||||
|
||||
class PlaylistManager
|
||||
{
|
||||
public:
|
||||
@ -77,8 +79,8 @@ namespace adaptive
|
||||
virtual int doDemux(vlc_tick_t);
|
||||
|
||||
void setLivePause(bool);
|
||||
virtual bool setPosition(vlc_tick_t);
|
||||
vlc_tick_t getResumeTime() const;
|
||||
virtual bool setPosition(vlc_tick_t, double pos = -1);
|
||||
StreamPosition getResumePosition() const;
|
||||
Times getFirstTimes() const;
|
||||
unsigned getActiveStreamsCount() const;
|
||||
|
||||
|
@ -233,10 +233,16 @@ bool AbstractStream::isSelected() const
|
||||
return fakeEsOut()->hasSelectedEs();
|
||||
}
|
||||
|
||||
bool AbstractStream::reactivate(vlc_tick_t basetime)
|
||||
AbstractStream::StreamPosition::StreamPosition()
|
||||
{
|
||||
number = std::numeric_limits<uint64_t>::max();
|
||||
pos = -1;
|
||||
}
|
||||
|
||||
bool AbstractStream::reactivate(const StreamPosition &pos)
|
||||
{
|
||||
vlc_mutex_locker locker(&lock);
|
||||
if(setPosition(basetime, false))
|
||||
if(setPosition(pos, false))
|
||||
{
|
||||
setDisabled(false);
|
||||
return true;
|
||||
@ -636,13 +642,14 @@ block_t * AbstractStream::readNextBlock()
|
||||
return block;
|
||||
}
|
||||
|
||||
bool AbstractStream::setPosition(vlc_tick_t time, bool tryonly)
|
||||
bool AbstractStream::setPosition(const StreamPosition &pos, bool tryonly)
|
||||
{
|
||||
if(!seekAble())
|
||||
return false;
|
||||
|
||||
bool b_needs_restart = demuxer ? demuxer->needsRestartOnSeek() : true;
|
||||
bool ret = segmentTracker->setPositionByTime(time, b_needs_restart, tryonly);
|
||||
bool ret = segmentTracker->setPositionByTime(pos.times.segment.media,
|
||||
b_needs_restart, tryonly);
|
||||
if(!tryonly && ret)
|
||||
{
|
||||
// in some cases, media time seek != sent dts
|
||||
|
@ -68,7 +68,6 @@ namespace adaptive
|
||||
Times getFirstTimes() const;
|
||||
int esCount() const;
|
||||
bool isSelected() const;
|
||||
virtual bool reactivate(vlc_tick_t);
|
||||
bool isDisabled() const;
|
||||
bool isValid() const;
|
||||
void setLivePause(bool);
|
||||
@ -91,7 +90,17 @@ namespace adaptive
|
||||
Times getDemuxedAmount(Times) const;
|
||||
Status dequeue(Times, Times *);
|
||||
bool decodersDrained();
|
||||
virtual bool setPosition(vlc_tick_t, bool);
|
||||
|
||||
class StreamPosition
|
||||
{
|
||||
public:
|
||||
StreamPosition();
|
||||
Times times;
|
||||
uint64_t number;
|
||||
double pos;
|
||||
};
|
||||
virtual bool reactivate(const StreamPosition &);
|
||||
virtual bool setPosition(const StreamPosition &, bool);
|
||||
bool getMediaPlaybackTimes(vlc_tick_t *, vlc_tick_t *, vlc_tick_t *) const;
|
||||
bool getMediaAdvanceAmount(vlc_tick_t *) const;
|
||||
void runUpdates();
|
||||
|
@ -70,9 +70,9 @@ void HLSStream::setMetadataTimeOffset(vlc_tick_t mpegts, vlc_tick_t muxed)
|
||||
fakeEsOut()->setAssociatedTimestamp(mpegts, muxed);
|
||||
}
|
||||
|
||||
bool HLSStream::setPosition(vlc_tick_t ts , bool b)
|
||||
bool HLSStream::setPosition(const StreamPosition &pos, bool b)
|
||||
{
|
||||
bool ok = AbstractStream::setPosition(ts ,b);
|
||||
bool ok = AbstractStream::setPosition(pos, b);
|
||||
if(b && ok)
|
||||
b_id3_timestamps_offset_set = false;
|
||||
return ok;
|
||||
|
@ -36,7 +36,7 @@ namespace hls
|
||||
virtual block_t *checkBlock(block_t *, bool) override;
|
||||
virtual AbstractDemuxer * newDemux(vlc_object_t *, const StreamFormat &,
|
||||
es_out_t *, AbstractSourceStream *) const override;
|
||||
virtual bool setPosition(vlc_tick_t, bool) override;
|
||||
virtual bool setPosition(const StreamPosition &, bool) override;
|
||||
virtual bool isContiguousMux() const override;
|
||||
|
||||
private:
|
||||
|
Loading…
Reference in New Issue
Block a user