From fa0758c59c7dc078fbcb9fa28dea7993a8c0f48f Mon Sep 17 00:00:00 2001 From: hswaminathan Date: Thu, 22 Jun 2023 16:38:17 -0400 Subject: [PATCH] rename, parse sct35 to array buffer, inbandMetaData, remove useless arg to segment loader --- src/playlist-controller.js | 7 ++--- src/util/text-tracks.js | 47 ++++++++++++++++++-------------- test/playlist-controller.test.js | 4 +-- 3 files changed, 32 insertions(+), 26 deletions(-) diff --git a/src/playlist-controller.js b/src/playlist-controller.js index 72f40052a..c5087782b 100644 --- a/src/playlist-controller.js +++ b/src/playlist-controller.js @@ -256,8 +256,7 @@ export class PlaylistController extends videojs.EventTarget { sourceUpdater: this.sourceUpdater_, timelineChangeController: this.timelineChangeController_, exactManifestTimings: options.exactManifestTimings, - addMetadataToTextTrack: this.addMetadataToTextTrack.bind(this), - addDaterangeToTextTrack: this.addDaterangeToTextTrack.bind(this) + addMetadataToTextTrack: this.addMetadataToTextTrack.bind(this) }; // The source type check not only determines whether a special DASH playlist loader @@ -2025,7 +2024,7 @@ export class PlaylistController extends videojs.EventTarget { return Config.BUFFER_HIGH_WATER_LINE; } - addDaterangeToTextTrack(metadataArray) { + addDaterangeToTextTrack(mediaPlaylist) { const timestampOffset = this.sourceUpdater_.videoBuffer ? this.sourceUpdater_.videoTimestampOffset() : this.sourceUpdater_.audioTimestampOffset(); @@ -2035,7 +2034,7 @@ export class PlaylistController extends videojs.EventTarget { }, false).track; addDaterangeMetadata({ inbandTextTracks: this.inbandTextTracks_, - metadataArray, + mediaPlaylist, timestampOffset }); } diff --git a/src/util/text-tracks.js b/src/util/text-tracks.js index 6b2fefe20..746ef4e8e 100644 --- a/src/util/text-tracks.js +++ b/src/util/text-tracks.js @@ -223,51 +223,58 @@ export const addMetadata = ({ }); }; +// object for mapping daterange attributes +const daterangeAttr = { + id: 'ID', + class: 'CLASS', + startDate: 'START-DATE', + duration: 'DURATION', + endDate: 'END-DATE', + endOnNext: 'END-ON-NEXT', + plannedDuration: 'PLANNED-DURATION', + scte35Out: 'SCTE35-OUT', + scte35In: 'SCTE35-IN' +}; + /** * Add daterange metadata text track to a source handler given an array of metadata * * @param {Object} * @param {Object} inbandTextTracks the inband text tracks - * @param {Array} metadataArray an array of meta data + * @param {Object} mediaPlaylist parsed media playlist * @private */ export const addDaterangeMetadata = ({ inbandTextTracks, - metadataArray, + mediaPlaylist, timestampOffset }) => { - if (!metadataArray) { + if (!mediaPlaylist) { return; } const Cue = window.WebKitDataCue || window.VTTCue; const metadataTrack = inbandTextTracks.metadataTrack_; - const daterangeAttr = { - id: 'ID', - class: 'CLASS', - startDate: 'START-DATE', - duration: 'DURATION', - endDate: 'END-DATE', - endOnNext: 'END-ON-NEXT', - plannedDuration: 'PLANNED-DURATION', - scte35Out: 'SCTE35-OUT', - scte35In: 'SCTE35-IN' - }; if (!metadataTrack) { return; } - metadataArray.daterange.forEach((metadata) => { - const startTime = timestampOffset + (new Date(metadata.startDate).getTime() - new Date(metadataArray.dateTimeObject).getTime()) / 1000; - const endTime = metadata.endDate ? (new Date(metadata.endDate).getTime() - new Date(metadataArray.dateTimeObject).getTime()) / 1000 : 0; + const dateRanges = mediaPlaylist.daterange; + dateRanges.forEach((dateRange) => { + const startTime = timestampOffset + (new Date(dateRange.startDate).getTime() - new Date(mediaPlaylist.dateTimeObject).getTime()) / 1000; + const endTime = dateRange.endDate ? (new Date(dateRange.endDate).getTime() - new Date(mediaPlaylist.dateTimeObject).getTime()) / 1000 : 0; const cue = new Cue(startTime, endTime, ''); - cue.id = metadata.id; - Object.keys(metadata).forEach((key) => { + cue.id = dateRange.id; + cue.type = 'com.apple.quicktime.HLS'; + Object.keys(dateRange).forEach((key) => { if (!['id', 'class', 'startDate', 'duration', 'endDate', 'endOnNext'].includes(key)) { - cue.value = {keys: daterangeAttr[key], data: metadata[key]}; + if (key === 'scte35Out') { + dateRange[key] = new Uint8Array(dateRange[key].match(/[\da-f]{2}/gi)).buffer; + } + cue.value = {key: daterangeAttr[key], data: dateRange[key]}; cue.startTime = startTime; cue.endTime = endTime; metadataTrack.addCue(cue); diff --git a/test/playlist-controller.test.js b/test/playlist-controller.test.js index 04491b864..c4e58ef0f 100644 --- a/test/playlist-controller.test.js +++ b/test/playlist-controller.test.js @@ -486,7 +486,7 @@ QUnit.test('addDaterangeToTextTrack adds expected metadata to the metadataTrack' id: cue.id, value: { data: cue.value.data, - keys: cue.value.keys + key: cue.value.key } }; }); @@ -501,7 +501,7 @@ QUnit.test('addDaterangeToTextTrack adds expected metadata to the metadataTrack' endTime: 2, value: { data: 40, - keys: 'PLANNED-DURATION' + key: 'PLANNED-DURATION' } } ];