UNPKG

@4players/odin-common

Version:

A collection of commonly used type definitions and utility functions across ODIN web projects

90 lines (89 loc) 3.31 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.VideoCodec = void 0; const result_1 = require("./result"); const validCodecs = ['VP8', 'VP9', 'AV1', 'H264']; class VideoCodec { constructor(codec) { this.codec = codec; this.channels = 0; this.clockRate = 90000; } isValid() { return validCodecs.includes(this.codec); } isSupported() { if (typeof RTCRtpReceiver === 'undefined' || typeof RTCRtpReceiver.getCapabilities === 'undefined') { return null; } const expectedMimeType = (0, result_1.unwrapOr)(this.getMimeType(), '').toLowerCase(); const expectedFmtpLine = new Set((0, result_1.unwrapOr)(this.getSdpFmtpLine(), '') .split(';') .map((arg) => arg.trim().toLowerCase())); return (RTCRtpReceiver.getCapabilities('video')?.codecs?.find((c) => { const actualMimeType = c.mimeType.toLowerCase(); const actualFmtpLine = new Set((c.sdpFmtpLine ?? '') .split(';') .map((arg) => arg.trim().toLowerCase())); if (expectedMimeType !== actualMimeType) return false; if (expectedFmtpLine.size !== actualFmtpLine.size) return false; for (let item of expectedFmtpLine) { if (!actualFmtpLine.has(item)) return false; } return true; }) ?? null); } getPayloadType() { switch (this.codec) { case 'VP8': return (0, result_1.success)(96); case 'VP9': return (0, result_1.success)(98); case 'AV1': return (0, result_1.success)(41); case 'H264': return (0, result_1.success)(102); default: return (0, result_1.failure)('invalid video codec'); } } getMimeType() { switch (this.codec) { case 'VP8': return (0, result_1.success)('video/VP8'); case 'VP9': return (0, result_1.success)('video/VP9'); case 'AV1': return (0, result_1.success)('video/AV1'); case 'H264': return (0, result_1.success)('video/H264'); default: return (0, result_1.failure)('invalid video codec'); } } getSdpFmtpLine() { switch (this.codec) { case 'VP8': return (0, result_1.success)(''); case 'VP9': return (0, result_1.success)( // using high-bit-depth variant profile 'profile-id=2'); case 'AV1': return (0, result_1.success)( // using baseline profile (https://aomediacodec.github.io/av1-rtp-spec/#72-sdp-parameters) 'level-idx=5;profile=0;tier=0'); case 'H264': return (0, result_1.success)( // using baseline profile 'level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f'); default: return (0, result_1.failure)('invalid video codec'); } } } exports.VideoCodec = VideoCodec;