UNPKG

@observertc/samples-encoder

Version:

ObserveRTC Library for Encoding Samples

345 lines (344 loc) 16.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PeerConnectionSampleEncoder = void 0; const MediaPlayoutEncoder_1 = require("./MediaPlayoutEncoder"); const CertificateEncoder_1 = require("./CertificateEncoder"); const CodecStatsEncoder_1 = require("./CodecStatsEncoder"); const DataChannelEncoder_1 = require("./DataChannelEncoder"); const IceCandidateEncoder_1 = require("./IceCandidateEncoder"); const IceCandidatePairStatsEncoder_1 = require("./IceCandidatePairStatsEncoder"); const IceTransportEncoder_1 = require("./IceTransportEncoder"); const InboundRtpEncoder_1 = require("./InboundRtpEncoder"); const InboundTrackEncoder_1 = require("./InboundTrackEncoder"); const MediaSourceEncoder_1 = require("./MediaSourceEncoder"); const OutboundRtpEncoder_1 = require("./OutboundRtpEncoder"); const OutboundTrackEncoder_1 = require("./OutboundTrackEncoder"); const OutputSamples_1 = require("./OutputSamples"); const PeerConnectionTransportEncoder_1 = require("./PeerConnectionTransportEncoder"); const RemoteInboundRtpEncoder_1 = require("./RemoteInboundRtpEncoder"); const RemoteOutboundRtpEncoder_1 = require("./RemoteOutboundRtpEncoder"); const utils_1 = require("./utils"); class PeerConnectionSampleEncoder { constructor(peerConnectionId, parent) { this.parent = parent; this._visited = false; this._scoreEncoder = new utils_1.NumberToNumberEncoder(); this._scoreReasonsEncoder = new utils_1.StringToStringEncoder(); this._inboundTracksEncoders = new Map(); this._outboundTracksEncoders = new Map(); this._codecStatsEncoders = new Map(); this._inboundRtpEncoders = new Map(); this._remoteInboundRtpEncoders = new Map(); this._outboundRtpEncoders = new Map(); this._remoteOutboundRtpEncoders = new Map(); this._mediaSourceEncoders = new Map(); this._mediaPlayoutEncoders = new Map(); this._peerConnectionTransportEncoders = new Map(); this._dataChannelEncoders = new Map(); this._iceTransportEncoders = new Map(); this._iceCandidateEncoders = new Map(); this._iceCandidatePairEncoders = new Map(); this._certificateEncoders = new Map(); this._peerConnectionId = this.parent.settings.peerConnectionIdIsUuid ? (0, utils_1.uuidToByteArray)(peerConnectionId) : (0, utils_1.stringToBytesArray)(peerConnectionId); this._attachmentsEncoder = this.parent.attachmentEncoderFactory.createPeerConnectionSampleAttachmentEncoder(); } get visited() { const result = this._visited; this._visited = false; return result; } reset() { this._attachmentsEncoder.reset(); this._scoreEncoder.reset(); this._scoreReasonsEncoder.reset(); this._inboundTracksEncoders.forEach((encoder) => encoder.reset()); this._outboundTracksEncoders.forEach((encoder) => encoder.reset()); this._codecStatsEncoders.forEach((encoder) => encoder.reset()); this._inboundRtpEncoders.forEach((encoder) => encoder.reset()); this._remoteInboundRtpEncoders.forEach((encoder) => encoder.reset()); this._outboundRtpEncoders.forEach((encoder) => encoder.reset()); this._remoteOutboundRtpEncoders.forEach((encoder) => encoder.reset()); this._mediaSourceEncoders.forEach((encoder) => encoder.reset()); this._mediaPlayoutEncoders.forEach((encoder) => encoder.reset()); this._peerConnectionTransportEncoders.forEach((encoder) => encoder.reset()); this._dataChannelEncoders.forEach((encoder) => encoder.reset()); this._iceTransportEncoders.forEach((encoder) => encoder.reset()); this._iceCandidateEncoders.forEach((encoder) => encoder.reset()); this._iceCandidatePairEncoders.forEach((encoder) => encoder.reset()); this._certificateEncoders.forEach((encoder) => encoder.reset()); } encode(sample) { this._visited = true; const inboundTracks = sample.inboundTracks?.map(this._encodeInboundTracks.bind(this)); const outboundTracks = sample.outboundTracks?.map(this._encodeOutboundTracks.bind(this)); const codecs = sample.codecs?.map(this._encodeCodecStats.bind(this)); const inboundRtps = sample.inboundRtps?.map(this._encodeInboundRtp.bind(this)); const remoteInboundRtps = sample.remoteInboundRtps?.map(this._encodeRemoteInboundRtp.bind(this)); const outboundRtps = sample.outboundRtps?.map(this._encodeOutboundRtp.bind(this)); const remoteOutboundRtps = sample.remoteOutboundRtps?.map(this._encodeRemoteOutboundRtp.bind(this)); const mediaSources = sample.mediaSources?.map(this._encodeMediaSource.bind(this)); const mediaPlayouts = sample.mediaPlayouts?.map(this._encodeMediaPlayout.bind(this)); const peerConnectionTransports = sample.peerConnectionTransports?.map(this._encodePeerConnectionTransport.bind(this)); const dataChannels = sample.dataChannels?.map(this._encodeDataChannel.bind(this)); const iceTransports = sample.iceTransports?.map(this._encodeIceTransport.bind(this)); const iceCandidates = sample.iceCandidates?.map(this._encodeIceCandidate.bind(this)); const iceCandidatePairs = sample.iceCandidatePairs?.map(this._encodeIceCandidatePair.bind(this)); const certificates = sample.certificates?.map(this._encodeCertificate.bind(this)); return new OutputSamples_1.ClientSample_PeerConnectionSample({ peerConnectionId: this._peerConnectionId, attachments: this._attachmentsEncoder.encode(sample.attachments), score: this._scoreEncoder.encode(sample.score), scoreReasons: this._scoreReasonsEncoder.encode(sample.scoreReasons), inboundTracks, outboundTracks, codecs, inboundRtps, remoteInboundRtps, outboundRtps, remoteOutboundRtps, mediaSources, mediaPlayouts, peerConnectionTransports, dataChannels, iceTransports, iceCandidates, iceCandidatePairs, certificates, }); } _encodeCodecStats(input) { let encoder = this._codecStatsEncoders.get(input.id); if (!encoder) { encoder = new CodecStatsEncoder_1.CodecStatsEncoder(this.parent.attachmentEncoderFactory.createCodecStatsAttachmentEncoder()); this._codecStatsEncoders.set(input.id, encoder); } return encoder.encode(input); } _encodeInboundTracks(input) { let encoder = this._inboundTracksEncoders.get(input.id); if (!encoder) { encoder = new InboundTrackEncoder_1.InboundTrackSampleEncoder(this.parent.attachmentEncoderFactory.createInboundTrackAttachmentEncoder()); this._inboundTracksEncoders.set(input.id, encoder); } return encoder.encode(input); } _encodeOutboundTracks(input) { let encoder = this._outboundTracksEncoders.get(input.id); if (!encoder) { encoder = new OutboundTrackEncoder_1.OutboundTrackSampleEncoder(this.parent.attachmentEncoderFactory.createOutboundTrackAttachmentEncoder()); this._outboundTracksEncoders.set(input.id, encoder); } return encoder.encode(input); } _encodeInboundRtp(input) { let encoder = this._inboundRtpEncoders.get(input.ssrc); if (!encoder) { const trackIdEncoder = this.parent.settings.trackIdIsUuid ? new utils_1.OneTimePassUuidToByteArrayEncoder() : new utils_1.OneTimePassStringToUint8ArrayEncoder(); encoder = new InboundRtpEncoder_1.InboundRtpEncoder(input.ssrc, trackIdEncoder, this.parent.attachmentEncoderFactory.createInboundRtpAttachmentEncoder()); this._inboundRtpEncoders.set(input.ssrc, encoder); } return encoder.encode(input); } _encodeOutboundRtp(input) { let encoder = this._outboundRtpEncoders.get(input.ssrc); if (!encoder) { encoder = new OutboundRtpEncoder_1.OutboundRtpEncoder(input.ssrc, this.parent.attachmentEncoderFactory.createOutboundRtpAttachmentEncoder()); this._outboundRtpEncoders.set(input.ssrc, encoder); } return encoder.encode(input); } _encodeRemoteInboundRtp(input) { let encoder = this._remoteInboundRtpEncoders.get(input.ssrc); if (!encoder) { encoder = new RemoteInboundRtpEncoder_1.RemoteInboundRtpEncoder(input.ssrc, this.parent.attachmentEncoderFactory.createRemoteInboundRtpAttachmentEncoder()); this._remoteInboundRtpEncoders.set(input.ssrc, encoder); } return encoder.encode(input); } _encodeRemoteOutboundRtp(input) { let encoder = this._remoteOutboundRtpEncoders.get(input.ssrc); if (!encoder) { encoder = new RemoteOutboundRtpEncoder_1.RemoteOutboundRtpEncoder(input.ssrc, this.parent.attachmentEncoderFactory.createRemoteOutboundRtpAttachmentEncoder()); this._remoteOutboundRtpEncoders.set(input.ssrc, encoder); } return encoder.encode(input); } _encodeDataChannel(input) { let encoder = this._dataChannelEncoders.get(input.id); if (!encoder) { encoder = new DataChannelEncoder_1.DataChannelEncoder(this.parent.attachmentEncoderFactory.createDataChannelAttachmentEncoder()); this._dataChannelEncoders.set(input.id, encoder); } return encoder.encode(input); } _encodeMediaSource(input) { let encoder = this._mediaSourceEncoders.get(input.id); if (!encoder) { encoder = new MediaSourceEncoder_1.MediaSourceStatsEncoder(this.parent.attachmentEncoderFactory.createMediaSourceAttachmentEncoder()); this._mediaSourceEncoders.set(input.id, encoder); } return encoder.encode(input); } _encodeMediaPlayout(input) { let encoder = this._mediaPlayoutEncoders.get(input.id); if (!encoder) { encoder = new MediaPlayoutEncoder_1.MediaPlayoutStatsEncoder(this.parent.attachmentEncoderFactory.createMediaPlayoutAttachmentEncoder()); this._mediaPlayoutEncoders.set(input.id, encoder); } return encoder.encode(input); } _encodePeerConnectionTransport(input) { let encoder = this._peerConnectionTransportEncoders.get(input.id); if (!encoder) { encoder = new PeerConnectionTransportEncoder_1.PeerConnectionTransportEncoder(this.parent.attachmentEncoderFactory.createPeerConnectionTransportAttachmentEncoder()); this._peerConnectionTransportEncoders.set(input.id, encoder); } return encoder.encode(input); } _encodeIceTransport(input) { let encoder = this._iceTransportEncoders.get(input.id); if (!encoder) { encoder = new IceTransportEncoder_1.IceTransportEncoder(this.parent.attachmentEncoderFactory.createIceTransportAttachmentEncoder()); this._iceTransportEncoders.set(input.id, encoder); } return encoder.encode(input); } _encodeIceCandidate(input) { let encoder = this._iceCandidateEncoders.get(input.id); if (!encoder) { encoder = new IceCandidateEncoder_1.IceCandidateEncoder(this.parent.attachmentEncoderFactory.createIceCandidateAttachmentEncoder()); this._iceCandidateEncoders.set(input.id, encoder); } return encoder.encode(input); } _encodeIceCandidatePair(input) { let encoder = this._iceCandidatePairEncoders.get(input.id); if (!encoder) { encoder = new IceCandidatePairStatsEncoder_1.IceCandidatePairEncoder(this.parent.attachmentEncoderFactory.createIceCandidatePairAttachmentEncoder()); this._iceCandidatePairEncoders.set(input.id, encoder); } return encoder.encode(input); } _encodeCertificate(input) { let encoder = this._certificateEncoders.get(input.id); if (!encoder) { encoder = new CertificateEncoder_1.CertificateEncoder(this.parent.attachmentEncoderFactory.createCertificateAttachmentEncoder()); this._certificateEncoders.set(input.id, encoder); } return encoder.encode(input); } checkVisitsAndClean() { let visited = false; for (const [id, encoder] of [...this._inboundTracksEncoders.entries()]) { if (!encoder.visited) { this._inboundTracksEncoders.delete(id); continue; } visited = true; } for (const [id, encoder] of [...this._outboundTracksEncoders.entries()]) { if (!encoder.visited) { this._outboundTracksEncoders.delete(id); continue; } visited = true; } for (const [id, encoder] of [...this._codecStatsEncoders.entries()]) { if (!encoder.visited) { this._codecStatsEncoders.delete(id); continue; } visited = true; } for (const [ssrc, encoder] of [...this._inboundRtpEncoders.entries()]) { if (!encoder.visited) { this._inboundRtpEncoders.delete(ssrc); continue; } visited = true; } for (const [ssrc, encoder] of [...this._remoteInboundRtpEncoders.entries()]) { if (!encoder.visited) { this._remoteInboundRtpEncoders.delete(ssrc); continue; } visited = true; } for (const [ssrc, encoder] of [...this._outboundRtpEncoders.entries()]) { if (!encoder.visited) { this._outboundRtpEncoders.delete(ssrc); continue; } visited = true; } for (const [ssrc, encoder] of [...this._remoteOutboundRtpEncoders.entries()]) { if (!encoder.visited) { this._remoteOutboundRtpEncoders.delete(ssrc); continue; } visited = true; } for (const [id, encoder] of [...this._mediaSourceEncoders.entries()]) { if (!encoder.visited) { this._mediaSourceEncoders.delete(id); continue; } visited = true; } for (const [id, encoder] of [...this._mediaPlayoutEncoders.entries()]) { if (!encoder.visited) { this._mediaPlayoutEncoders.delete(id); continue; } visited = true; } for (const [id, encoder] of [...this._peerConnectionTransportEncoders.entries()]) { if (!encoder.visited) { this._peerConnectionTransportEncoders.delete(id); continue; } visited = true; } for (const [id, encoder] of [...this._dataChannelEncoders.entries()]) { if (!encoder.visited) { this._dataChannelEncoders.delete(id); continue; } visited = true; } for (const [id, encoder] of [...this._iceTransportEncoders.entries()]) { if (!encoder.visited) { this._iceTransportEncoders.delete(id); continue; } visited = true; } for (const [id, encoder] of [...this._iceCandidateEncoders.entries()]) { if (!encoder.visited) { this._iceCandidateEncoders.delete(id); continue; } visited = true; } for (const [id, encoder] of [...this._iceCandidatePairEncoders.entries()]) { if (!encoder.visited) { this._iceCandidatePairEncoders.delete(id); continue; } visited = true; } for (const [id, encoder] of [...this._certificateEncoders.entries()]) { if (!encoder.visited) { this._certificateEncoders.delete(id); continue; } visited = true; } return visited; } } exports.PeerConnectionSampleEncoder = PeerConnectionSampleEncoder;