[vlc-commits] demux: adaptive: remove chunk to segment reference & refcounting
Francois Cartegnie
git at videolan.org
Fri May 24 23:43:16 CEST 2019
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Thu May 23 16:38:08 2019 +0200| [ea1838ef6b8401a690b07d4fdd6c3d034496c186] | committer: Francois Cartegnie
demux: adaptive: remove chunk to segment reference & refcounting
Only copy all properties so we can prune playlist at will
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=ea1838ef6b8401a690b07d4fdd6c3d034496c186
---
modules/demux/adaptive/playlist/Segment.cpp | 22 +++++++++------
modules/demux/adaptive/playlist/Segment.h | 8 ++----
modules/demux/adaptive/playlist/SegmentChunk.cpp | 9 +-----
modules/demux/adaptive/playlist/SegmentChunk.hpp | 7 ++---
modules/demux/adaptive/playlist/SegmentList.cpp | 3 --
modules/demux/dash/mpd/DASHSegment.cpp | 33 ++++++++++++++++++----
modules/demux/dash/mpd/DASHSegment.h | 14 +++++++--
modules/demux/hls/playlist/HLSSegment.cpp | 1 -
.../demux/smooth/playlist/ForgedInitSegment.cpp | 2 +-
modules/demux/smooth/playlist/SmoothSegment.cpp | 30 ++++++++++++++++++--
modules/demux/smooth/playlist/SmoothSegment.hpp | 14 +++++++--
11 files changed, 98 insertions(+), 45 deletions(-)
diff --git a/modules/demux/adaptive/playlist/Segment.cpp b/modules/demux/adaptive/playlist/Segment.cpp
index 21b0707286..fee0ffe4dc 100644
--- a/modules/demux/adaptive/playlist/Segment.cpp
+++ b/modules/demux/adaptive/playlist/Segment.cpp
@@ -51,7 +51,6 @@ ISegment::ISegment(const ICanonicalUrl *parent):
classId = CLASSID_ISEGMENT;
startTime.Set(0);
duration.Set(0);
- chunksuse.Set(0);
sequence = SEQUENCE_INVALID;
templated = false;
discontinuity = false;
@@ -59,12 +58,6 @@ ISegment::ISegment(const ICanonicalUrl *parent):
ISegment::~ISegment()
{
- assert(chunksuse.Get() == 0);
-}
-
-void ISegment::onChunkDownload(block_t **, SegmentChunk *, BaseRepresentation *)
-{
-
}
bool ISegment::prepareChunk(SharedResources *res, SegmentChunk *chunk, BaseRepresentation *rep)
@@ -96,9 +89,10 @@ SegmentChunk* ISegment::toChunk(SharedResources *res, AbstractConnectionManager
if(startByte != endByte)
source->setBytesRange(BytesRange(startByte, endByte));
- SegmentChunk *chunk = new (std::nothrow) SegmentChunk(this, source, rep);
+ SegmentChunk *chunk = createChunk(source, rep);
if(chunk)
{
+ chunk->discontinuity = discontinuity;
if(!prepareChunk(res, chunk, rep))
{
delete chunk;
@@ -203,6 +197,12 @@ Segment::Segment(ICanonicalUrl *parent) :
classId = CLASSID_SEGMENT;
}
+SegmentChunk* Segment::createChunk(AbstractChunkSource *source, BaseRepresentation *rep)
+{
+ /* act as factory */
+ return new (std::nothrow) SegmentChunk(source, rep);
+}
+
void Segment::addSubSegment(SubSegment *subsegment)
{
if(!subsegments.empty())
@@ -298,6 +298,12 @@ SubSegment::SubSegment(ISegment *main, size_t start, size_t end) :
classId = CLASSID_SUBSEGMENT;
}
+SegmentChunk* SubSegment::createChunk(AbstractChunkSource *source, BaseRepresentation *rep)
+{
+ /* act as factory */
+ return new (std::nothrow) SegmentChunk(source, rep);
+}
+
Url SubSegment::getUrlSegment() const
{
return getParentUrlSegment();
diff --git a/modules/demux/adaptive/playlist/Segment.h b/modules/demux/adaptive/playlist/Segment.h
index 28494ca2b6..10c481f041 100644
--- a/modules/demux/adaptive/playlist/Segment.h
+++ b/modules/demux/adaptive/playlist/Segment.h
@@ -64,6 +64,7 @@ namespace adaptive
*/
virtual SegmentChunk* toChunk (SharedResources *, AbstractConnectionManager *,
size_t, BaseRepresentation *);
+ virtual SegmentChunk* createChunk (AbstractChunkSource *, BaseRepresentation *) = 0;
virtual void setByteRange (size_t start, size_t end);
virtual void setSequenceNumber(uint64_t);
virtual uint64_t getSequenceNumber() const;
@@ -78,14 +79,9 @@ namespace adaptive
int getClassId () const;
Property<stime_t> startTime;
Property<stime_t> duration;
- Property<unsigned> chunksuse;
bool discontinuity;
static const int CLASSID_ISEGMENT = 0;
- /* callbacks */
- virtual void onChunkDownload (block_t **,
- SegmentChunk *,
- BaseRepresentation *);
protected:
virtual bool prepareChunk (SharedResources *,
@@ -107,6 +103,7 @@ namespace adaptive
public:
Segment( ICanonicalUrl *parent );
~Segment();
+ virtual SegmentChunk* createChunk(AbstractChunkSource *, BaseRepresentation *); /* impl */
virtual void setSourceUrl( const std::string &url );
virtual Url getUrlSegment() const; /* impl */
virtual std::vector<ISegment*> subSegments();
@@ -138,6 +135,7 @@ namespace adaptive
{
public:
SubSegment(ISegment *, size_t start, size_t end);
+ virtual SegmentChunk* createChunk(AbstractChunkSource *, BaseRepresentation *); /* impl */
virtual Url getUrlSegment() const; /* impl */
virtual std::vector<ISegment*> subSegments();
virtual void addSubSegment(SubSegment *);
diff --git a/modules/demux/adaptive/playlist/SegmentChunk.cpp b/modules/demux/adaptive/playlist/SegmentChunk.cpp
index 19ce1d5b74..666a9bef75 100644
--- a/modules/demux/adaptive/playlist/SegmentChunk.cpp
+++ b/modules/demux/adaptive/playlist/SegmentChunk.cpp
@@ -34,21 +34,15 @@ using namespace adaptive::playlist;
using namespace adaptive::encryption;
using namespace adaptive;
-SegmentChunk::SegmentChunk(ISegment *segment_, AbstractChunkSource *source,
- BaseRepresentation *rep_) :
+SegmentChunk::SegmentChunk(AbstractChunkSource *source, BaseRepresentation *rep_) :
AbstractChunk(source)
{
- segment = segment_;
- segment->chunksuse.Set(segment->chunksuse.Get() + 1);
rep = rep_;
- discontinuity = segment_->discontinuity;
encryptionSession = NULL;
}
SegmentChunk::~SegmentChunk()
{
- assert(segment->chunksuse.Get() > 0);
- segment->chunksuse.Set(segment->chunksuse.Get() - 1);
delete encryptionSession;
}
@@ -71,7 +65,6 @@ bool SegmentChunk::decrypt(block_t **pp_block)
void SegmentChunk::onDownload(block_t **pp_block)
{
decrypt(pp_block);
- segment->onChunkDownload(pp_block, this, rep);
}
StreamFormat SegmentChunk::getStreamFormat() const
diff --git a/modules/demux/adaptive/playlist/SegmentChunk.hpp b/modules/demux/adaptive/playlist/SegmentChunk.hpp
index 9807763a79..b4c90ab4db 100644
--- a/modules/demux/adaptive/playlist/SegmentChunk.hpp
+++ b/modules/demux/adaptive/playlist/SegmentChunk.hpp
@@ -21,7 +21,6 @@
#define SEGMENTCHUNK_HPP
#include <string>
-#include "ICanonicalUrl.hpp"
#include "../http/Chunk.h"
#include "../StreamFormat.hpp"
@@ -38,12 +37,11 @@ namespace adaptive
using namespace encryption;
class BaseRepresentation;
- class ISegment;
class SegmentChunk : public AbstractChunk
{
public:
- SegmentChunk(ISegment *segment, AbstractChunkSource *, BaseRepresentation *);
+ SegmentChunk(AbstractChunkSource *, BaseRepresentation *);
virtual ~SegmentChunk();
void setEncryptionSession(CommonEncryptionSession *);
StreamFormat getStreamFormat() const;
@@ -51,8 +49,7 @@ namespace adaptive
protected:
bool decrypt(block_t **);
- virtual void onDownload(block_t **); // reimpl
- ISegment *segment;
+ virtual void onDownload(block_t **); /* impl */
BaseRepresentation *rep;
CommonEncryptionSession *encryptionSession;
};
diff --git a/modules/demux/adaptive/playlist/SegmentList.cpp b/modules/demux/adaptive/playlist/SegmentList.cpp
index b359ff7753..4813425c7e 100644
--- a/modules/demux/adaptive/playlist/SegmentList.cpp
+++ b/modules/demux/adaptive/playlist/SegmentList.cpp
@@ -118,9 +118,6 @@ void SegmentList::pruneBySegmentNumber(uint64_t tobelownum)
if(seg->getSequenceNumber() >= tobelownum)
break;
- if(seg->chunksuse.Get()) /* can't prune from here, still in use */
- break;
-
delete *it;
it = segments.erase(it);
}
diff --git a/modules/demux/dash/mpd/DASHSegment.cpp b/modules/demux/dash/mpd/DASHSegment.cpp
index c21b201e0d..455cf9132d 100644
--- a/modules/demux/dash/mpd/DASHSegment.cpp
+++ b/modules/demux/dash/mpd/DASHSegment.cpp
@@ -30,22 +30,45 @@
#include "../adaptive/playlist/BaseRepresentation.h"
#include "../mp4/IndexReader.hpp"
#include "../adaptive/playlist/AbstractPlaylist.hpp"
-#include "../adaptive/playlist/SegmentChunk.hpp"
using namespace adaptive::playlist;
using namespace dash::mpd;
using namespace dash::mp4;
-DashIndexSegment::DashIndexSegment(ICanonicalUrl *parent) :
- IndexSegment(parent)
+DashIndexChunk::DashIndexChunk(AbstractChunkSource *source, BaseRepresentation *rep)
+ : SegmentChunk(source, rep)
+{
+
+}
+
+DashIndexChunk::~DashIndexChunk()
{
+
}
-void DashIndexSegment::onChunkDownload(block_t **pp_block, SegmentChunk *p_chunk, BaseRepresentation *rep)
+void DashIndexChunk::onDownload(block_t **pp_block)
{
+ decrypt(pp_block);
+
if(!rep || ((*pp_block)->i_flags & BLOCK_FLAG_HEADER) == 0 )
return;
IndexReader br(rep->getPlaylist()->getVLCObject());
- br.parseIndex(*pp_block, rep, p_chunk->getStartByteInFile());
+ br.parseIndex(*pp_block, rep, getStartByteInFile());
+}
+
+DashIndexSegment::DashIndexSegment(ICanonicalUrl *parent) :
+ IndexSegment(parent)
+{
+}
+
+DashIndexSegment::~DashIndexSegment()
+{
+
+}
+
+SegmentChunk* DashIndexSegment::createChunk(AbstractChunkSource *source, BaseRepresentation *rep)
+{
+ /* act as factory */
+ return new (std::nothrow) DashIndexChunk(source, rep);
}
diff --git a/modules/demux/dash/mpd/DASHSegment.h b/modules/demux/dash/mpd/DASHSegment.h
index 70a2d21aed..5aa21db9d3 100644
--- a/modules/demux/dash/mpd/DASHSegment.h
+++ b/modules/demux/dash/mpd/DASHSegment.h
@@ -26,6 +26,7 @@
#define DASHSEGMENT_H_
#include "../adaptive/playlist/Segment.h"
+#include "../adaptive/playlist/SegmentChunk.hpp"
namespace dash
{
@@ -34,13 +35,20 @@ namespace dash
using namespace adaptive::playlist;
using namespace adaptive::http;
+ class DashIndexChunk : public SegmentChunk
+ {
+ public:
+ DashIndexChunk(AbstractChunkSource *, BaseRepresentation *);
+ ~DashIndexChunk();
+ virtual void onDownload(block_t **); /* reimpl */
+ };
+
class DashIndexSegment : public IndexSegment
{
public:
DashIndexSegment( ICanonicalUrl *parent );
-
- protected:
- virtual void onChunkDownload(block_t **, SegmentChunk *, BaseRepresentation *); //reimpl
+ ~DashIndexSegment();
+ virtual SegmentChunk* createChunk(AbstractChunkSource *, BaseRepresentation *); /* reimpl */
};
}
diff --git a/modules/demux/hls/playlist/HLSSegment.cpp b/modules/demux/hls/playlist/HLSSegment.cpp
index 9b3f671851..6f7c13e7d1 100644
--- a/modules/demux/hls/playlist/HLSSegment.cpp
+++ b/modules/demux/hls/playlist/HLSSegment.cpp
@@ -22,7 +22,6 @@
#endif
#include "HLSSegment.hpp"
-#include "../adaptive/playlist/SegmentChunk.hpp"
#include "../adaptive/playlist/BaseRepresentation.h"
diff --git a/modules/demux/smooth/playlist/ForgedInitSegment.cpp b/modules/demux/smooth/playlist/ForgedInitSegment.cpp
index cbd364fde9..4a7c2d3857 100644
--- a/modules/demux/smooth/playlist/ForgedInitSegment.cpp
+++ b/modules/demux/smooth/playlist/ForgedInitSegment.cpp
@@ -327,7 +327,7 @@ SegmentChunk* ForgedInitSegment::toChunk(SharedResources *, AbstractConnectionMa
MemoryChunkSource *source = new (std::nothrow) MemoryChunkSource(moov);
if( source )
{
- SegmentChunk *chunk = new (std::nothrow) SegmentChunk(this, source, rep);
+ SegmentChunk *chunk = new (std::nothrow) SegmentChunk(source, rep);
if( chunk )
return chunk;
else
diff --git a/modules/demux/smooth/playlist/SmoothSegment.cpp b/modules/demux/smooth/playlist/SmoothSegment.cpp
index 186258b3a9..24d0665199 100644
--- a/modules/demux/smooth/playlist/SmoothSegment.cpp
+++ b/modules/demux/smooth/playlist/SmoothSegment.cpp
@@ -30,17 +30,41 @@
using namespace smooth::playlist;
using namespace smooth::mp4;
-SmoothSegment::SmoothSegment(SegmentInformation *parent) :
- MediaSegmentTemplate( parent )
+SmoothSegmentChunk::SmoothSegmentChunk(AbstractChunkSource *source, BaseRepresentation *rep)
+ : SegmentChunk(source, rep)
+{
+
+}
+
+SmoothSegmentChunk::~SmoothSegmentChunk()
{
}
-void SmoothSegment::onChunkDownload(block_t **pp_block, SegmentChunk *, BaseRepresentation *rep)
+void SmoothSegmentChunk::onDownload(block_t **pp_block)
{
+ decrypt(pp_block);
+
if(!rep || ((*pp_block)->i_flags & BLOCK_FLAG_HEADER) == 0)
return;
IndexReader br(rep->getPlaylist()->getVLCObject());
br.parseIndex(*pp_block, rep);
}
+
+SmoothSegment::SmoothSegment(SegmentInformation *parent) :
+ MediaSegmentTemplate( parent )
+{
+
+}
+
+SmoothSegment::~SmoothSegment()
+{
+
+}
+
+SegmentChunk* SmoothSegment::createChunk(AbstractChunkSource *source, BaseRepresentation *rep)
+{
+ /* act as factory */
+ return new (std::nothrow) SmoothSegmentChunk(source, rep);
+}
diff --git a/modules/demux/smooth/playlist/SmoothSegment.hpp b/modules/demux/smooth/playlist/SmoothSegment.hpp
index 307d8fdf31..8fb9f91cdc 100644
--- a/modules/demux/smooth/playlist/SmoothSegment.hpp
+++ b/modules/demux/smooth/playlist/SmoothSegment.hpp
@@ -21,6 +21,7 @@
#define SMOOTHSEGMENT_HPP
#include "../adaptive/playlist/SegmentTemplate.h"
+#include "../adaptive/playlist/SegmentChunk.hpp"
namespace smooth
{
@@ -28,13 +29,20 @@ namespace smooth
{
using namespace adaptive::playlist;
+ class SmoothSegmentChunk : public SegmentChunk
+ {
+ public:
+ SmoothSegmentChunk(AbstractChunkSource *, BaseRepresentation *);
+ ~SmoothSegmentChunk();
+ virtual void onDownload(block_t **); /* reimpl */
+ };
+
class SmoothSegment : public MediaSegmentTemplate
{
public:
SmoothSegment(SegmentInformation * = NULL);
-
- protected:
- virtual void onChunkDownload(block_t **, SegmentChunk *, BaseRepresentation *); //reimpl
+ ~SmoothSegment();
+ virtual SegmentChunk* createChunk(AbstractChunkSource *, BaseRepresentation *); /* reimpl */
};
}
}
More information about the vlc-commits
mailing list