1
mirror of https://code.videolan.org/videolan/vlc synced 2024-10-03 01:31:53 +02:00

demux: hls: parse and store discontinuity sequence numbers

This commit is contained in:
Francois Cartegnie 2021-01-19 09:54:54 +01:00 committed by Jean-Baptiste Kempf
parent 9c6099694b
commit eaa7ae479c
3 changed files with 30 additions and 7 deletions

View File

@ -48,6 +48,7 @@ ISegment::ISegment(const ICanonicalUrl *parent):
startTime.Set(0);
duration.Set(0);
sequence = 0;
discontinuitySequenceNumber = std::numeric_limits<uint64_t>::max();
templated = false;
discontinuity = false;
displayTime = VLC_TICK_INVALID;
@ -137,6 +138,16 @@ uint64_t ISegment::getSequenceNumber() const
return sequence;
}
void ISegment::setDiscontinuitySequenceNumber(uint64_t seq)
{
discontinuitySequenceNumber = seq;
}
uint64_t ISegment::getDiscontinuitySequenceNumber() const
{
return discontinuitySequenceNumber;
}
size_t ISegment::getOffset() const
{
return startByte;
@ -153,6 +164,12 @@ void ISegment::debug(vlc_object_t *obj, int indent) const
if(startTime.Get() > 0)
ss << " stime " << startTime.Get();
ss << " duration " << duration.Get();
if(discontinuity)
{
ss << " dty";
if(discontinuitySequenceNumber != std::numeric_limits<uint64_t>::max())
ss << "#" << discontinuitySequenceNumber;
}
msg_Dbg(obj, "%s", ss.str().c_str());
}

View File

@ -69,6 +69,8 @@ namespace adaptive
virtual void setByteRange (size_t start, size_t end);
virtual void setSequenceNumber(uint64_t);
virtual uint64_t getSequenceNumber() const;
virtual void setDiscontinuitySequenceNumber(uint64_t);
virtual uint64_t getDiscontinuitySequenceNumber() const;
virtual bool isTemplate () const;
virtual size_t getOffset () const;
virtual void debug (vlc_object_t *,int = 0) const;
@ -91,6 +93,7 @@ namespace adaptive
std::string debugName;
bool templated;
uint64_t sequence;
uint64_t discontinuitySequenceNumber;
vlc_tick_t displayTime;
};

View File

@ -228,6 +228,7 @@ void M3U8Parser::parseSegments(vlc_object_t *, HLSRepresentation *rep, const std
vlc_tick_t nzStartTime = 0;
vlc_tick_t absReferenceTime = VLC_TICK_INVALID;
uint64_t sequenceNumber = 0;
uint64_t discontinuitySequence = 0;
bool discontinuity = false;
std::size_t prevbyterangeoffset = 0;
const SingleValueTag *ctx_byterange = nullptr;
@ -301,12 +302,9 @@ void M3U8Parser::parseSegments(vlc_object_t *, HLSRepresentation *rep, const std
segment->setByteRange(range.first, prevbyterangeoffset - 1);
ctx_byterange = nullptr;
}
if(discontinuity)
{
segment->discontinuity = true;
discontinuity = false;
}
segment->setDiscontinuitySequenceNumber(discontinuitySequence);
segment->discontinuity = discontinuity;
discontinuity = false;
if(encryption.method != CommonEncryption::Method::None)
segment->setEncryption(encryption);
@ -373,8 +371,13 @@ void M3U8Parser::parseSegments(vlc_object_t *, HLSRepresentation *rep, const std
}
break;
case SingleValueTag::EXTXDISCONTINUITYSEQUENCE:
discontinuitySequence = static_cast<const SingleValueTag *>(tag)->getValue().decimal();
break;
case Tag::EXTXDISCONTINUITY:
discontinuity = true;
discontinuity = true;
discontinuitySequence++;
break;
case Tag::EXTXENDLIST: