1
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:
Francois Cartegnie 2021-10-25 11:16:38 +02:00 committed by Jean-Baptiste Kempf
parent adb7bdc2f6
commit e009424c15
6 changed files with 40 additions and 17 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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();

View File

@ -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;

View File

@ -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: