[vlc-commits] demux: adaptative: fix chained initializations bug
Francois Cartegnie
git at videolan.org
Wed Sep 9 11:46:30 CEST 2015
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Wed Sep 9 11:41:25 2015 +0200| [c1591aa1246bcc1c0dd292d64c2757443d2a354d] | committer: Francois Cartegnie
demux: adaptative: fix chained initializations bug
Since the bw adaptation can go really fast now,
we need to be sure to send at least 1 data segment
before switching to another.
Otherwise we'll have multiple moov bug and can
also never get any data outside of init segments.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=c1591aa1246bcc1c0dd292d64c2757443d2a354d
---
modules/demux/adaptative/SegmentTracker.cpp | 22 +++++++++++++++++-----
modules/demux/adaptative/SegmentTracker.hpp | 3 ++-
2 files changed, 19 insertions(+), 6 deletions(-)
diff --git a/modules/demux/adaptative/SegmentTracker.cpp b/modules/demux/adaptative/SegmentTracker.cpp
index e64ee11..dd23890 100644
--- a/modules/demux/adaptative/SegmentTracker.cpp
+++ b/modules/demux/adaptative/SegmentTracker.cpp
@@ -32,7 +32,8 @@ SegmentTracker::SegmentTracker(AbstractAdaptationLogic *logic_, BaseAdaptationSe
{
count = 0;
initializing = true;
- indexed = false;
+ index_sent = false;
+ init_sent = false;
prevRepresentation = NULL;
setAdaptationLogic(logic_);
adaptationSet = adaptSet;
@@ -62,6 +63,10 @@ SegmentChunk * SegmentTracker::getNextChunk(bool switch_allowed)
if(!adaptationSet)
return NULL;
+ /* Ensure we don't keep chaining init/index without data */
+ if( initializing && prevRepresentation )
+ switch_allowed = false;
+
if( !switch_allowed ||
(prevRepresentation && prevRepresentation->getSwitchPolicy() == SegmentInformation::SWITCH_UNAVAILABLE) )
rep = prevRepresentation;
@@ -74,20 +79,21 @@ SegmentChunk * SegmentTracker::getNextChunk(bool switch_allowed)
if(rep != prevRepresentation)
{
prevRepresentation = rep;
+ init_sent = false;
initializing = true;
}
- if(initializing)
+ if(!init_sent)
{
- initializing = false;
+ init_sent = true;
segment = rep->getSegment(BaseRepresentation::INFOTYPE_INIT);
if(segment)
return segment->toChunk(count, rep);
}
- if(!indexed)
+ if(!index_sent)
{
- indexed = true;
+ index_sent = true;
segment = rep->getSegment(BaseRepresentation::INFOTYPE_INDEX);
if(segment)
return segment->toChunk(count, rep);
@@ -99,6 +105,8 @@ SegmentChunk * SegmentTracker::getNextChunk(bool switch_allowed)
resetCounter();
return NULL;
}
+ /* stop initializing after 1st chunk */
+ initializing = false;
SegmentChunk *chunk = segment->toChunk(count, rep);
if(chunk)
@@ -116,7 +124,11 @@ bool SegmentTracker::setPosition(mtime_t time, bool restarted, bool tryonly)
if(!tryonly)
{
if(restarted)
+ {
initializing = true;
+ index_sent = false;
+ init_sent = false;
+ }
count = segcount;
}
return true;
diff --git a/modules/demux/adaptative/SegmentTracker.hpp b/modules/demux/adaptative/SegmentTracker.hpp
index 1f04100..023cf12 100644
--- a/modules/demux/adaptative/SegmentTracker.hpp
+++ b/modules/demux/adaptative/SegmentTracker.hpp
@@ -59,7 +59,8 @@ namespace adaptative
private:
bool initializing;
- bool indexed;
+ bool index_sent;
+ bool init_sent;
uint64_t count;
AbstractAdaptationLogic *logic;
BaseAdaptationSet *adaptationSet;
More information about the vlc-commits
mailing list