[vlc-commits] demux: adaptive: fix bitswitch/segment alignment use

Francois Cartegnie git at videolan.org
Thu May 9 17:19:42 CEST 2019


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Thu Apr 25 18:07:44 2019 +0200| [ce813fa7c9e0b0d6b45ac7d0f5540e159ae47203] | committer: Francois Cartegnie

demux: adaptive: fix bitswitch/segment alignment use

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=ce813fa7c9e0b0d6b45ac7d0f5540e159ae47203
---

 modules/demux/adaptive/SegmentTracker.cpp          |  2 +-
 .../demux/adaptive/playlist/BaseAdaptationSet.cpp  | 23 ++++++++++++++++------
 .../demux/adaptive/playlist/BaseAdaptationSet.h    |  9 ++++++---
 .../demux/adaptive/playlist/SegmentInformation.cpp | 14 -------------
 .../demux/adaptive/playlist/SegmentInformation.hpp | 18 ++++++++---------
 modules/demux/dash/mpd/IsoffMainParser.cpp         | 17 ++++++----------
 modules/demux/hls/playlist/Parser.cpp              |  1 +
 modules/demux/hls/playlist/Representation.cpp      |  1 -
 modules/demux/smooth/playlist/Representation.cpp   |  1 -
 9 files changed, 39 insertions(+), 47 deletions(-)

diff --git a/modules/demux/adaptive/SegmentTracker.cpp b/modules/demux/adaptive/SegmentTracker.cpp
index 321488a8fb..2d4fcf332f 100644
--- a/modules/demux/adaptive/SegmentTracker.cpp
+++ b/modules/demux/adaptive/SegmentTracker.cpp
@@ -154,7 +154,7 @@ SegmentChunk * SegmentTracker::getNextChunk(bool switch_allowed,
     }
 
     if( !switch_allowed ||
-       (curRepresentation && curRepresentation->getSwitchPolicy() == SegmentInformation::SWITCH_UNAVAILABLE) )
+       (curRepresentation && !curRepresentation->getAdaptationSet()->isSegmentAligned()) )
         rep = curRepresentation;
     else
         rep = logic->getNextRepresentation(adaptationSet, curRepresentation);
diff --git a/modules/demux/adaptive/playlist/BaseAdaptationSet.cpp b/modules/demux/adaptive/playlist/BaseAdaptationSet.cpp
index 8915cbf524..89d87f6834 100644
--- a/modules/demux/adaptive/playlist/BaseAdaptationSet.cpp
+++ b/modules/demux/adaptive/playlist/BaseAdaptationSet.cpp
@@ -43,9 +43,10 @@ using namespace adaptive::playlist;
 
 BaseAdaptationSet::BaseAdaptationSet(BasePeriod *period) :
     CommonAttributesElements(),
-    SegmentInformation( period ),
-    isBitstreamSwitching( false )
+    SegmentInformation( period )
 {
+    segmentAligned = TRIBOOL_UNKNOWN;
+    bitswitchAble = TRIBOOL_UNKNOWN;
 }
 
 BaseAdaptationSet::~BaseAdaptationSet   ()
@@ -88,14 +89,24 @@ void BaseAdaptationSet::addRepresentation(BaseRepresentation *rep)
     childs.push_back(rep);
 }
 
-void BaseAdaptationSet::setSwitchPolicy  (bool value)
+void BaseAdaptationSet::setSegmentAligned(bool b)
 {
-    this->isBitstreamSwitching = value;
+    segmentAligned = b ? TRIBOOL_TRUE : TRIBOOL_FALSE;
 }
 
-bool BaseAdaptationSet::getBitstreamSwitching  () const
+void BaseAdaptationSet::setBitswitchAble(bool b)
 {
-    return this->isBitstreamSwitching;
+    bitswitchAble = b ? TRIBOOL_TRUE : TRIBOOL_FALSE;
+}
+
+bool BaseAdaptationSet::isSegmentAligned() const
+{
+    return segmentAligned != TRIBOOL_FALSE;
+}
+
+bool BaseAdaptationSet::isBitSwitchable() const
+{
+    return bitswitchAble == TRIBOOL_TRUE;
 }
 
 void BaseAdaptationSet::debug(vlc_object_t *obj, int indent) const
diff --git a/modules/demux/adaptive/playlist/BaseAdaptationSet.h b/modules/demux/adaptive/playlist/BaseAdaptationSet.h
index c7c7ddfbb4..c1688280f3 100644
--- a/modules/demux/adaptive/playlist/BaseAdaptationSet.h
+++ b/modules/demux/adaptive/playlist/BaseAdaptationSet.h
@@ -51,15 +51,18 @@ namespace adaptive
                 virtual StreamFormat            getStreamFormat() const; /*reimpl*/
                 std::vector<BaseRepresentation *>&  getRepresentations      ();
                 BaseRepresentation *            getRepresentationByID(const ID &);
-                void                            setSwitchPolicy(bool value);
-                bool                            getBitstreamSwitching() const;
+                void                            setSegmentAligned(bool);
+                bool                            isSegmentAligned() const;
+                void                            setBitswitchAble(bool);
+                bool                            isBitSwitchable() const;
                 void                            addRepresentation( BaseRepresentation *rep );
                 void                            debug(vlc_object_t *,int = 0) const;
                 Property<std::string>           description;
 
             protected:
                 std::vector<BaseRepresentation *>   representations;
-                bool                            isBitstreamSwitching;
+                Tribool                         segmentAligned;
+                Tribool                         bitswitchAble;
         };
     }
 }
diff --git a/modules/demux/adaptive/playlist/SegmentInformation.cpp b/modules/demux/adaptive/playlist/SegmentInformation.cpp
index 09740fd6d8..ba5e4e30c7 100644
--- a/modules/demux/adaptive/playlist/SegmentInformation.cpp
+++ b/modules/demux/adaptive/playlist/SegmentInformation.cpp
@@ -58,7 +58,6 @@ void SegmentInformation::init()
     segmentBase = NULL;
     segmentList = NULL;
     mediaSegmentTemplate = NULL;
-    switchpolicy = SWITCH_UNKNOWN;
 }
 
 SegmentInformation::~SegmentInformation()
@@ -511,14 +510,6 @@ uint64_t SegmentInformation::translateSegmentNumber(uint64_t num, const SegmentI
     return num;
 }
 
-SegmentInformation::SwitchPolicy SegmentInformation::getSwitchPolicy() const
-{
-    if(switchpolicy == SWITCH_UNKNOWN)
-        return (parent) ? parent->getSwitchPolicy() : SWITCH_UNAVAILABLE;
-    else
-        return switchpolicy;
-}
-
 vlc_tick_t SegmentInformation::getPeriodStart() const
 {
     if(parent)
@@ -612,11 +603,6 @@ void SegmentInformation::SplitUsingIndex(std::vector<SplitPoint> &splitlist)
     }
 }
 
