From 6700c5f63c0ec1be60f82e9fb072fcade91f1b9d Mon Sep 17 00:00:00 2001 From: mister-ben Date: Tue, 28 Nov 2023 23:42:19 +0100 Subject: [PATCH] feat: Check for ManagedMediaSource support (#37) --- src/codecs.js | 21 +++++++++++++++++++-- test/codecs.test.js | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/src/codecs.js b/src/codecs.js index 7974142..a6ba137 100644 --- a/src/codecs.js +++ b/src/codecs.js @@ -202,9 +202,26 @@ export const getMimeForCodec = (codecString) => { return `${type}/${container};codecs="${codecString}"`; }; -export const browserSupportsCodec = (codecString = '') => window.MediaSource && +/** + * Tests whether the codec is supported by MediaSource. Optionally also tests ManagedMediaSource. + * + * @param {string} codecString + * Codec to test + * @param {boolean} [withMMS] + * Whether to check if ManagedMediaSource supports it + * @return {boolean} + * Codec is supported + */ +export const browserSupportsCodec = (codecString = '', withMMS = false) => ( + window.MediaSource && window.MediaSource.isTypeSupported && - window.MediaSource.isTypeSupported(getMimeForCodec(codecString)) || false; + window.MediaSource.isTypeSupported(getMimeForCodec(codecString)) +) || ( + withMMS && + window.ManagedMediaSource && + window.ManagedMediaSource.isTypeSupported && + window.ManagedMediaSource.isTypeSupported(getMimeForCodec(codecString)) +) || false; export const muxerSupportsCodec = (codecString = '') => codecString.toLowerCase().split(',').every((codec) => { codec = codec.trim(); diff --git a/test/codecs.test.js b/test/codecs.test.js index 895bd60..c1c346d 100644 --- a/test/codecs.test.js +++ b/test/codecs.test.js @@ -422,9 +422,11 @@ QUnit.test('works as expected', function(assert) { QUnit.module('browserSupportsCodec', { beforeEach() { this.oldMediaSource = window.MediaSource; + this.oldManagedMediaSource = window.ManagedMediaSource; }, afterEach() { window.MediaSource = this.oldMediaSource; + window.ManagedMediaSource = this.oldManagedMediaSource; } }); @@ -442,6 +444,47 @@ QUnit.test('works as expected', function(assert) { assert.notOk(browserSupportsCodec('test'), 'no isTypeSupported, browser does not support codec'); }); +QUnit.test('works as expected when ManagedMediaSource supported but checks not requested', function(assert) { + window.MediaSource = {isTypeSupported: () => false}; + window.ManagedMediaSource = {isTypeSupported: () => true}; + assert.notOk(browserSupportsCodec('test'), 'isTypeSupported false, browser does not support codec, ManangedMediaSource would support, but not requested'); + + window.MediaSource = null; + window.ManagedMediaSource = {isTypeSupported: () => true}; + assert.notOk(browserSupportsCodec('test'), 'no MediaSource, browser does not support codec, ManangedMediaSource would support, but not requested'); + + window.MediaSource = {isTypeSupported: null}; + window.ManagedMediaSource = {isTypeSupported: () => true}; + assert.notOk(browserSupportsCodec('test'), 'no isTypeSupported, browser does not support codec, ManangedMediaSource would support, but not requested'); +}); + +QUnit.test('works as expected with ManagedMediaSource checks', function(assert) { + window.MediaSource = {isTypeSupported: () => false}; + window.ManagedMediaSource = {isTypeSupported: () => true}; + assert.ok(browserSupportsCodec('test', true), 'isTypeSupported true, MediaSource does not support codec, but ManangedMediaSource does and was requested'); + + window.MediaSource = null; + window.ManagedMediaSource = {isTypeSupported: () => true}; + assert.ok(browserSupportsCodec('test', true), 'isTypeSupported true, no MediaSource, but ManangedMediaSource supports codec and was requested'); + + window.MediaSource = {isTypeSupported: null}; + window.ManagedMediaSource = {isTypeSupported: () => true}; + assert.ok(browserSupportsCodec('test', true), 'isTypeSupported true, no isTypeSupported on MediaSource, but ManangedMediaSource supports and was requested'); + + window.MediaSource = null; + window.ManagedMediaSource = {isTypeSupported: () => false}; + assert.notOk(browserSupportsCodec('test', true), 'isTypeSupported false, no MediaSource and ManagedMediaSource does not support codec'); + + window.MediaSource = null; + window.ManagedMediaSource = null; + assert.notOk(browserSupportsCodec('test', true), 'no MediaSource nor ManagedMediaSource'); + + window.MediaSource = null; + window.MediaSource = {isTypeSupported: null}; + assert.notOk(browserSupportsCodec('test', true), 'no isTypeSupported on ManagaedMediaSource, browser does not support codec'); + +}); + QUnit.module('getMimeForCodec'); QUnit.test('works as expected', function(assert) {