From 49b323b2856d0d177987dccbdc996d445b2ad0d4 Mon Sep 17 00:00:00 2001 From: Gustav Grusell Date: Tue, 17 Nov 2020 20:46:02 +0100 Subject: [PATCH] feat: recognize webm segments as video (#79) Co-authored-by: Gary Katsevman --- src/toM3u8.js | 4 +- test/index.test.js | 8 ++ test/manifests/webmsegments.js | 154 ++++++++++++++++++++++++++++++++ test/manifests/webmsegments.mpd | 21 +++++ 4 files changed, 185 insertions(+), 2 deletions(-) create mode 100644 test/manifests/webmsegments.js create mode 100644 test/manifests/webmsegments.mpd diff --git a/src/toM3u8.js b/src/toM3u8.js index 3a81166d..4ff9623a 100644 --- a/src/toM3u8.js +++ b/src/toM3u8.js @@ -251,9 +251,9 @@ export const toM3u8 = (dashPlaylists, locations, sidxMapping = {}) => { } = dashPlaylists[0].attributes; const videoOnly = ({ attributes }) => - attributes.mimeType === 'video/mp4' || attributes.contentType === 'video'; + attributes.mimeType === 'video/mp4' || attributes.mimeType === 'video/webm' || attributes.contentType === 'video'; const audioOnly = ({ attributes }) => - attributes.mimeType === 'audio/mp4' || attributes.contentType === 'audio'; + attributes.mimeType === 'audio/mp4' || attributes.mimeType === 'audio/webm' || attributes.contentType === 'audio'; const vttOnly = ({ attributes }) => attributes.mimeType === 'text/vtt' || attributes.contentType === 'text'; diff --git a/test/index.test.js b/test/index.test.js index d3c8c37e..a84c97e4 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -11,6 +11,7 @@ import segmentListTemplate from './manifests/segmentList.mpd'; import locationTemplate from './manifests/location.mpd'; import locationsTemplate from './manifests/locations.mpd'; import multiperiod from './manifests/multiperiod.mpd'; +import webmsegments from './manifests/webmsegments.mpd'; import multiperiodDynamic from './manifests/multiperiod-dynamic.mpd'; import { parsedManifest as maatVttSegmentTemplateManifest @@ -24,6 +25,9 @@ import { import { parsedManifest as multiperiodManifest } from './manifests/multiperiod.js'; +import { + parsedManifest as webmsegmentsManifest +} from './manifests/webmsegments.js'; import { parsedManifest as multiperiodDynamicManifest } from './manifests/multiperiod-dynamic.js'; @@ -64,6 +68,10 @@ QUnit.test('has parse', function(assert) { name: 'multiperiod', input: multiperiod, expected: multiperiodManifest +}, { + name: 'webmsegments', + input: webmsegments, + expected: webmsegmentsManifest }, { name: 'multiperiod_dynamic', input: multiperiodDynamic, diff --git a/test/manifests/webmsegments.js b/test/manifests/webmsegments.js new file mode 100644 index 00000000..e8c3fee1 --- /dev/null +++ b/test/manifests/webmsegments.js @@ -0,0 +1,154 @@ +export const parsedManifest = { + allowCache: true, + discontinuityStarts: [], + segments: [], + endList: true, + mediaGroups: { + 'AUDIO': { + audio: { + en: { + language: 'en', + autoselect: true, + default: true, + playlists: [ + { + attributes: { + 'NAME': '2', + 'BANDWIDTH': 32000, + 'CODECS': 'opus', + 'PROGRAM-ID': 1 + }, + uri: '', + endList: true, + timeline: 1, + resolvedUri: '', + targetDuration: 4, + segments: [ + { + uri: 'audio/segment_0.chk', + timeline: 1, + duration: 4, + resolvedUri: 'https://www.example.com/audio/segment_0.chk', + map: { + uri: 'audio/init.hdr', + resolvedUri: 'https://www.example.com/audio/init.hdr' + }, + number: 0 + }, + { + uri: 'audio/segment_1.chk', + timeline: 1, + duration: 4, + resolvedUri: 'https://www.example.com/audio/segment_1.chk', + map: { + uri: 'audio/init.hdr', + resolvedUri: 'https://www.example.com/audio/init.hdr' + }, + number: 1 + }, + { + uri: 'audio/segment_2.chk', + timeline: 1, + duration: 4, + resolvedUri: 'https://www.example.com/audio/segment_2.chk', + map: { + uri: 'audio/init.hdr', + resolvedUri: 'https://www.example.com/audio/init.hdr' + }, + number: 2 + }, + { + uri: 'audio/segment_3.chk', + timeline: 1, + duration: 4, + resolvedUri: 'https://www.example.com/audio/segment_3.chk', + map: { + uri: 'audio/init.hdr', + resolvedUri: 'https://www.example.com/audio/init.hdr' + }, + number: 3 + } + ], + mediaSequence: 0 + } + ], + uri: '' + } + } + }, + 'VIDEO': {}, + 'CLOSED-CAPTIONS': {}, + 'SUBTITLES': {} + }, + uri: '', + duration: 16, + playlists: [ + { + attributes: { + 'NAME': '1', + 'AUDIO': 'audio', + 'SUBTITLES': 'subs', + 'RESOLUTION': { + width: 480, + height: 200 + }, + 'CODECS': 'av1', + 'BANDWIDTH': 100000, + 'PROGRAM-ID': 1 + }, + uri: '', + endList: true, + timeline: 1, + resolvedUri: '', + targetDuration: 4, + segments: [ + { + uri: 'video/segment_0.chk', + timeline: 1, + duration: 4, + resolvedUri: 'https://www.example.com/video/segment_0.chk', + map: { + uri: 'video/init.hdr', + resolvedUri: 'https://www.example.com/video/init.hdr' + }, + number: 0 + }, + { + uri: 'video/segment_1.chk', + timeline: 1, + duration: 4, + resolvedUri: 'https://www.example.com/video/segment_1.chk', + map: { + uri: 'video/init.hdr', + resolvedUri: 'https://www.example.com/video/init.hdr' + }, + number: 1 + }, + { + uri: 'video/segment_2.chk', + timeline: 1, + duration: 4, + resolvedUri: 'https://www.example.com/video/segment_2.chk', + map: { + uri: 'video/init.hdr', + resolvedUri: 'https://www.example.com/video/init.hdr' + }, + number: 2 + }, + { + uri: 'video/segment_3.chk', + timeline: 1, + duration: 4, + resolvedUri: 'https://www.example.com/video/segment_3.chk', + map: { + uri: 'video/init.hdr', + resolvedUri: 'https://www.example.com/video/init.hdr' + }, + number: 3 + } + ], + mediaSequence: 0 + } + ], + minimumUpdatePeriod: 0 +}; diff --git a/test/manifests/webmsegments.mpd b/test/manifests/webmsegments.mpd new file mode 100644 index 00000000..a2bae9c3 --- /dev/null +++ b/test/manifests/webmsegments.mpd @@ -0,0 +1,21 @@ + + + + https://www.example.com/base + + + + + + + + + + + + +