diff --git a/examples/basic/package.json b/examples/basic/package.json index 2469afaa..eda27ae8 100644 --- a/examples/basic/package.json +++ b/examples/basic/package.json @@ -3,6 +3,7 @@ "version": "1.0.0", "private": true, "scripts": { + "web": "expo run:web", "android": "expo run:android", "ios": "expo run:ios", "windows": "react-native run-windows", diff --git a/src/VideoDecoderProperties.web.ts b/src/VideoDecoderProperties.web.ts index 13001c02..3f986694 100644 --- a/src/VideoDecoderProperties.web.ts +++ b/src/VideoDecoderProperties.web.ts @@ -1,25 +1,20 @@ /// import type {VideoDecoderPropertiesType} from './specs/VideoNativeComponent'; -class VideoDecoderProperties implements VideoDecoderPropertiesType { +const canPlay = (codec: string): boolean => { + // most chrome based browser (and safari I think) supports matroska but reports they do not. + // for those browsers, only check the codecs and not the container. + if (navigator.userAgent.search('Firefox') === -1) { + codec = codec.replace('video/x-matroska', 'video/mp4'); + } + + return !!MediaSource.isTypeSupported(codec); +}; + +export const VideoDecoderProperties = { async getWidevineLevel() { return 0; - } - - static canPlay(codec: string): boolean { - // most chrome based browser (and safari I think) supports matroska but reports they do not. - // for those browsers, only check the codecs and not the container. - if (navigator.userAgent.search('Firefox') === -1) { - codec = codec.replace('video/x-matroska', 'video/mp4'); - } - - // Find any video element that we could use to check, or create one that will - // instantly be garbage collected - const videos = document.getElementsByTagName('video'); - const video = videos.item(0) ?? document.createElement('video'); - - return !!video.canPlayType(codec); - } + }, async isCodecSupported( mimeType: string, @@ -27,19 +22,13 @@ class VideoDecoderProperties implements VideoDecoderPropertiesType { _height: number, ): Promise<'unsupported' | 'hardware' | 'software'> { // TODO: Figure out if we can get hardware support information - return VideoDecoderProperties.canPlay(mimeType) - ? 'software' - : 'unsupported'; - } + return canPlay(mimeType) ? 'software' : 'unsupported'; + }, async isHEVCSupported(): Promise<'unsupported' | 'hardware' | 'software'> { // Just a dummy vidoe mime type codec with HEVC to check. - return VideoDecoderProperties.canPlay( - 'video/x-matroska; codecs="hvc1.1.4.L96.BO"', - ) + return canPlay('video/x-matroska; codecs="hvc1.1.4.L96.BO"') ? 'software' : 'unsupported'; - } -} - -export default VideoDecoderProperties; + }, +} satisfies VideoDecoderPropertiesType;