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:
parent
9c6099694b
commit
eaa7ae479c
@ -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());
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user