-void SegmentInformation::setSwitchPolicy(SegmentInformation::SwitchPolicy policy)
-{
-    switchpolicy = policy;
-}
-
 Url SegmentInformation::getUrlSegment() const
 {
     if(baseUrl.Get() && baseUrl.Get()->hasScheme())
diff --git a/modules/demux/adaptive/playlist/SegmentInformation.hpp b/modules/demux/adaptive/playlist/SegmentInformation.hpp
index 74633b033b..0307d90985 100644
--- a/modules/demux/adaptive/playlist/SegmentInformation.hpp
+++ b/modules/demux/adaptive/playlist/SegmentInformation.hpp
@@ -37,6 +37,13 @@ namespace adaptive
         class AbstractPlaylist;
         class ISegment;
 
+        enum Tribool
+        {
+            TRIBOOL_UNKNOWN,
+            TRIBOOL_FALSE,
+            TRIBOOL_TRUE,
+        };
+
         /* common segment elements for period/adaptset/rep 5.3.9.1,
          * with properties inheritance */
         class SegmentInformation : public ICanonicalUrl,
@@ -48,14 +55,7 @@ namespace adaptive
                 SegmentInformation( SegmentInformation * = 0 );
                 explicit SegmentInformation( AbstractPlaylist * );
                 virtual ~SegmentInformation();
-                typedef enum SwitchPolicy
-                {
-                    SWITCH_UNKNOWN,
-                    SWITCH_UNAVAILABLE,
-                    SWITCH_SEGMENT_ALIGNED,
-                    SWITCH_BITSWITCHEABLE
-                } SwitchPolicy;
-                SwitchPolicy getSwitchPolicy() const;
+
                 virtual vlc_tick_t getPeriodStart() const;
                 virtual AbstractPlaylist *getPlaylist() const;
 
@@ -93,13 +93,11 @@ namespace adaptive
                 std::vector<SegmentInformation *> childs;
                 SegmentInformation * getChildByID( const ID & );
                 SegmentInformation *parent;
-                SwitchPolicy switchpolicy;
 
             public:
                 void appendSegmentList(SegmentList *, bool = false);
                 void setSegmentBase(SegmentBase *);
                 void setSegmentTemplate(MediaSegmentTemplate *);
-                void setSwitchPolicy(SwitchPolicy);
                 virtual Url getUrlSegment() const; /* impl */
                 Property<Url *> baseUrl;
 
diff --git a/modules/demux/dash/mpd/IsoffMainParser.cpp b/modules/demux/dash/mpd/IsoffMainParser.cpp
index d378c4e548..f742dd206c 100644
--- a/modules/demux/dash/mpd/IsoffMainParser.cpp
+++ b/modules/demux/dash/mpd/IsoffMainParser.cpp
@@ -205,17 +205,6 @@ size_t IsoffMainParser::parseSegmentInformation(Node *node, SegmentInformation *
     total += parseSegmentBase(DOMHelper::getFirstChildElementByName(node, "SegmentBase"), info);
     total += parseSegmentList(DOMHelper::getFirstChildElementByName(node, "SegmentList"), info);
     total += parseSegmentTemplate(DOMHelper::getFirstChildElementByName(node, "SegmentTemplate" ), info);
-    if(node->hasAttribute("bitstreamSwitching") && node->getAttributeValue("bitstreamSwitching") == "true")
-    {
-        info->setSwitchPolicy(SegmentInformation::SWITCH_BITSWITCHEABLE);
-    }
-    else if(node->hasAttribute("segmentAlignment"))
-    {
-        if( node->getAttributeValue("segmentAlignment") == "true" )
-            info->setSwitchPolicy(SegmentInformation::SWITCH_SEGMENT_ALIGNED);
-        else
-            info->setSwitchPolicy(SegmentInformation::SWITCH_UNAVAILABLE);
-    }
     if(node->hasAttribute("timescale"))
         info->setTimescale(Integer<uint64_t>(node->getAttributeValue("timescale")));
 
@@ -251,6 +240,12 @@ void    IsoffMainParser::parseAdaptationSets  (Node *periodNode, Period *period)
                 adaptationSet->addLang(lang);
         }
 
+        if((*it)->hasAttribute("bitstreamSwitching"))
+            adaptationSet->setBitswitchAble((*it)->getAttributeValue("bitstreamSwitching") == "true");
+
+        if((*it)->hasAttribute("segmentAlignment"))
+            adaptationSet->setSegmentAligned((*it)->getAttributeValue("segmentAlignment") == "true");
+
         Node *baseUrl = DOMHelper::getFirstChildElementByName((*it), "BaseURL");
         if(baseUrl)
             adaptationSet->baseUrl.Set(new Url(baseUrl->getText()));
diff --git a/modules/demux/hls/playlist/Parser.cpp b/modules/demux/hls/playlist/Parser.cpp
index 5d67e160a2..db4d72bbef 100644
--- a/modules/demux/hls/playlist/Parser.cpp
+++ b/modules/demux/hls/playlist/Parser.cpp
@@ -430,6 +430,7 @@ M3U8 * M3U8Parser::parse(vlc_object_t *p_object, stream_t *p_stream, const std::
         BaseAdaptationSet *adaptSet = new (std::nothrow) BaseAdaptationSet(period);
         if(adaptSet)
         {
+            /* adaptSet->setSegmentAligned(true); FIXME: based on streamformat */
             std::list<Tag *> streaminfotags = getTagsFromList(tagslist, AttributesTag::EXTXSTREAMINF);
             for(it = streaminfotags.begin(); it != streaminfotags.end(); ++it)
             {
diff --git a/modules/demux/hls/playlist/Representation.cpp b/modules/demux/hls/playlist/Representation.cpp
index 24722eb26d..10ada80508 100644
--- a/modules/demux/hls/playlist/Representation.cpp
+++ b/modules/demux/hls/playlist/Representation.cpp
@@ -42,7 +42,6 @@ Representation::Representation  ( BaseAdaptationSet *set ) :
 {
     b_live = true;
     b_loaded = false;
-    switchpolicy = SegmentInformation::SWITCH_SEGMENT_ALIGNED; /* FIXME: based on streamformat */
     nextUpdateTime = 0;
     targetDuration = 0;
     streamFormat = StreamFormat::UNKNOWN;
diff --git a/modules/demux/smooth/playlist/Representation.cpp b/modules/demux/smooth/playlist/Representation.cpp
index 98ba66816e..7a14ebc115 100644
--- a/modules/demux/smooth/playlist/Representation.cpp
+++ b/modules/demux/smooth/playlist/Representation.cpp
@@ -32,7 +32,6 @@ using namespace smooth::playlist;
 Representation::Representation  ( BaseAdaptationSet *set ) :
                 BaseRepresentation( set )
 {
-    switchpolicy = SegmentInformation::SWITCH_SEGMENT_ALIGNED;
 }
 
 Representation::~Representation ()



More information about the vlc-commits mailing list