Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor transmuxing data flow #199

Merged
merged 23 commits into from
Mar 26, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
64728e7
Refactor transmuxing workflow
Mar 13, 2019
599016b
Create NonProgressiveDemuxer as a base class for demuxers which do no…
Mar 20, 2019
65dc7ee
Implement flush in non-worker context
Mar 1, 2019
e36a6cc
Refactor flush interface
Feb 28, 2019
ed76300
Implement cmaf sample counting for duration computation, avoid assign…
Mar 1, 2019
def0281
Implement NonProgressiveDemuxer for TS Demuxing; wire up flush in aud…
Mar 20, 2019
0b0131b
Extend all demuxers with NonProgressiveDemuxer; fix errors in audio/s…
Mar 20, 2019
61c5744
Address feedback
Mar 20, 2019
ff9c1fe
Address transmuxing bugs
Mar 20, 2019
3192fff
Implement shared dummyTrack function
Mar 20, 2019
ba414c8
Implement caching for demuxer probing
Mar 21, 2019
21a04a8
Ensure that demuxer tracks always exist
Mar 21, 2019
1477062
Handle AES-128 decryption with flush
Mar 22, 2019
fcacb43
Fix gaps caused by erroneous demuxer reset
Mar 22, 2019
d2c9ce9
Fix backtracking stall during live streams
Mar 22, 2019
8479379
Remove console logs
Mar 22, 2019
a357b0f
Clear text & id3 samples after remuxing
Mar 22, 2019
bb2ceb4
Fix reference to this.demuxer in stream-controller
Mar 22, 2019
6b5cea5
Pass in fragment data as an ArrayBuffer to the decrypter
Mar 22, 2019
17e70c6
Ensure that the initSegment is reset upon muxer creation
Mar 25, 2019
13ccd6a
Reset nextLoadPosition of the fragment load was aborted
Mar 25, 2019
6f2ef77
Remove logs
Mar 25, 2019
f315427
Ensure that initSegment data is passed through during remuxer initial…
Mar 25, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
467 changes: 233 additions & 234 deletions src/controller/audio-stream-controller.js

Large diffs are not rendered by default.

39 changes: 22 additions & 17 deletions src/controller/base-stream-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@ export default class BaseStreamController extends TaskLoop {
}
this.fragmentTracker.removeFragment(frag);
}
if (this.demuxer) {
this.demuxer.destroy();
this.demuxer = null;
if (this.transmuxer) {
this.transmuxer.destroy();
this.transmuxer = null;
}
this.fragCurrent = null;
this.fragPrevious = null;
Expand Down Expand Up @@ -141,12 +141,6 @@ export default class BaseStreamController extends TaskLoop {
data.frag = frag;
this.hls.trigger(Event.FRAG_LOADED, data);
this._handleFragmentLoad(frag, payload, stats);
})
.catch((e) => {
if (e.data.details === ErrorDetails.INTERNAL_ABORTED) {
return;
}
this.hls.trigger(Event.ERROR, e.data);
});
}

Expand All @@ -164,12 +158,6 @@ export default class BaseStreamController extends TaskLoop {
stats.tparsed = stats.tbuffered = window.performance.now();
hls.trigger(Event.FRAG_BUFFERED, { stats: stats, frag: fragCurrent, id: 'main' });
this.tick();
})
.catch((e) => {
if (e.data.details === ErrorDetails.INTERNAL_ABORTED) {
return;
}
this.hls.trigger(Event.ERROR, e.data);
});
}

Expand All @@ -180,8 +168,25 @@ export default class BaseStreamController extends TaskLoop {
_doFragLoad (frag) {
this.state = State.FRAG_LOADING;
this.hls.trigger(Event.FRAG_LOADING, { frag });
return this.fragmentLoader.load(frag);
return this.fragmentLoader.load(frag)
.catch((e) => {
const errorData = e ? e.data : null;
if (errorData && errorData.details === ErrorDetails.INTERNAL_ABORTED) {
const fragPrev = this.fragPrevious;
if (fragPrev) {
this.nextLoadPosition = fragPrev.start + fragPrev.duration;
} else {
this.nextLoadPosition = this.lastCurrentTime;
}
logger.log(`Frag load aborted, resetting nextLoadPosition to ${this.nextLoadPosition}`);
return;
}
this.hls.trigger(Event.ERROR, errorData);
});
}

_handleFragmentLoad (frag, payload, stats) {}
_handleFragmentLoadComplete (frag, stats) {
const transmuxIdentifier = { level: frag.level, sn: frag.sn };
this.transmuxer.flush(transmuxIdentifier);
}
}
1 change: 1 addition & 0 deletions src/controller/buffer-controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ class BufferController extends EventHandler {
Events.BUFFER_FLUSHING,
Events.LEVEL_PTS_UPDATED,
Events.LEVEL_UPDATED);
this.hls = hls;
}

destroy () {
Expand Down
12 changes: 8 additions & 4 deletions src/controller/level-helper.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
/**
* @module LevelHelper
*
* Providing methods dealing with playlist sliding and drift
*
* TODO: Create an actual `Level` class/model that deals with all this logic in an object-oriented-manner.
*
* */

import { logger } from '../utils/logger';
Expand Down Expand Up @@ -227,3 +223,11 @@ export function computeReloadInterval (currentPlaylist, newPlaylist, lastRequest
// in any case, don't reload more than half of target duration
return Math.round(reloadInterval);
}

export function getFragmentWithSN (level, sn) {
if (!level || !level.details) {
return null;
}
const levelDetails = level.details;
return levelDetails.fragments[sn - levelDetails.startSN];
}
Loading