[vlc-commits] stream_filter: dash: add subsegments
Francois Cartegnie
git at videolan.org
Thu Dec 18 22:39:48 CET 2014
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Sun Nov 23 14:20:09 2014 +0100| [0b80d62097623b46a7f1abb1b9c8180a002b3606] | committer: Francois Cartegnie
stream_filter: dash: add subsegments
We'll need to split single file, ranged chunks
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=0b80d62097623b46a7f1abb1b9c8180a002b3606
---
.../adaptationlogic/AlwaysBestAdaptationLogic.cpp | 2 +-
modules/stream_filter/dash/mpd/Segment.cpp | 136 +++++++++++++++-----
modules/stream_filter/dash/mpd/Segment.h | 56 ++++++--
3 files changed, 150 insertions(+), 44 deletions(-)
diff --git a/modules/stream_filter/dash/adaptationlogic/AlwaysBestAdaptationLogic.cpp b/modules/stream_filter/dash/adaptationlogic/AlwaysBestAdaptationLogic.cpp
index 568174d..c35ea2b 100644
--- a/modules/stream_filter/dash/adaptationlogic/AlwaysBestAdaptationLogic.cpp
+++ b/modules/stream_filter/dash/adaptationlogic/AlwaysBestAdaptationLogic.cpp
@@ -58,7 +58,7 @@ Chunk* AlwaysBestAdaptationLogic::getNextChunk()
const Representation *AlwaysBestAdaptationLogic::getCurrentRepresentation() const
{
if ( this->count < this->schedule.size() )
- return this->schedule.at( this->count )->getParentRepresentation();
+ return this->schedule.at( this->count )->getRepresentation();
return NULL;
}
diff --git a/modules/stream_filter/dash/mpd/Segment.cpp b/modules/stream_filter/dash/mpd/Segment.cpp
index 1649108..93d87b2 100644
--- a/modules/stream_filter/dash/mpd/Segment.cpp
+++ b/modules/stream_filter/dash/mpd/Segment.cpp
@@ -33,12 +33,56 @@
using namespace dash::mpd;
using namespace dash::http;
-Segment::Segment(const Representation *parent, bool isinit) :
- ICanonicalUrl( parent ),
- startByte (0),
- endByte (0),
+ISegment::ISegment(const ICanonicalUrl *parent):
+ ICanonicalUrl( parent ),
+ startByte (0),
+ endByte (0)
+{
+
+}
+
+dash::http::Chunk* ISegment::toChunk() const
+{
+ Chunk *chunk = new Chunk();
+ if (!chunk)
+ return NULL;
+
+ if(startByte != endByte)
+ {
+ chunk->setStartByte(startByte);
+ chunk->setEndByte(endByte);
+ }
+
+ chunk->setUrl(getUrlSegment());
+
+ return chunk;
+}
+
+bool ISegment::isSingleShot() const
+{
+ return true;
+}
+void ISegment::done()
+{
+ //Only used for a SegmentTemplate.
+}
+
+void ISegment::setByteRange(size_t start, size_t end)
+{
+ startByte = start;
+ endByte = end;
+}
+
+std::string ISegment::toString() const
+{
+ return std::string(" Segment url=").append(getUrlSegment());
+}
+
+Segment::Segment(Representation *parent, bool isinit, bool tosplit) :
+ ISegment(parent),
parentRepresentation( parent ),
- init( isinit )
+ init( isinit ),
+ needssplit( tosplit )
{
assert( parent != NULL );
if ( parent->getSegmentInfo() != NULL && parent->getSegmentInfo()->getDuration() >= 0 )
@@ -47,57 +91,89 @@ Segment::Segment(const Representation *parent, bool isinit) :
this->size = -1;
}
+Segment::~Segment()
+{
+ std::vector<SubSegment*>::iterator it;
+ for(it=subsegments.begin();it!=subsegments.end();it++)
+ delete *it;
+}
+
void Segment::setSourceUrl ( const std::string &url )
{
if ( url.empty() == false )
this->sourceUrl = url;
}
-bool Segment::isSingleShot () const
+
+bool Segment::needsSplit() const
{
- return true;
+ return needssplit;
}
-void Segment::done ()
+
+Representation *Segment::getRepresentation() const
{
- //Only used for a SegmentTemplate.
+ return parentRepresentation;
}
-void Segment::setByteRange (int start, int end)
+std::string Segment::getUrlSegment() const
{
- this->startByte = start;
- this->endByte = end;
+ std::string ret = getParentUrlSegment();
+ if (!sourceUrl.empty())
+ ret.append(sourceUrl);
+ return ret;
}
-dash::http::Chunk* Segment::toChunk ()
+dash::http::Chunk* Segment::toChunk() const
{
- Chunk *chunk = new Chunk();
+ Chunk *chunk = ISegment::toChunk();
+ if (chunk)
+ chunk->setBitrate(parentRepresentation->getBandwidth());
+ return chunk;
+}
- if(startByte != endByte)
+std::vector<ISegment*> Segment::subSegments()
+{
+ std::vector<ISegment*> list;
+ if(!subsegments.empty())
{
- chunk->setStartByte(startByte);
- chunk->setEndByte(endByte);
+ std::vector<SubSegment*>::iterator it;
+ for(it=subsegments.begin();it!=subsegments.end();it++)
+ list.push_back(*it);
}
+ else
+ {
+ list.push_back(this);
+ }
+ return list;
+}
- chunk->setUrl( getUrlSegment() );
-
- chunk->setBitrate(this->parentRepresentation->getBandwidth());
+std::string Segment::toString() const
+{
+ if (init)
+ return std::string(" InitSeg url=")
+ .append(getUrlSegment());
+ else
+ return ISegment::toString();
+}
- return chunk;
+SubSegment::SubSegment(Segment *main, size_t start, size_t end) :
+ ISegment(main), parent(main)
+{
+ setByteRange(start, end);
}
-const Representation *Segment::getParentRepresentation() const
+std::string SubSegment::getUrlSegment() const
{
- return this->parentRepresentation;
+ return getParentUrlSegment();
}
-std::string Segment::getUrlSegment() const
+std::vector<ISegment*> SubSegment::subSegments()
{
- std::string ret = getParentUrlSegment();
- if (!sourceUrl.empty())
- ret.append(sourceUrl);
- return ret;
+ std::vector<ISegment*> list;
+ list.push_back(this);
+ return list;
}
-bool Segment::isInit() const
+Representation *SubSegment::getRepresentation() const
{
- return init;
+ return parent->getRepresentation();
}
diff --git a/modules/stream_filter/dash/mpd/Segment.h b/modules/stream_filter/dash/mpd/Segment.h
index 65b8164..29edae9 100644
--- a/modules/stream_filter/dash/mpd/Segment.h
+++ b/modules/stream_filter/dash/mpd/Segment.h
@@ -37,32 +37,62 @@ namespace dash
namespace mpd
{
class Representation;
- class Segment : public ICanonicalUrl
+ class SubSegment;
+
+ class ISegment : public ICanonicalUrl
{
public:
- Segment( const Representation *parent, bool isinit = false );
- virtual ~Segment(){}
- virtual void setSourceUrl( const std::string &url );
+ ISegment(const ICanonicalUrl *parent);
+ virtual ~ISegment(){}
/**
* @return true if the segment should be dropped after being read.
* That is basically true when using an Url, and false
* when using an UrlTemplate
*/
virtual bool isSingleShot () const;
- virtual bool isInit () const;
virtual void done ();
- virtual void setByteRange (int start, int end);
- virtual dash::http::Chunk* toChunk ();
- const Representation* getParentRepresentation() const;
- virtual std::string getUrlSegment () const; /* impl */
+ virtual dash::http::Chunk* toChunk () const;
+ virtual void setByteRange (size_t start, size_t end);
+ virtual std::vector<ISegment*> subSegments () = 0;
+ virtual std::string toString () const;
+ virtual Representation* getRepresentation() const = 0;
protected:
- std::string sourceUrl;
size_t startByte;
size_t endByte;
- const Representation* parentRepresentation;
- int size;
- bool init;
+ };
+
+ class Segment : public ISegment
+ {
+ public:
+ Segment( Representation *parent, bool isinit = false, bool tosplit = false );
+ ~Segment();
+ virtual void setSourceUrl( const std::string &url );
+ virtual bool needsSplit() const;
+ virtual std::string getUrlSegment() const; /* impl */
+ virtual dash::http::Chunk* toChunk() const;
+ virtual std::vector<ISegment*> subSegments();
+ virtual std::string toString() const;
+ virtual Representation* getRepresentation() const;
+
+ protected:
+ Representation* parentRepresentation;
+ bool init;
+ bool needssplit;
+ std::vector<SubSegment *> subsegments;
+ std::string sourceUrl;
+ int size;
+ };
+
+ class SubSegment : public ISegment
+ {
+ public:
+ SubSegment(Segment *, size_t start, size_t end);
+ virtual std::string getUrlSegment() const; /* impl */
+ virtual std::vector<ISegment*> subSegments();
+ virtual Representation* getRepresentation() const;
+ private:
+ Segment *parent;
};
}
}
More information about the vlc-commits
mailing list