Skip to content

Commit

Permalink
feat: expose presentationTimeOffset on segments that have it (#81)
Browse files Browse the repository at this point in the history
  • Loading branch information
gkatsev authored Mar 26, 2021
1 parent f7105d8 commit 8b58b39
Show file tree
Hide file tree
Showing 6 changed files with 109 additions and 18 deletions.
15 changes: 14 additions & 1 deletion src/parseAttributes.js
Original file line number Diff line number Diff line change
Expand Up @@ -149,12 +149,25 @@ export const parsers = {
* @param {string} value
* value of attribute as a string
* @return {number}
* The aprsed timescale
* The parsed timescale
*/
timescale(value) {
return parseInt(value, 10);
},

/**
* Specifies the presentationTimeOffset.
*
* @param {string} value
* value of the attribute as a string
*
* @return {number}
* The parsed presentationTimeOffset
*/
presentationTimeOffset(value) {
return parseInt(value, 10);
},

/**
* Specifies the constant approximate Segment duration
* NOTE: The <Period> element also contains an @duration attribute. This duration
Expand Down
8 changes: 7 additions & 1 deletion src/segment/segmentTemplate.js
Original file line number Diff line number Diff line change
Expand Up @@ -158,13 +158,19 @@ export const segmentsFromTemplate = (attributes, segmentTimeline) => {

const uri = constructTemplateUrl(attributes.media || '', templateValues);

return {
const map = {
uri,
timeline: segment.timeline,
duration: segment.duration,
resolvedUri: resolveUrl(attributes.baseUrl || '', uri),
map: mapSegment,
number: segment.number
};

if (attributes.presentationTimeOffset) {
map.presentationTimeOffset = attributes.presentationTimeOffset;
}

return map;
});
};
6 changes: 6 additions & 0 deletions src/toPlaylists.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@ export const generateSegments = ({ attributes, segmentInfo }) => {
if (segmentInfo.template) {
segmentsFn = segmentsFromTemplate;
segmentAttributes = merge(attributes, segmentInfo.template);

if (segmentInfo.template.presentationTimeOffset) {
segmentAttributes.presentationTimeOffset =
segmentInfo.template.presentationTimeOffset / segmentInfo.template.timescale;
}

} else if (segmentInfo.base) {
segmentsFn = segmentsFromBase;
segmentAttributes = merge(attributes, segmentInfo.base);
Expand Down
29 changes: 21 additions & 8 deletions test/manifests/multiperiod-dynamic.js
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ export const parsedManifest = {
resolvedUri: 'https://example.com/default_audio128_2/init3.m4f'
},
number: 14,
presentationTimeOffset: 4.85297052154195,
discontinuity: true
},
{
Expand All @@ -201,7 +202,8 @@ export const parsedManifest = {
uri: 'https://example.com/default_audio128_2/init3.m4f',
resolvedUri: 'https://example.com/default_audio128_2/init3.m4f'
},
number: 15
number: 15,
presentationTimeOffset: 4.85297052154195
},
{
uri: 'https://example.com/default_audio128_2/segment16.m4f',
Expand Down Expand Up @@ -438,6 +440,7 @@ export const parsedManifest = {
resolvedUri: 'https://example.com/default_audio96_2/init3.m4f'
},
number: 14,
presentationTimeOffset: 4.85297052154195,
discontinuity: true
},
{
Expand All @@ -449,7 +452,8 @@ export const parsedManifest = {
uri: 'https://example.com/default_audio96_2/init3.m4f',
resolvedUri: 'https://example.com/default_audio96_2/init3.m4f'
},
number: 15
number: 15,
presentationTimeOffset: 4.85297052154195
},
{
uri: 'https://example.com/default_audio96_2/segment16.m4f',
Expand Down Expand Up @@ -693,6 +697,7 @@ export const parsedManifest = {
resolvedUri: 'https://example.com/default_video2000_0_1280x720/init3.m4f'
},
number: 13,
presentationTimeOffset: 4.838166666666667,
discontinuity: true
},
{
Expand All @@ -704,7 +709,8 @@ export const parsedManifest = {
uri: 'https://example.com/default_video2000_0_1280x720/init3.m4f',
resolvedUri: 'https://example.com/default_video2000_0_1280x720/init3.m4f'
},
number: 14
number: 14,
presentationTimeOffset: 4.838166666666667
},
{
uri: 'https://example.com/default_video2000_0_1280x720/segment15.m4f',
Expand All @@ -715,7 +721,8 @@ export const parsedManifest = {
uri: 'https://example.com/default_video2000_0_1280x720/init3.m4f',
resolvedUri: 'https://example.com/default_video2000_0_1280x720/init3.m4f'
},
number: 15
number: 15,
presentationTimeOffset: 4.838166666666667
},
{
uri: 'https://example.com/default_video2000_0_1280x720/segment16.m4f',
Expand Down Expand Up @@ -947,6 +954,7 @@ export const parsedManifest = {
resolvedUri: 'https://example.com/default_video1200_1_960x540/init3.m4f'
},
number: 13,
presentationTimeOffset: 4.838166666666667,
discontinuity: true
},
{
Expand All @@ -958,7 +966,8 @@ export const parsedManifest = {
uri: 'https://example.com/default_video1200_1_960x540/init3.m4f',
resolvedUri: 'https://example.com/default_video1200_1_960x540/init3.m4f'
},
number: 14
number: 14,
presentationTimeOffset: 4.838166666666667
},
{
uri: 'https://example.com/default_video1200_1_960x540/segment15.m4f',
Expand All @@ -969,7 +978,8 @@ export const parsedManifest = {
uri: 'https://example.com/default_video1200_1_960x540/init3.m4f',
resolvedUri: 'https://example.com/default_video1200_1_960x540/init3.m4f'
},
number: 15
number: 15,
presentationTimeOffset: 4.838166666666667
},
{
uri: 'https://example.com/default_video1200_1_960x540/segment16.m4f',
Expand Down Expand Up @@ -1201,6 +1211,7 @@ export const parsedManifest = {
resolvedUri: 'https://example.com/default_video900_1_640x360/init3.m4f'
},
number: 13,
presentationTimeOffset: 4.838166666666667,
discontinuity: true
},
{
Expand All @@ -1212,7 +1223,8 @@ export const parsedManifest = {
uri: 'https://example.com/default_video900_1_640x360/init3.m4f',
resolvedUri: 'https://example.com/default_video900_1_640x360/init3.m4f'
},
number: 14
number: 14,
presentationTimeOffset: 4.838166666666667
},
{
uri: 'https://example.com/default_video900_1_640x360/segment15.m4f',
Expand All @@ -1223,7 +1235,8 @@ export const parsedManifest = {
uri: 'https://example.com/default_video900_1_640x360/init3.m4f',
resolvedUri: 'https://example.com/default_video900_1_640x360/init3.m4f'
},
number: 15
number: 15,
presentationTimeOffset: 4.838166666666667
},
{
uri: 'https://example.com/default_video900_1_640x360/segment16.m4f',
Expand Down
29 changes: 21 additions & 8 deletions test/manifests/multiperiod.js
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ export const parsedManifest = {
resolvedUri: 'https://example.com/default_audio128_2/init3.m4f'
},
number: 14,
presentationTimeOffset: 4.85297052154195,
discontinuity: true
},
{
Expand All @@ -201,7 +202,8 @@ export const parsedManifest = {
uri: 'https://example.com/default_audio128_2/init3.m4f',
resolvedUri: 'https://example.com/default_audio128_2/init3.m4f'
},
number: 15
number: 15,
presentationTimeOffset: 4.85297052154195
},
{
uri: 'https://example.com/default_audio128_2/segment16.m4f',
Expand Down Expand Up @@ -438,6 +440,7 @@ export const parsedManifest = {
resolvedUri: 'https://example.com/default_audio96_2/init3.m4f'
},
number: 14,
presentationTimeOffset: 4.85297052154195,
discontinuity: true
},
{
Expand All @@ -449,7 +452,8 @@ export const parsedManifest = {
uri: 'https://example.com/default_audio96_2/init3.m4f',
resolvedUri: 'https://example.com/default_audio96_2/init3.m4f'
},
number: 15
number: 15,
presentationTimeOffset: 4.85297052154195
},
{
uri: 'https://example.com/default_audio96_2/segment16.m4f',
Expand Down Expand Up @@ -693,6 +697,7 @@ export const parsedManifest = {
resolvedUri: 'https://example.com/default_video2000_0_1280x720/init3.m4f'
},
number: 13,
presentationTimeOffset: 4.838166666666667,
discontinuity: true
},
{
Expand All @@ -704,7 +709,8 @@ export const parsedManifest = {
uri: 'https://example.com/default_video2000_0_1280x720/init3.m4f',
resolvedUri: 'https://example.com/default_video2000_0_1280x720/init3.m4f'
},
number: 14
number: 14,
presentationTimeOffset: 4.838166666666667
},
{
uri: 'https://example.com/default_video2000_0_1280x720/segment15.m4f',
Expand All @@ -715,7 +721,8 @@ export const parsedManifest = {
uri: 'https://example.com/default_video2000_0_1280x720/init3.m4f',
resolvedUri: 'https://example.com/default_video2000_0_1280x720/init3.m4f'
},
number: 15
number: 15,
presentationTimeOffset: 4.838166666666667
},
{
uri: 'https://example.com/default_video2000_0_1280x720/segment16.m4f',
Expand Down Expand Up @@ -947,6 +954,7 @@ export const parsedManifest = {
resolvedUri: 'https://example.com/default_video1200_1_960x540/init3.m4f'
},
number: 13,
presentationTimeOffset: 4.838166666666667,
discontinuity: true
},
{
Expand All @@ -958,7 +966,8 @@ export const parsedManifest = {
uri: 'https://example.com/default_video1200_1_960x540/init3.m4f',
resolvedUri: 'https://example.com/default_video1200_1_960x540/init3.m4f'
},
number: 14
number: 14,
presentationTimeOffset: 4.838166666666667
},
{
uri: 'https://example.com/default_video1200_1_960x540/segment15.m4f',
Expand All @@ -969,7 +978,8 @@ export const parsedManifest = {
uri: 'https://example.com/default_video1200_1_960x540/init3.m4f',
resolvedUri: 'https://example.com/default_video1200_1_960x540/init3.m4f'
},
number: 15
number: 15,
presentationTimeOffset: 4.838166666666667
},
{
uri: 'https://example.com/default_video1200_1_960x540/segment16.m4f',
Expand Down Expand Up @@ -1201,6 +1211,7 @@ export const parsedManifest = {
resolvedUri: 'https://example.com/default_video900_1_640x360/init3.m4f'
},
number: 13,
presentationTimeOffset: 4.838166666666667,
discontinuity: true
},
{
Expand All @@ -1212,7 +1223,8 @@ export const parsedManifest = {
uri: 'https://example.com/default_video900_1_640x360/init3.m4f',
resolvedUri: 'https://example.com/default_video900_1_640x360/init3.m4f'
},
number: 14
number: 14,
presentationTimeOffset: 4.838166666666667
},
{
uri: 'https://example.com/default_video900_1_640x360/segment15.m4f',
Expand All @@ -1223,7 +1235,8 @@ export const parsedManifest = {
uri: 'https://example.com/default_video900_1_640x360/init3.m4f',
resolvedUri: 'https://example.com/default_video900_1_640x360/init3.m4f'
},
number: 15
number: 15,
presentationTimeOffset: 4.838166666666667
},
{
uri: 'https://example.com/default_video900_1_640x360/segment16.m4f',
Expand Down
40 changes: 40 additions & 0 deletions test/toPlaylists.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -169,3 +169,43 @@ QUnit.test('segment list', function(assert) {

assert.deepEqual(toPlaylists(representations), playlists);
});

QUnit.test('presentationTimeOffset', function(assert) {
const representations = [{
attributes: { baseUrl: 'http://example.com/', periodIndex: 0, sourceDuration: 2 },
segmentInfo: {
template: {
presentationTimeOffset: 100,
timescale: 4
}
}
}];

// the presentationTimeOffset output should be the value in the template
// divided by the timescale in the template.
// It should be available on segments
const playlists = [{
attributes: {
baseUrl: 'http://example.com/',
periodIndex: 0,
sourceDuration: 2,
duration: 2,
presentationTimeOffset: 25,
timescale: 4
},
segments: [{
uri: '',
timeline: 0,
duration: 2,
presentationTimeOffset: 25,
resolvedUri: 'http://example.com/',
map: {
uri: '',
resolvedUri: 'http://example.com/'
},
number: 1
}]
}];

assert.deepEqual(toPlaylists(representations), playlists);
});

0 comments on commit 8b58b39

Please sign in to comment.