Skip to content

Commit 03eb1c2

Browse files
committed
[FragmentLoader] Only use max video tags available to fix a Fragment
We assumed that current and emergency Fragments would have headers at same PTS, but it seems this may not be the case. Fortunately if we are fixing a Fragment all we need are video tags up to that PTS, regardless of others. We add some extra checking to be sure nothing strange happens.
1 parent 6795646 commit 03eb1c2

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

src/com/pivotshare/hls/loader/FragmentLoader.as

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1313,10 +1313,12 @@ package com.pivotshare.hls.loader {
13131313
if ((isNonIDRLevelUp && HLSSettings.recoverFromNonIDRLevelUp) ||
13141314
(isNonIDRLevelDown && HLSSettings.recoverFromNonIDRLevelDown)) {
13151315

1316+
// Setting isComplete here to prevent any weird race conditions
1317+
var isComplete = _emergencyFragmentDemuxedStream.complete;
13161318
_emergencyFragment = _emergencyFragmentDemuxedStream.getFragment();
13171319

1318-
// It's already been found
1319-
if (!isNaN(_emergencyFragment.data.pts_min_video_header)) {
1320+
// We have the necessary tags to fix
1321+
if (_emergencyFragment.data.pts_max_video >= _fragCurrent.data.pts_min_video_header) {
13201322
CONFIG::LOGGING {
13211323
Log.debug("FragmentLoader#_onDemuxComplete: Fragment[" +
13221324
_fragCurrent.level + "][" + _fragCurrent.seqnum + "] Will splice with previous Level for IDR start");
@@ -1332,19 +1334,30 @@ package com.pivotshare.hls.loader {
13321334
_emergencyFragmentDemuxedStream.close();
13331335
_emergencyFragmentDemuxedStream.removeEventListener(Event.COMPLETE, _onEmergencyDemuxedStreamComplete);
13341336
_emergencyFragmentDemuxedStream = null;
1335-
1336-
} else { // bail leaving _emergencyFragment callback to recall this callback :(
1337+
}
1338+
else if (!isComplete) { // bail leaving _emergencyFragment callback to recall this callback :(
13371339

13381340
// TODO: Edge where this may not complete in time - do we force buffer or drop fix?
13391341
_emergencyFragmentDemuxedStream.addEventListener(Event.COMPLETE, _onEmergencyDemuxedStreamComplete);
13401342

13411343
CONFIG::LOGGING {
13421344
Log.debug("FragmentLoader#_onDemuxComplete: Fragment[" +
1343-
_fragCurrent.level + "][" + _fragCurrent.seqnum + "] Cannot splice this non-IDR Fragment just yet");
1345+
_fragCurrent.level + "][" + _fragCurrent.seqnum +
1346+
"] Cannot splice this non-IDR Fragment just yet. bytesLoaded / bytesTotal: " +
1347+
_emergencyFragment.data.bytesLoaded + ' / ' +
1348+
_emergencyFragment.data.bytesTotal);
13441349
}
13451350

13461351
return;
13471352
}
1353+
else {
1354+
1355+
CONFIG::LOGGING {
1356+
Log.error("FragmentLoader#_onDemuxComplete: Fragment[" +
1357+
_fragCurrent.level + "][" + _fragCurrent.seqnum +
1358+
"] Emergency Fragment did not have necessary video (???)");
1359+
}
1360+
}
13481361
}
13491362
else if (HLSSettings.removePreIDRVideoTags) {
13501363
CONFIG::LOGGING {

0 commit comments

Comments
 (0)