Skip to content

Commit

Permalink
discontinuities: if no CC range in common, align sliding using PROGRA…
Browse files Browse the repository at this point in the history
…M-DATE-TIME (if available)

related to #1172
  • Loading branch information
mangui committed Aug 29, 2017
1 parent 44aed40 commit ae13d80
Show file tree
Hide file tree
Showing 2 changed files with 122 additions and 3 deletions.
15 changes: 14 additions & 1 deletion src/utils/discontinuities.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,23 @@ export function adjustPts(sliding, details) {
// as a reference
export function alignDiscontinuities(lastFrag, lastLevel, details) {
if (shouldAlignOnDiscontinuities(lastFrag, lastLevel, details)) {
logger.log('Adjusting PTS using last level due to CC increase within current level');
const referenceFrag = findDiscontinuousReferenceFrag(lastLevel.details, details);
if (referenceFrag) {
logger.log('Adjusting PTS using last level due to CC increase within current level');
adjustPts(referenceFrag.start, details);
} else if (lastLevel && lastLevel.details) {
// try to align using programDateTime attribute (if available)
// if last level sliding is 1000 and its first frag PROGRAM-DATE-TIME is 2017-08-20 1:10:00 AM
// and if new details first frag PROGRAM DATE-TIME is 2017-08-20 1:10:08 AM
// then we can deduce that playlist B sliding is 1000+8 = 1008s
let lastPDT = lastLevel.details.programDateTime;
let newPDT = details.programDateTime;
// date diff is in ms. frag.start is in seconds
let sliding = (newPDT - lastPDT)/1000 + lastLevel.details.fragments[0].start;
if (!isNaN(sliding)) {
logger.log(`no CC range in common between old and new playlist, adjusting using programDateTime delta, sliding:${sliding}`);
adjustPts(sliding,details);
}
}
}
}
110 changes: 108 additions & 2 deletions tests/unit/utils/discontinuities.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const assert = require('assert');

import { shouldAlignOnDiscontinuities, findDiscontinuousReferenceFrag, adjustPts } from '../../../src/utils/discontinuities';
import { shouldAlignOnDiscontinuities, findDiscontinuousReferenceFrag, adjustPts, alignDiscontinuities } from '../../../src/utils/discontinuities';

const mockReferenceFrag = {
start: 20,
Expand Down Expand Up @@ -40,7 +40,7 @@ const mockFrags = [


describe('level-helper', function () {
it ('adjusts level fragments using a reference fragment', function () {
it ('adjusts level fragments with overlapping CC range using a reference fragment', function () {
const details = {
fragments: mockFrags.slice(0),
PTSKnown: false
Expand Down Expand Up @@ -78,6 +78,112 @@ describe('level-helper', function () {
});


it ('adjusts level fragments without overlapping CC range but with programDateTime info', function () {

const lastFrag = { cc : 0 };
const lastLevel = {
details : {
PTSKnown : true,
programDateTime : new Date('2017-08-28 00:00:00'),
fragments : [
{
start: 20,
end: 24,
startPTS: 20,
endPTS: 24,
duration: 4,
cc: 0,
},
{
start: 24,
end: 28,
startPTS: 24,
endPTS: 28,
duration: 4,
cc: 1
},
{
start: 28,
end: 36,
startPTS: 28,
endPTS: 36,
duration: 8,
cc: 1
}
]
}
};

var details = {
fragments: [
{
start: 0,
end: 4,
startPTS: 0,
endPTS: 4,
duration: 4,
cc: 2,
},
{
start: 4,
end: 8,
startPTS: 4,
endPTS: 8,
duration: 4,
cc: 2
},
{
start: 8,
end: 16,
startPTS: 8,
endPTS: 16,
duration: 8,
cc: 3
}
],
PTSKnown: false,
programDateTime : new Date('2017-08-28 00:00:50'),
startCC : 2,
endCC : 3
};

var detailsExpected = {
fragments : [
{
start: 70,
end: 74,
startPTS: 70,
endPTS: 74,
duration: 4,
cc: 2
},
{
start: 74,
end: 78,
startPTS: 74,
endPTS: 78,
duration: 4,
cc: 2
},
{
start: 78,
end: 86,
startPTS: 78,
endPTS: 86,
duration: 8,
cc: 3
}
],
PTSKnown: true,
programDateTime : new Date('2017-08-28 00:00:50'),
startCC : 2,
endCC : 3
};
alignDiscontinuities(lastFrag,lastLevel,details);
assert.deepEqual(detailsExpected,details);
});


it('finds the first fragment in an array which matches the CC of the first fragment in another array', function () {
const prevDetails = {
fragments: [mockReferenceFrag, { cc: 1 }]
Expand Down

0 comments on commit ae13d80

Please sign in to comment.