@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
JavaScript
;
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;