diff --git a/src/VideoDecoderProperties.web.ts b/src/VideoDecoderProperties.web.ts new file mode 100644 index 00000000..13001c02 --- /dev/null +++ b/src/VideoDecoderProperties.web.ts @@ -0,0 +1,45 @@ +/// +import type {VideoDecoderPropertiesType} from './specs/VideoNativeComponent'; + +class VideoDecoderProperties implements VideoDecoderPropertiesType { + 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, + _width: number, + _height: number, + ): Promise<'unsupported' | 'hardware' | 'software'> { + // TODO: Figure out if we can get hardware support information + return VideoDecoderProperties.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"', + ) + ? 'software' + : 'unsupported'; + } +} + +export default VideoDecoderProperties; diff --git a/src/index.ts b/src/index.ts index 575ac839..b555b80f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ import Video from './Video'; export {VideoDecoderProperties} from './VideoDecoderProperties'; -export * from './types'; +export type * from './types'; export type {VideoRef} from './Video'; export default Video;