Skip to content

Commit

Permalink
feat: add support for endNumber in template duration parsing (#120)
Browse files Browse the repository at this point in the history
  • Loading branch information
brandonocasey authored Feb 24, 2021
1 parent bb89da6 commit 0a75d62
Show file tree
Hide file tree
Showing 2 changed files with 103 additions and 2 deletions.
28 changes: 26 additions & 2 deletions src/segment/durationTimeParser.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,27 @@
import { range } from '../utils/list';

/**
* parse the end number attribue that can be a string
* number, or undefined.
*
* @param {string|number|undefined} endNumber
* The end number attribute.
*
* @return {number|null}
* The result of parsing the end number.
*/
const parseEndNumber = (endNumber) => {
if (endNumber && typeof endNumber !== 'number') {
endNumber = parseInt(endNumber, 10);
}

if (isNaN(endNumber)) {
return null;
}

return endNumber;
};

/**
* Functions for calculating the range of available segments in static and dynamic
* manifests.
Expand All @@ -19,10 +41,11 @@ export const segmentRange = {
timescale = 1,
sourceDuration
} = attributes;
const endNumber = parseEndNumber(attributes.endNumber);

return {
start: 0,
end: Math.ceil(sourceDuration / (duration / timescale))
end: typeof endNumber === 'number' ? endNumber : Math.ceil(sourceDuration / (duration / timescale))
};
},

Expand All @@ -45,6 +68,7 @@ export const segmentRange = {
minimumUpdatePeriod = 0,
timeShiftBufferDepth = Infinity
} = attributes;
const endNumber = parseEndNumber(attributes.endNumber);
const now = (NOW + clientOffset) / 1000;
const periodStartWC = availabilityStartTime + start;
const periodEndWC = now + minimumUpdatePeriod;
Expand All @@ -56,7 +80,7 @@ export const segmentRange = {

return {
start: Math.max(0, availableStart),
end: Math.min(segmentCount, availableEnd)
end: typeof endNumber === 'number' ? endNumber : Math.min(segmentCount, availableEnd)
};
}
};
Expand Down
77 changes: 77 additions & 0 deletions test/segment/segmentTemplate.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,34 @@ QUnit.test('parseByDuration defaults 1 for startNumber and timescale', function(
);
});

QUnit.test('parseByDuration uses endNumber and has correct duration', function(assert) {
const attributes = {
sourceDuration: 11,
duration: '4',
periodIndex: 1,
endNumber: '2'
};

assert.deepEqual(
parseTemplateInfo(attributes, []),
[
{
number: 1,
duration: 4,
timeline: 1,
time: 0
},
{
number: 2,
duration: 7,
timeline: 1,
time: 4
}
],
'uses default startNumber and timescale value of 1'
);
});

QUnit.test('uses SegmentTimeline info when no @duration attribute', function(assert) {
const attributes = {
startNumber: 0,
Expand Down Expand Up @@ -987,6 +1015,55 @@ QUnit.test('correctly handles duration', function(assert) {
}],
'segments correct with given clientOffset'
);

assert.deepEqual(
segmentsFromTemplate(Object.assign(
{}, basicAttributes,
{ endNumber: '4' }, []
)),
[{
duration: 2,
map: {
resolvedUri: 'http://www.example.com/',
uri: ''
},
number: 1,
resolvedUri: 'http://www.example.com/n-1.m4s',
timeline: 1,
uri: 'n-1.m4s'
}, {
duration: 2,
map: {
resolvedUri: 'http://www.example.com/',
uri: ''
},
number: 2,
resolvedUri: 'http://www.example.com/n-2.m4s',
timeline: 1,
uri: 'n-2.m4s'
}, {
duration: 2,
map: {
resolvedUri: 'http://www.example.com/',
uri: ''
},
number: 3,
resolvedUri: 'http://www.example.com/n-3.m4s',
timeline: 1,
uri: 'n-3.m4s'
}, {
duration: 2,
map: {
resolvedUri: 'http://www.example.com/',
uri: ''
},
number: 4,
resolvedUri: 'http://www.example.com/n-4.m4s',
timeline: 1,
uri: 'n-4.m4s'
}],
'segments correct with endNumber'
);
});

QUnit.test('correctly handles duration with segmentTimeline', function(assert) {
Expand Down

0 comments on commit 0a75d62

Please sign in to comment.