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

Code refactoring (FragmentModel) #3210

Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
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
43 changes: 0 additions & 43 deletions src/mss/MssEvents.js

This file was deleted.

112 changes: 37 additions & 75 deletions src/mss/MssFragmentInfoController.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,30 +29,23 @@
* POSSIBILITY OF SUCH DAMAGE.
*/

import MssEvents from './MssEvents';
import MSSFragmentMoofProcessor from './MssFragmentMoofProcessor';
import FragmentRequest from '../streaming/vo/FragmentRequest';

function MssFragmentInfoController(config) {

config = config || {};
const context = this.context;

let instance,
logger,
fragmentModel,
started,
type,
bufferTimeout,
loadFragmentTimeout,
startTime,
startFragmentTime,
index;

const streamProcessor = config.streamProcessor;
const eventBus = config.eventBus;
const dashMetrics = config.dashMetrics;
const playbackController = config.playbackController;
const ISOBoxer = config.ISOBoxer;
const baseURLController = config.baseURLController;
const debug = config.debug;
const controllerType = 'MssFragmentInfoController';
Expand All @@ -62,25 +55,18 @@ function MssFragmentInfoController(config) {
}

function initialize() {
started = false;
type = streamProcessor.getType();
fragmentModel = streamProcessor.getFragmentModel();

started = false;
startTime = null;
startFragmentTime = null;

// Register to StreamProcessor as external controller
streamProcessor.registerExternalController(instance);
type = streamProcessor.getType();
fragmentModel = streamProcessor.getFragmentModel();
}

function doStart() {
if (started === true) {
return;
}
function start() {
if (started) return;

logger.debug('Do start');

eventBus.on(MssEvents.FRAGMENT_INFO_LOADING_COMPLETED, onFragmentInfoLoadedCompleted, instance);
logger.debug('Start');

started = true;
startTime = new Date().getTime();
Expand All @@ -89,32 +75,23 @@ function MssFragmentInfoController(config) {
loadNextFragmentInfo();
}

function doStop() {
if (!started) {
return;
}
logger.debug('Do stop');
function stop() {
if (!started) return;

eventBus.off(MssEvents.FRAGMENT_INFO_LOADING_COMPLETED, onFragmentInfoLoadedCompleted, instance);
logger.debug('Stop');

// Stop buffering process
clearTimeout(bufferTimeout);
clearTimeout(loadFragmentTimeout);
started = false;

startTime = null;
startFragmentTime = null;
}

function reset() {
doStop();
streamProcessor.unregisterExternalController(instance);
stop();
}

function loadNextFragmentInfo() {
// Check if running state
if (!started) {
return;
}
if (!started) return;

// Get last segment from SegmentTimeline
const representation = getCurrentRepresentation();
Expand All @@ -123,7 +100,7 @@ function MssFragmentInfoController(config) {
const segments = adaptation.SegmentTemplate.SegmentTimeline.S_asArray;
const segment = segments[segments.length - 1];

logger.debug('Last fragment time: ' + (segment.t / adaptation.SegmentTemplate.timescale));
// logger.debug('Last fragment time: ' + (segment.t / adaptation.SegmentTemplate.timescale));

// Generate segment request
const request = getRequestForSegment(adaptation, representation, segment);
Expand All @@ -132,14 +109,6 @@ function MssFragmentInfoController(config) {
requestFragment.call(this, request);
}

function delayLoadNextFragmentInfo(delay) {
clearTimeout(bufferTimeout);
bufferTimeout = setTimeout(function () {
bufferTimeout = null;
loadNextFragmentInfo();
}, delay * 1000);
}

function getRequestForSegment(adaptation, representation, segment) {
let timescale = adaptation.SegmentTemplate.timescale;
let request = new FragmentRequest();
Expand Down Expand Up @@ -169,59 +138,51 @@ function MssFragmentInfoController(config) {
function getCurrentRepresentation() {
const representationController = streamProcessor.getRepresentationController();
const representation = representationController.getCurrentRepresentation();

return representation;
}

function requestFragment(request) {

logger.debug('Load fragment for time: ' + request.startTime);
// logger.debug('Load FragmentInfo for time: ' + request.startTime);
if (streamProcessor.getFragmentModel().isFragmentLoadedOrPending(request)) {
// We may have reached end of timeline in case of start-over streams
logger.debug('No more fragments');
logger.debug('End of timeline');
stop();
return;
}

fragmentModel.executeRequest(request);
}

function onFragmentInfoLoadedCompleted(e) {
if (e.streamProcessor !== streamProcessor) {
return;
}
function fragmentInfoLoaded (e) {
if (!started) return;

const request = e.fragmentInfo.request;
if (!e.fragmentInfo.response) {
const request = e.request;
if (!e.response) {
logger.error('Load error', request.url);
return;
}

let deltaFragmentTime,
deltaTime;
deltaTime,
delay;

logger.debug('FragmentInfo loaded: ', request.url);
// logger.debug('FragmentInfo loaded: ', request.url);

if (!startFragmentTime) {
startFragmentTime = request.startTime;
}

try {
// Process FramgentInfo in order to update segment timeline (DVR window)
const mssFragmentMoofProcessor = MSSFragmentMoofProcessor(context).create({
dashMetrics: dashMetrics,
playbackController: playbackController,
ISOBoxer: ISOBoxer,
eventBus: eventBus,
debug: debug
});
mssFragmentMoofProcessor.updateSegmentList(e.fragmentInfo, streamProcessor);

deltaTime = (new Date().getTime() - startTime) / 1000;
deltaFragmentTime = (request.startTime + request.duration) - startFragmentTime;
delayLoadNextFragmentInfo(Math.max(0, (deltaFragmentTime - deltaTime)));
} catch (e) {
logger.fatal('Internal error while processing fragment info segment ');
}
// Determine delay before requesting next FragmentInfo
deltaTime = (new Date().getTime() - startTime) / 1000;
deltaFragmentTime = (request.startTime + request.duration) - startFragmentTime;
delay = Math.max(0, (deltaFragmentTime - deltaTime));

// Set timeout for requesting next FragmentInfo
clearTimeout(loadFragmentTimeout);
loadFragmentTimeout = setTimeout(function () {
loadFragmentTimeout = null;
loadNextFragmentInfo();
}, delay * 1000);
}

function getType() {
Expand All @@ -231,7 +192,8 @@ function MssFragmentInfoController(config) {
instance = {
initialize: initialize,
controllerType: controllerType,
start: doStart,
start: start,
fragmentInfoLoaded: fragmentInfoLoaded,
getType: getType,
reset: reset
};
Expand Down
22 changes: 11 additions & 11 deletions src/mss/MssFragmentMoofProcessor.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ function MssFragmentMoofProcessor(config) {

type = streamProcessor.getType();

// Process tfrf only for live streams or start-over static streams (timeShiftBufferDepth > 0)
if (manifest.type !== 'dynamic' && !manifest.timeShiftBufferDepth) {
return;
}
Expand Down Expand Up @@ -102,16 +103,15 @@ function MssFragmentMoofProcessor(config) {
}
}

logger.debug('entry - t = ', (entry.fragment_absolute_time / timescale));
// logger.debug('entry - t = ', (entry.fragment_absolute_time / timescale));

// Get last segment time
segmentTime = segments[segments.length - 1].tManifest ? parseFloat(segments[segments.length - 1].tManifest) : segments[segments.length - 1].t;
logger.debug('Last segment - t = ', (segmentTime / timescale));
// logger.debug('Last segment - t = ', (segmentTime / timescale));

// Check if we have to append new segment to timeline
if (entry.fragment_absolute_time <= segmentTime) {
// Update DVR window range
// => set range end to end time of current segment
// Update DVR window range => set range end to end time of current segment
range = {
start: segments[0].t / timescale,
end: (tfdt.baseMediaDecodeTime / timescale) + request.duration
Expand All @@ -121,7 +121,7 @@ function MssFragmentMoofProcessor(config) {
return;
}

logger.debug('Add new segment - t = ', (entry.fragment_absolute_time / timescale));
// logger.debug('Add new segment - t = ', (entry.fragment_absolute_time / timescale));
segment = {};
segment.t = entry.fragment_absolute_time;
segment.d = entry.fragment_duration;
Expand Down Expand Up @@ -155,7 +155,7 @@ function MssFragmentMoofProcessor(config) {
// Remove segments prior to availability start time
segment = segments[0];
while (Math.round(segment.t / timescale) < availabilityStartTime) {
logger.debug('Remove segment - t = ' + (segment.t / timescale));
// logger.debug('Remove segment - t = ' + (segment.t / timescale));
segments.splice(0, 1);
segment = segments[0];
}
Expand All @@ -175,7 +175,7 @@ function MssFragmentMoofProcessor(config) {
function updateDVR(type, range, manifestInfo) {
const dvrInfos = dashMetrics.getCurrentDVRInfo(type);
if (!dvrInfos || (range.end > dvrInfos.range.end)) {
logger.debug('Update DVR Infos [' + range.start + ' - ' + range.end + ']');
logger.debug('Update DVR range: [' + range.start + ' - ' + range.end + ']');
dashMetrics.addDVRInfo(type, playbackController.getTime(), manifestInfo, range);
}
}
Expand All @@ -194,7 +194,7 @@ function MssFragmentMoofProcessor(config) {
return offset;
}

function convertFragment(e, sp) {
function convertFragment(e, streamProcessor) {
let i;

// e.request contains request description object
Expand Down Expand Up @@ -224,7 +224,7 @@ function MssFragmentMoofProcessor(config) {
tfxd = null;
}
let tfrf = isoFile.fetch('tfrf');
processTfrf(e.request, tfrf, tfdt, sp);
processTfrf(e.request, tfrf, tfdt, streamProcessor);
if (tfrf) {
tfrf._parent.boxes.splice(tfrf._parent.boxes.indexOf(tfrf), 1);
tfrf = null;
Expand Down Expand Up @@ -290,7 +290,7 @@ function MssFragmentMoofProcessor(config) {
e.response = isoFile.write();
}

function updateSegmentList(e, sp) {
function updateSegmentList(e, streamProcessor) {
// e.request contains request description object
// e.response contains fragment bytes
if (!e.response) {
Expand All @@ -313,7 +313,7 @@ function MssFragmentMoofProcessor(config) {
}

let tfrf = isoFile.fetch('tfrf');
processTfrf(e.request, tfrf, tfdt, sp);
processTfrf(e.request, tfrf, tfdt, streamProcessor);
if (tfrf) {
tfrf._parent.boxes.splice(tfrf._parent.boxes.indexOf(tfrf), 1);
tfrf = null;
Expand Down
Loading