rx-player
Version:
Canal+ HTML5 Video Player
83 lines (82 loc) • 3.78 kB
JavaScript
;
/**
* Copyright 2015 CANAL+ Group
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = flattenOverlappingPeriods;
var log_1 = require("../../../../log");
/**
* Avoid periods to overlap.
*
* According to DASH guidelines, if a period has media duration longer than
* the distance between the start of this period and the start of the next period,
* use of start times implies that the client will start the playout of the next
* period at the time stated, rather than finishing the playout of the last period.
*
* Even if that case if defined when period last(s) segment(s) is/are a bit longer,
* it can be meaningful when two periods are overlapping. We will always shorten
* the first period, and even erase it if its duration is equal to zero.
*
* Example (Periods are numbered under their manifest order) :
*
* [ Period 1 ][ Period 2 ] ------> [ Period 1 ][ Period 3 ]
* [ Period 3 ]
*
* [ Period 1 ][ Period 2 ] ------> [ Period 1 ][ 2 ][ Period 3 ]
* [ Period 3 ]
*
* [ Period 1 ][ Period 2 ] ------> [ 1 ][ Period 3 ]
* [ Period 3 ]
*
* @param {Array.<Object>} parsedPeriods
* @return {Array.<Object>}
*/
function flattenOverlappingPeriods(parsedPeriods) {
if (parsedPeriods.length === 0) {
return [];
}
var flattenedPeriods = [parsedPeriods[0]];
for (var i = 1; i < parsedPeriods.length; i++) {
var parsedPeriod = parsedPeriods[i];
var lastFlattenedPeriod = flattenedPeriods[flattenedPeriods.length - 1];
while (lastFlattenedPeriod.duration === undefined ||
lastFlattenedPeriod.start + lastFlattenedPeriod.duration > parsedPeriod.start) {
log_1.default.warn("DASH: Updating overlapping Periods.", lastFlattenedPeriod === null || lastFlattenedPeriod === void 0 ? void 0 : lastFlattenedPeriod.start, parsedPeriod.start);
lastFlattenedPeriod.duration = parsedPeriod.start - lastFlattenedPeriod.start;
lastFlattenedPeriod.end = parsedPeriod.start;
if (lastFlattenedPeriod.duration > 0) {
// Note: Calling `break` to quit the while loop should theoritically be
// unnecessary as the previous operations should ensure we do not re-enter
// the loop's condition.
// Yet we dit encounter infinite loops without it because of float-related
// rounding errors.
break;
}
else {
// `lastFlattenedPeriod` has now a negative or `0` duration.
// Remove it, consider the next Period in its place, and re-start the loop.
flattenedPeriods.pop();
if (flattenedPeriods.length === 0) {
// There's no remaining Period to compare to `parsedPeriod`
break;
}
// Take the previous Period as reference and compare it now to `parsedPeriod`
lastFlattenedPeriod = flattenedPeriods[flattenedPeriods.length - 1];
}
}
flattenedPeriods.push(parsedPeriod);
}
return flattenedPeriods;
}