werift 0.19.0 → 0.19.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/common/src/binary.js +1 -1
- package/lib/common/src/binary.js.map +1 -1
- package/lib/common/src/network.js.map +1 -1
- package/lib/common/src/promise.js.map +1 -1
- package/lib/dtls/src/cipher/const.js +2 -2
- package/lib/dtls/src/cipher/const.js.map +1 -1
- package/lib/dtls/src/cipher/create.js +10 -10
- package/lib/dtls/src/cipher/create.js.map +1 -1
- package/lib/dtls/src/cipher/namedCurve.js.map +1 -1
- package/lib/dtls/src/cipher/prf.js +1 -1
- package/lib/dtls/src/cipher/prf.js.map +1 -1
- package/lib/dtls/src/cipher/suites/aead.d.ts +1 -1
- package/lib/dtls/src/cipher/suites/aead.js +5 -4
- package/lib/dtls/src/cipher/suites/aead.js.map +1 -1
- package/lib/dtls/src/client.js.map +1 -1
- package/lib/dtls/src/context/cipher.js +3 -3
- package/lib/dtls/src/context/cipher.js.map +1 -1
- package/lib/dtls/src/context/dtls.js.map +1 -1
- package/lib/dtls/src/context/srtp.js.map +1 -1
- package/lib/dtls/src/flight/client/flight5.js +8 -6
- package/lib/dtls/src/flight/client/flight5.js.map +1 -1
- package/lib/dtls/src/flight/flight.js +1 -1
- package/lib/dtls/src/flight/flight.js.map +1 -1
- package/lib/dtls/src/flight/server/flight2.js.map +1 -1
- package/lib/dtls/src/flight/server/flight4.js.map +1 -1
- package/lib/dtls/src/flight/server/flight6.js.map +1 -1
- package/lib/dtls/src/handshake/binary.d.ts +5 -5
- package/lib/dtls/src/handshake/binary.js +1 -1
- package/lib/dtls/src/handshake/binary.js.map +1 -1
- package/lib/dtls/src/handshake/const.js +1 -1
- package/lib/dtls/src/handshake/const.js.map +1 -1
- package/lib/dtls/src/handshake/extensions/ellipticCurves.d.ts +1 -1
- package/lib/dtls/src/handshake/extensions/ellipticCurves.js +2 -2
- package/lib/dtls/src/handshake/extensions/ellipticCurves.js.map +1 -1
- package/lib/dtls/src/handshake/extensions/extendedMasterSecret.js +1 -1
- package/lib/dtls/src/handshake/extensions/extendedMasterSecret.js.map +1 -1
- package/lib/dtls/src/handshake/extensions/renegotiationIndication.d.ts +2 -2
- package/lib/dtls/src/handshake/extensions/renegotiationIndication.js +2 -2
- package/lib/dtls/src/handshake/extensions/renegotiationIndication.js.map +1 -1
- package/lib/dtls/src/handshake/extensions/signature.d.ts +1 -1
- package/lib/dtls/src/handshake/extensions/signature.js +2 -2
- package/lib/dtls/src/handshake/extensions/signature.js.map +1 -1
- package/lib/dtls/src/handshake/extensions/useSrtp.d.ts +1 -1
- package/lib/dtls/src/handshake/extensions/useSrtp.js +2 -2
- package/lib/dtls/src/handshake/extensions/useSrtp.js.map +1 -1
- package/lib/dtls/src/handshake/message/alert.d.ts +2 -2
- package/lib/dtls/src/handshake/message/alert.js +2 -2
- package/lib/dtls/src/handshake/message/alert.js.map +1 -1
- package/lib/dtls/src/handshake/message/certificate.js +2 -2
- package/lib/dtls/src/handshake/message/certificate.js.map +1 -1
- package/lib/dtls/src/handshake/message/changeCipherSpec.d.ts +1 -1
- package/lib/dtls/src/handshake/message/changeCipherSpec.js +2 -2
- package/lib/dtls/src/handshake/message/changeCipherSpec.js.map +1 -1
- package/lib/dtls/src/handshake/message/client/certificateVerify.d.ts +1 -1
- package/lib/dtls/src/handshake/message/client/certificateVerify.js +2 -2
- package/lib/dtls/src/handshake/message/client/certificateVerify.js.map +1 -1
- package/lib/dtls/src/handshake/message/client/hello.d.ts +3 -3
- package/lib/dtls/src/handshake/message/client/hello.js +2 -2
- package/lib/dtls/src/handshake/message/client/hello.js.map +1 -1
- package/lib/dtls/src/handshake/message/client/keyExchange.js +2 -2
- package/lib/dtls/src/handshake/message/client/keyExchange.js.map +1 -1
- package/lib/dtls/src/handshake/message/server/certificateRequest.js +2 -2
- package/lib/dtls/src/handshake/message/server/certificateRequest.js.map +1 -1
- package/lib/dtls/src/handshake/message/server/hello.d.ts +5 -5
- package/lib/dtls/src/handshake/message/server/hello.js +2 -2
- package/lib/dtls/src/handshake/message/server/hello.js.map +1 -1
- package/lib/dtls/src/handshake/message/server/helloDone.js +2 -2
- package/lib/dtls/src/handshake/message/server/helloDone.js.map +1 -1
- package/lib/dtls/src/handshake/message/server/helloVerifyRequest.d.ts +2 -2
- package/lib/dtls/src/handshake/message/server/helloVerifyRequest.js +2 -2
- package/lib/dtls/src/handshake/message/server/helloVerifyRequest.js.map +1 -1
- package/lib/dtls/src/handshake/message/server/keyExchange.d.ts +6 -6
- package/lib/dtls/src/handshake/message/server/keyExchange.js +2 -2
- package/lib/dtls/src/handshake/message/server/keyExchange.js.map +1 -1
- package/lib/dtls/src/handshake/random.d.ts +1 -1
- package/lib/dtls/src/handshake/random.js +3 -3
- package/lib/dtls/src/handshake/random.js.map +1 -1
- package/lib/dtls/src/helper.d.ts +1 -1
- package/lib/dtls/src/helper.js.map +1 -1
- package/lib/dtls/src/record/const.js +2 -2
- package/lib/dtls/src/record/const.js.map +1 -1
- package/lib/dtls/src/record/message/fragment.d.ts +6 -6
- package/lib/dtls/src/record/message/fragment.js +4 -4
- package/lib/dtls/src/record/message/fragment.js.map +1 -1
- package/lib/dtls/src/record/message/header.d.ts +12 -12
- package/lib/dtls/src/record/message/header.js +3 -3
- package/lib/dtls/src/record/message/header.js.map +1 -1
- package/lib/dtls/src/record/message/plaintext.d.ts +12 -12
- package/lib/dtls/src/record/message/plaintext.js +2 -2
- package/lib/dtls/src/record/message/plaintext.js.map +1 -1
- package/lib/dtls/src/record/receive.js.map +1 -1
- package/lib/dtls/src/server.js.map +1 -1
- package/lib/dtls/src/socket.js +1 -1
- package/lib/dtls/src/socket.js.map +1 -1
- package/lib/dtls/src/transport.js.map +1 -1
- package/lib/dtls/src/util/binary.js +1 -1
- package/lib/dtls/src/util/binary.js.map +1 -1
- package/lib/ice/src/candidate.js +1 -1
- package/lib/ice/src/candidate.js.map +1 -1
- package/lib/ice/src/dns/lookup.d.ts +7 -0
- package/lib/ice/src/dns/lookup.js +47 -1
- package/lib/ice/src/dns/lookup.js.map +1 -1
- package/lib/ice/src/exceptions.d.ts +2 -2
- package/lib/ice/src/exceptions.js.map +1 -1
- package/lib/ice/src/helper.d.ts +1 -1
- package/lib/ice/src/helper.js.map +1 -1
- package/lib/ice/src/ice.d.ts +10 -18
- package/lib/ice/src/ice.js +62 -159
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/index.d.ts +2 -0
- package/lib/ice/src/index.js +4 -0
- package/lib/ice/src/index.js.map +1 -1
- package/lib/ice/src/stun/attributes.d.ts +2 -2
- package/lib/ice/src/stun/attributes.js +1 -1
- package/lib/ice/src/stun/attributes.js.map +1 -1
- package/lib/ice/src/stun/const.d.ts +1 -1
- package/lib/ice/src/stun/const.js +2 -2
- package/lib/ice/src/stun/const.js.map +1 -1
- package/lib/ice/src/stun/message.d.ts +1 -1
- package/lib/ice/src/stun/message.js +2 -2
- package/lib/ice/src/stun/message.js.map +1 -1
- package/lib/ice/src/stun/protocol.d.ts +5 -5
- package/lib/ice/src/stun/protocol.js.map +1 -1
- package/lib/ice/src/stun/transaction.d.ts +2 -2
- package/lib/ice/src/stun/transaction.js.map +1 -1
- package/lib/ice/src/transport.d.ts +3 -3
- package/lib/ice/src/transport.js +1 -1
- package/lib/ice/src/transport.js.map +1 -1
- package/lib/ice/src/turn/protocol.d.ts +32 -13
- package/lib/ice/src/turn/protocol.js +120 -36
- package/lib/ice/src/turn/protocol.js.map +1 -1
- package/lib/ice/src/types/model.d.ts +2 -2
- package/lib/ice/src/types/model.js.map +1 -1
- package/lib/ice/src/utils.d.ts +3 -2
- package/lib/ice/src/utils.js +72 -1
- package/lib/ice/src/utils.js.map +1 -1
- package/lib/rtp/src/codec/av1.js +1 -1
- package/lib/rtp/src/codec/av1.js.map +1 -1
- package/lib/rtp/src/codec/h264.js.map +1 -1
- package/lib/rtp/src/codec/index.js.map +1 -1
- package/lib/rtp/src/codec/opus.js.map +1 -1
- package/lib/rtp/src/codec/vp8.js.map +1 -1
- package/lib/rtp/src/codec/vp9.js.map +1 -1
- package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
- package/lib/rtp/src/extra/container/mp4/exp-golomb.js.map +1 -1
- package/lib/rtp/src/extra/container/mp4/h264.js +1 -1
- package/lib/rtp/src/extra/container/mp4/h264.js.map +1 -1
- package/lib/rtp/src/extra/container/mp4/sps-parser.js +4 -4
- package/lib/rtp/src/extra/container/mp4/sps-parser.js.map +1 -1
- package/lib/rtp/src/extra/container/ogg/parser.js.map +1 -1
- package/lib/rtp/src/extra/container/webm/container.js.map +1 -1
- package/lib/rtp/src/extra/container/webm/ebml/ebml.js +1 -1
- package/lib/rtp/src/extra/container/webm/ebml/ebml.js.map +1 -1
- package/lib/rtp/src/extra/container/webm/ebml/typedArrayUtils.js.map +1 -1
- package/lib/rtp/src/extra/processor/depacketizer.js.map +1 -1
- package/lib/rtp/src/extra/processor/depacketizerTransformer.js.map +1 -1
- package/lib/rtp/src/extra/processor/dtx.js.map +1 -1
- package/lib/rtp/src/extra/processor/interface.js.map +1 -1
- package/lib/rtp/src/extra/processor/jitterBuffer.js.map +1 -1
- package/lib/rtp/src/extra/processor/jitterBufferTransformer.js.map +1 -1
- package/lib/rtp/src/extra/processor/lipsync.js.map +1 -1
- package/lib/rtp/src/extra/processor/lipsyncCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/lipsyncCallback.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4Callback.js +1 -1
- package/lib/rtp/src/extra/processor/mp4Callback.js.map +1 -1
- package/lib/rtp/src/extra/processor/mute.js.map +1 -1
- package/lib/rtp/src/extra/processor/muteCallback.js.map +1 -1
- package/lib/rtp/src/extra/processor/nack.js.map +1 -1
- package/lib/rtp/src/extra/processor/ntpTime.js.map +1 -1
- package/lib/rtp/src/extra/processor/rtcpCallback.js.map +1 -1
- package/lib/rtp/src/extra/processor/rtpCallback.js.map +1 -1
- package/lib/rtp/src/extra/processor/rtpStream.js.map +1 -1
- package/lib/rtp/src/extra/processor/rtpTime.js.map +1 -1
- package/lib/rtp/src/extra/processor/webm.js.map +1 -1
- package/lib/rtp/src/extra/processor/webmCallback.js.map +1 -1
- package/lib/rtp/src/extra/processor/webmStream.js.map +1 -1
- package/lib/rtp/src/index.d.ts +1 -0
- package/lib/rtp/src/rtcp/header.js.map +1 -1
- package/lib/rtp/src/rtcp/psfb/fullIntraRequest.js +1 -1
- package/lib/rtp/src/rtcp/psfb/fullIntraRequest.js.map +1 -1
- package/lib/rtp/src/rtcp/psfb/index.js +1 -1
- package/lib/rtp/src/rtcp/psfb/index.js.map +1 -1
- package/lib/rtp/src/rtcp/psfb/pictureLossIndication.js +1 -1
- package/lib/rtp/src/rtcp/psfb/pictureLossIndication.js.map +1 -1
- package/lib/rtp/src/rtcp/psfb/remb.js +1 -1
- package/lib/rtp/src/rtcp/psfb/remb.js.map +1 -1
- package/lib/rtp/src/rtcp/rr.js +1 -1
- package/lib/rtp/src/rtcp/rr.js.map +1 -1
- package/lib/rtp/src/rtcp/rtcp.js.map +1 -1
- package/lib/rtp/src/rtcp/rtpfb/index.js +1 -1
- package/lib/rtp/src/rtcp/rtpfb/index.js.map +1 -1
- package/lib/rtp/src/rtcp/rtpfb/nack.js +2 -2
- package/lib/rtp/src/rtcp/rtpfb/nack.js.map +1 -1
- package/lib/rtp/src/rtcp/rtpfb/twcc.js +3 -3
- package/lib/rtp/src/rtcp/rtpfb/twcc.js.map +1 -1
- package/lib/rtp/src/rtcp/sdes.js +1 -1
- package/lib/rtp/src/rtcp/sdes.js.map +1 -1
- package/lib/rtp/src/rtcp/sr.js +1 -1
- package/lib/rtp/src/rtcp/sr.js.map +1 -1
- package/lib/rtp/src/rtp/headerExtension.js.map +1 -1
- package/lib/rtp/src/rtp/red/encoder.js.map +1 -1
- package/lib/rtp/src/rtp/red/handler.js.map +1 -1
- package/lib/rtp/src/rtp/red/packet.js +0 -1
- package/lib/rtp/src/rtp/red/packet.js.map +1 -1
- package/lib/rtp/src/rtp/rtp.js +3 -2
- package/lib/rtp/src/rtp/rtp.js.map +1 -1
- package/lib/rtp/src/rtp/rtx.js +1 -1
- package/lib/rtp/src/rtp/rtx.js.map +1 -1
- package/lib/rtp/src/srtp/cipher/ctr.d.ts +1 -1
- package/lib/rtp/src/srtp/cipher/ctr.js +1 -1
- package/lib/rtp/src/srtp/cipher/ctr.js.map +1 -1
- package/lib/rtp/src/srtp/cipher/gcm.d.ts +1 -1
- package/lib/rtp/src/srtp/cipher/gcm.js +1 -1
- package/lib/rtp/src/srtp/cipher/gcm.js.map +1 -1
- package/lib/rtp/src/srtp/const.js.map +1 -1
- package/lib/rtp/src/srtp/context/context.js +1 -1
- package/lib/rtp/src/srtp/context/context.js.map +1 -1
- package/lib/rtp/src/srtp/context/srtcp.js.map +1 -1
- package/lib/sctp/src/chunk.js +18 -18
- package/lib/sctp/src/chunk.js.map +1 -1
- package/lib/sctp/src/const.js +2 -2
- package/lib/sctp/src/const.js.map +1 -1
- package/lib/sctp/src/param.js +6 -6
- package/lib/sctp/src/param.js.map +1 -1
- package/lib/sctp/src/sctp.js +6 -2
- package/lib/sctp/src/sctp.js.map +1 -1
- package/lib/sctp/src/transport.js.map +1 -1
- package/lib/webrtc/src/dataChannel.d.ts +1 -1
- package/lib/webrtc/src/dataChannel.js +1 -1
- package/lib/webrtc/src/dataChannel.js.map +1 -1
- package/lib/webrtc/src/helper.js.map +1 -1
- package/lib/webrtc/src/media/parameters.d.ts +1 -2
- package/lib/webrtc/src/media/parameters.js.map +1 -1
- package/lib/webrtc/src/media/receiver/nack.js.map +1 -1
- package/lib/webrtc/src/media/receiver/receiverTwcc.js.map +1 -1
- package/lib/webrtc/src/media/receiver/statistics.js.map +1 -1
- package/lib/webrtc/src/media/router.js +4 -2
- package/lib/webrtc/src/media/router.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +1 -1
- package/lib/webrtc/src/media/rtpReceiver.js +1 -1
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.js +2 -2
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
- package/lib/webrtc/src/media/sender/cumulativeResult.js.map +1 -1
- package/lib/webrtc/src/media/sender/senderBWE.js.map +1 -1
- package/lib/webrtc/src/media/track.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/index.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/index.d.ts +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/index.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.d.ts +2 -2
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +2 -2
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
- package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +3 -2
- package/lib/webrtc/src/peerConnection.js +14 -8
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/sdp.d.ts +1 -1
- package/lib/webrtc/src/sdp.js +47 -37
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/transport/dtls.js.map +1 -1
- package/lib/webrtc/src/transport/ice.js.map +1 -1
- package/lib/webrtc/src/transport/sctp.js +10 -8
- package/lib/webrtc/src/transport/sctp.js.map +1 -1
- package/lib/webrtc/src/utils.js +1 -1
- package/lib/webrtc/src/utils.js.map +1 -1
- package/package.json +14 -22
- package/src/dataChannel.ts +1 -1
- package/src/media/parameters.ts +2 -2
- package/src/media/receiver/nack.ts +4 -7
- package/src/media/router.ts +36 -40
- package/src/media/rtpReceiver.ts +12 -15
- package/src/media/rtpSender.ts +70 -83
- package/src/nonstandard/recorder/writer/index.ts +1 -1
- package/src/nonstandard/recorder/writer/webm.ts +3 -3
- package/src/nonstandard/userMedia.ts +1 -3
- package/src/peerConnection.ts +32 -24
- package/src/sdp.ts +50 -56
- package/src/transport/dtls.ts +3 -6
- package/src/transport/ice.ts +1 -1
- package/src/transport/sctp.ts +61 -67
- package/src/utils.ts +1 -1
- package/src/typings/jspack.d.ts +0 -8
package/lib/ice/src/utils.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { InterfaceAddresses } from "../../common/src/network";
|
|
2
|
-
import { Address } from "./types/model";
|
|
1
|
+
import type { InterfaceAddresses } from "../../common/src/network";
|
|
2
|
+
import type { Address } from "./types/model";
|
|
3
3
|
export declare function getGlobalIp(stunServer?: Address, interfaceAddresses?: InterfaceAddresses): Promise<string>;
|
|
4
4
|
export declare function normalizeFamilyNodeV18(family: string | number): 4 | 6;
|
|
5
|
+
export declare function getHostAddresses(useIpv4: boolean, useIpv6: boolean): string[];
|
package/lib/ice/src/utils.js
CHANGED
|
@@ -1,6 +1,34 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
2
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.normalizeFamilyNodeV18 = exports.getGlobalIp = void 0;
|
|
29
|
+
exports.getHostAddresses = exports.normalizeFamilyNodeV18 = exports.getGlobalIp = void 0;
|
|
30
|
+
const os_1 = __importDefault(require("os"));
|
|
31
|
+
const nodeIp = __importStar(require("ip"));
|
|
4
32
|
const ice_1 = require("./ice");
|
|
5
33
|
const protocol_1 = require("./stun/protocol");
|
|
6
34
|
async function getGlobalIp(stunServer, interfaceAddresses) {
|
|
@@ -31,4 +59,47 @@ function normalizeFamilyNodeV18(family) {
|
|
|
31
59
|
return family;
|
|
32
60
|
}
|
|
33
61
|
exports.normalizeFamilyNodeV18 = normalizeFamilyNodeV18;
|
|
62
|
+
function isAutoconfigurationAddress(info) {
|
|
63
|
+
return (normalizeFamilyNodeV18(info.family) === 4 &&
|
|
64
|
+
info.address?.startsWith("169.254."));
|
|
65
|
+
}
|
|
66
|
+
function nodeIpAddress(family) {
|
|
67
|
+
// https://chromium.googlesource.com/external/webrtc/+/master/rtc_base/network.cc#236
|
|
68
|
+
const costlyNetworks = ["ipsec", "tun", "utun", "tap"];
|
|
69
|
+
const banNetworks = ["vmnet", "veth"];
|
|
70
|
+
const interfaces = os_1.default.networkInterfaces();
|
|
71
|
+
const all = Object.keys(interfaces)
|
|
72
|
+
.map((nic) => {
|
|
73
|
+
for (const word of [...costlyNetworks, ...banNetworks]) {
|
|
74
|
+
if (nic.startsWith(word)) {
|
|
75
|
+
return {
|
|
76
|
+
nic,
|
|
77
|
+
addresses: [],
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const addresses = interfaces[nic].filter((details) => normalizeFamilyNodeV18(details.family) === family &&
|
|
82
|
+
!nodeIp.isLoopback(details.address) &&
|
|
83
|
+
!isAutoconfigurationAddress(details));
|
|
84
|
+
return {
|
|
85
|
+
nic,
|
|
86
|
+
addresses: addresses.map((address) => address.address),
|
|
87
|
+
};
|
|
88
|
+
})
|
|
89
|
+
.filter((address) => !!address);
|
|
90
|
+
// os.networkInterfaces doesn't actually return addresses in a good order.
|
|
91
|
+
// have seen instances where en0 (ethernet) is after en1 (wlan), etc.
|
|
92
|
+
// eth0 > eth1
|
|
93
|
+
all.sort((a, b) => a.nic.localeCompare(b.nic));
|
|
94
|
+
return Object.values(all).flatMap((entry) => entry.addresses);
|
|
95
|
+
}
|
|
96
|
+
function getHostAddresses(useIpv4, useIpv6) {
|
|
97
|
+
const address = [];
|
|
98
|
+
if (useIpv4)
|
|
99
|
+
address.push(...nodeIpAddress(4));
|
|
100
|
+
if (useIpv6)
|
|
101
|
+
address.push(...nodeIpAddress(6));
|
|
102
|
+
return address;
|
|
103
|
+
}
|
|
104
|
+
exports.getHostAddresses = getHostAddresses;
|
|
34
105
|
//# sourceMappingURL=utils.js.map
|
package/lib/ice/src/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../ice/src/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../ice/src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import os from \"os\";\nimport * as nodeIp from \"ip\";\nimport type { InterfaceAddresses } from \"../../common/src/network\";\nimport { Connection, serverReflexiveCandidate } from \"./ice\";\nimport { StunProtocol } from \"./stun/protocol\";\nimport type { Address } from \"./types/model\";\n\nexport async function getGlobalIp(\n stunServer?: Address,\n interfaceAddresses?: InterfaceAddresses,\n) {\n const connection = new Connection(true, {\n stunServer: stunServer ?? [\"stun.l.google.com\", 19302],\n });\n await connection.gatherCandidates();\n\n const protocol = new StunProtocol(connection);\n protocol.localCandidate = connection.localCandidates[0];\n await protocol.connectionMade(true, undefined, interfaceAddresses);\n const candidate = await serverReflexiveCandidate(protocol, [\n \"stun.l.google.com\",\n 19302,\n ]);\n\n await connection.close();\n await protocol.close();\n\n if (!candidate?.host) {\n throw new Error(\"host not exist\");\n }\n\n return candidate?.host;\n}\n\nexport function normalizeFamilyNodeV18(family: string | number): 4 | 6 {\n if (family === \"IPv4\") return 4;\n if (family === \"IPv6\") return 6;\n\n return family as 4 | 6;\n}\n\nfunction isAutoconfigurationAddress(info: os.NetworkInterfaceInfo) {\n return (\n normalizeFamilyNodeV18(info.family) === 4 &&\n info.address?.startsWith(\"169.254.\")\n );\n}\n\nfunction nodeIpAddress(family: number): string[] {\n // https://chromium.googlesource.com/external/webrtc/+/master/rtc_base/network.cc#236\n const costlyNetworks = [\"ipsec\", \"tun\", \"utun\", \"tap\"];\n const banNetworks = [\"vmnet\", \"veth\"];\n\n const interfaces = os.networkInterfaces();\n\n const all = Object.keys(interfaces)\n .map((nic) => {\n for (const word of [...costlyNetworks, ...banNetworks]) {\n if (nic.startsWith(word)) {\n return {\n nic,\n addresses: [],\n };\n }\n }\n const addresses = interfaces[nic]!.filter(\n (details) =>\n normalizeFamilyNodeV18(details.family) === family &&\n !nodeIp.isLoopback(details.address) &&\n !isAutoconfigurationAddress(details),\n );\n return {\n nic,\n addresses: addresses.map((address) => address.address),\n };\n })\n .filter((address) => !!address);\n\n // os.networkInterfaces doesn't actually return addresses in a good order.\n // have seen instances where en0 (ethernet) is after en1 (wlan), etc.\n // eth0 > eth1\n all.sort((a, b) => a.nic.localeCompare(b.nic));\n return Object.values(all).flatMap((entry) => entry.addresses);\n}\n\nexport function getHostAddresses(useIpv4: boolean, useIpv6: boolean) {\n const address: string[] = [];\n if (useIpv4) address.push(...nodeIpAddress(4));\n if (useIpv6) address.push(...nodeIpAddress(6));\n return address;\n}\n"]}
|
package/lib/rtp/src/codec/av1.js
CHANGED
|
@@ -154,6 +154,7 @@ class AV1RtpPayload {
|
|
|
154
154
|
]);
|
|
155
155
|
}
|
|
156
156
|
}
|
|
157
|
+
exports.AV1RtpPayload = AV1RtpPayload;
|
|
157
158
|
Object.defineProperty(AV1RtpPayload, "deSerialize", {
|
|
158
159
|
enumerable: true,
|
|
159
160
|
configurable: true,
|
|
@@ -192,7 +193,6 @@ Object.defineProperty(AV1RtpPayload, "deSerialize", {
|
|
|
192
193
|
return p;
|
|
193
194
|
}
|
|
194
195
|
});
|
|
195
|
-
exports.AV1RtpPayload = AV1RtpPayload;
|
|
196
196
|
class AV1Obu {
|
|
197
197
|
constructor() {
|
|
198
198
|
Object.defineProperty(this, "obu_forbidden_bit", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"av1.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/av1.ts"],"names":[],"mappings":"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","sourcesContent":["// RTP Payload Format For AV1 https://aomediacodec.github.io/av1-rtp-spec/\n\nimport { LEB128 } from \"@minhducsun2002/leb128\";\nimport { debug } from \"debug\";\n\nimport { BitWriter2, getBit } from \"../../../common/src\";\nimport { RtpHeader } from \"..\";\n\nconst log = debug(\"werift-rtp : packages/rtp/src/codec/av1.ts\");\n\n// 4.4 AV1 Aggregation Header\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |Z|Y| W |N|-|-|-|\n// +-+-+-+-+-+-+-+-+\n\n// RTP payload syntax:\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// |Z|Y|0 0|N|-|-|-| OBU element 1 size (leb128) | |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |\n// : :\n// : OBU element 1 data :\n// : :\n// | |\n// | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | | OBU element 2 size (leb128) |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// : :\n// : OBU element 2 data :\n// : :\n// | |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// : :\n// : ... :\n// : :\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// |OBU e... N size| |\n// +-+-+-+-+-+-+-+-+ OBU element N data +-+-+-+-+-+-+-+-+\n// | |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\n// OBU syntax:\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |0| type |X|S|-| (REQUIRED)\n// +-+-+-+-+-+-+-+-+\n// X: | TID |SID|-|-|-| (OPTIONAL)\n// +-+-+-+-+-+-+-+-+\n// |1| |\n// +-+ OBU payload |\n// S: |1| | (OPTIONAL, variable length leb128 encoded)\n// +-+ size |\n// |0| |\n// +-+-+-+-+-+-+-+-+\n// | OBU payload |\n// | ... |\n\nexport class AV1RtpPayload {\n /**\n * RtpStartsWithFragment\n * MUST be set to 1 if the first OBU element is an OBU fragment that is a continuation of an OBU fragment from the previous packet, and MUST be set to 0 otherwise.\n */\n zBit_RtpStartsWithFragment!: number;\n /**\n * RtpEndsWithFragment\n * MUST be set to 1 if the last OBU element is an OBU fragment that will continue in the next packet, and MUST be set to 0 otherwise.\n */\n yBit_RtpEndsWithFragment!: number;\n /**\n * RtpNumObus\n * two bit field that describes the number of OBU elements in the packet. This field MUST be set equal to 0 or equal to the number of OBU elements contained in the packet. If set to 0, each OBU element MUST be preceded by a length field.\n */\n w_RtpNumObus!: number;\n /**\n * RtpStartsNewCodedVideoSequence\n * MUST be set to 1 if the packet is the first packet of a coded video sequence, and MUST be set to 0 otherwise.\n */\n nBit_RtpStartsNewCodedVideoSequence!: number;\n obu_or_fragment: { data: Buffer; isFragment: boolean }[] = [];\n\n static deSerialize = (buf: Buffer) => {\n const p = new AV1RtpPayload();\n\n let offset = 0;\n\n p.zBit_RtpStartsWithFragment = getBit(buf[offset], 0);\n p.yBit_RtpEndsWithFragment = getBit(buf[offset], 1);\n p.w_RtpNumObus = getBit(buf[offset], 2, 2);\n p.nBit_RtpStartsNewCodedVideoSequence = getBit(buf[offset], 4);\n offset++;\n\n if (p.nBit_RtpStartsNewCodedVideoSequence && p.zBit_RtpStartsWithFragment) {\n throw new Error();\n }\n\n [...Array(p.w_RtpNumObus - 1).keys()].forEach((i) => {\n const [elementSize, bytes] = leb128decode(buf.subarray(offset));\n\n const start = offset + bytes;\n const end = start + elementSize;\n\n let isFragment = false;\n if (p.zBit_RtpStartsWithFragment && i === 0) {\n isFragment = true;\n }\n p.obu_or_fragment.push({ data: buf.subarray(start, end), isFragment });\n\n offset += bytes + elementSize;\n });\n let isFragment = false;\n if (\n p.yBit_RtpEndsWithFragment ||\n (p.w_RtpNumObus === 1 && p.zBit_RtpStartsWithFragment)\n ) {\n isFragment = true;\n }\n p.obu_or_fragment.push({\n data: buf.subarray(offset),\n isFragment: isFragment,\n });\n\n return p;\n };\n\n static isDetectedFinalPacketInSequence(header: RtpHeader) {\n return header.marker;\n }\n\n get isKeyframe() {\n return this.nBit_RtpStartsNewCodedVideoSequence === 1;\n }\n\n static getFrame(payloads: AV1RtpPayload[]) {\n const frames: Buffer[] = [];\n const objects = payloads\n .flatMap((p) => p.obu_or_fragment)\n .reduce(\n (\n acc: Record<number, { data: Buffer; isFragment: boolean }>,\n cur,\n i,\n ) => {\n acc[i] = cur;\n return acc;\n },\n {},\n );\n const length = Object.keys(objects).length;\n\n for (const i of Object.keys(objects).map(Number)) {\n const exist = objects[i];\n if (!exist) continue;\n const { data, isFragment } = exist;\n if (isFragment) {\n let fragments: Buffer[] = [];\n for (let head = i; head < length; head++) {\n const target = objects[head];\n if (target.isFragment) {\n fragments.push(target.data);\n delete objects[head];\n } else {\n break;\n }\n }\n if (fragments.length <= 1) {\n log(\"fragment lost, maybe packet lost\");\n fragments = [];\n }\n frames.push(Buffer.concat(fragments));\n } else {\n frames.push(data);\n }\n }\n const obus = frames.map((f) => AV1Obu.deSerialize(f));\n const lastObu = obus.pop()!;\n return Buffer.concat([\n ...obus.map((o) => {\n o.obu_has_size_field = 1;\n return o.serialize();\n }),\n lastObu.serialize(),\n ]);\n }\n}\n\nexport class AV1Obu {\n obu_forbidden_bit!: number;\n obu_type!: OBU_TYPE;\n obu_extension_flag!: number;\n obu_has_size_field!: number;\n obu_reserved_1bit!: number;\n payload!: Buffer;\n\n static deSerialize(buf: Buffer) {\n const obu = new AV1Obu();\n let offset = 0;\n obu.obu_forbidden_bit = getBit(buf[offset], 0);\n obu.obu_type =\n OBU_TYPES[getBit(buf[offset], 1, 4) as keyof typeof OBU_TYPES];\n obu.obu_extension_flag = getBit(buf[offset], 5);\n obu.obu_has_size_field = getBit(buf[offset], 6);\n obu.obu_reserved_1bit = getBit(buf[offset], 7);\n offset++;\n\n obu.payload = buf.subarray(offset);\n\n return obu;\n }\n\n serialize() {\n const header = new BitWriter2(8)\n .set(this.obu_forbidden_bit)\n .set(OBU_TYPE_IDS[this.obu_type], 4)\n .set(this.obu_extension_flag)\n .set(this.obu_has_size_field)\n .set(this.obu_reserved_1bit).buffer;\n let obuSize: Uint8Array | Buffer = Buffer.alloc(0);\n if (this.obu_has_size_field) {\n obuSize = LEB128.encode(this.payload.length);\n }\n return Buffer.concat([header, obuSize, this.payload]);\n }\n}\n\nexport function leb128decode(buf: Buffer) {\n let value = 0;\n let leb128bytes = 0;\n for (let i = 0; i < 8; i++) {\n const leb128byte = buf.readUInt8(i);\n value |= (leb128byte & 0x7f) << (i * 7);\n leb128bytes++;\n if (!(leb128byte & 0x80)) {\n break;\n }\n }\n return [value, leb128bytes];\n}\n\nconst OBU_TYPES = {\n 0: \"Reserved\",\n 1: \"OBU_SEQUENCE_HEADER\",\n 2: \"OBU_TEMPORAL_DELIMITER\",\n 3: \"OBU_FRAME_HEADER\",\n 4: \"OBU_TILE_GROUP\",\n 5: \"OBU_METADATA\",\n 6: \"OBU_FRAME\",\n 7: \"OBU_REDUNDANT_FRAME_HEADER\",\n 8: \"OBU_TILE_LIST\",\n 15: \"OBU_PADDING\",\n} as const;\ntype OBU_TYPE = (typeof OBU_TYPES)[keyof typeof OBU_TYPES];\nconst OBU_TYPE_IDS: Record<OBU_TYPE, number> = Object.entries(OBU_TYPES).reduce(\n (acc: any, [key, value]) => {\n acc[value] = Number(key);\n return acc;\n },\n {},\n);\n"]}
|
|
1
|
+
{"version":3,"file":"av1.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/av1.ts"],"names":[],"mappings":"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","sourcesContent":["// RTP Payload Format For AV1 https://aomediacodec.github.io/av1-rtp-spec/\n\nimport { LEB128 } from \"@minhducsun2002/leb128\";\nimport { debug } from \"debug\";\n\nimport { RtpHeader } from \"..\";\nimport { BitWriter2, getBit } from \"../../../common/src\";\n\nconst log = debug(\"werift-rtp : packages/rtp/src/codec/av1.ts\");\n\n// 4.4 AV1 Aggregation Header\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |Z|Y| W |N|-|-|-|\n// +-+-+-+-+-+-+-+-+\n\n// RTP payload syntax:\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// |Z|Y|0 0|N|-|-|-| OBU element 1 size (leb128) | |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |\n// : :\n// : OBU element 1 data :\n// : :\n// | |\n// | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | | OBU element 2 size (leb128) |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// : :\n// : OBU element 2 data :\n// : :\n// | |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// : :\n// : ... :\n// : :\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// |OBU e... N size| |\n// +-+-+-+-+-+-+-+-+ OBU element N data +-+-+-+-+-+-+-+-+\n// | |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\n// OBU syntax:\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |0| type |X|S|-| (REQUIRED)\n// +-+-+-+-+-+-+-+-+\n// X: | TID |SID|-|-|-| (OPTIONAL)\n// +-+-+-+-+-+-+-+-+\n// |1| |\n// +-+ OBU payload |\n// S: |1| | (OPTIONAL, variable length leb128 encoded)\n// +-+ size |\n// |0| |\n// +-+-+-+-+-+-+-+-+\n// | OBU payload |\n// | ... |\n\nexport class AV1RtpPayload {\n /**\n * RtpStartsWithFragment\n * MUST be set to 1 if the first OBU element is an OBU fragment that is a continuation of an OBU fragment from the previous packet, and MUST be set to 0 otherwise.\n */\n zBit_RtpStartsWithFragment!: number;\n /**\n * RtpEndsWithFragment\n * MUST be set to 1 if the last OBU element is an OBU fragment that will continue in the next packet, and MUST be set to 0 otherwise.\n */\n yBit_RtpEndsWithFragment!: number;\n /**\n * RtpNumObus\n * two bit field that describes the number of OBU elements in the packet. This field MUST be set equal to 0 or equal to the number of OBU elements contained in the packet. If set to 0, each OBU element MUST be preceded by a length field.\n */\n w_RtpNumObus!: number;\n /**\n * RtpStartsNewCodedVideoSequence\n * MUST be set to 1 if the packet is the first packet of a coded video sequence, and MUST be set to 0 otherwise.\n */\n nBit_RtpStartsNewCodedVideoSequence!: number;\n obu_or_fragment: { data: Buffer; isFragment: boolean }[] = [];\n\n static deSerialize = (buf: Buffer) => {\n const p = new AV1RtpPayload();\n\n let offset = 0;\n\n p.zBit_RtpStartsWithFragment = getBit(buf[offset], 0);\n p.yBit_RtpEndsWithFragment = getBit(buf[offset], 1);\n p.w_RtpNumObus = getBit(buf[offset], 2, 2);\n p.nBit_RtpStartsNewCodedVideoSequence = getBit(buf[offset], 4);\n offset++;\n\n if (p.nBit_RtpStartsNewCodedVideoSequence && p.zBit_RtpStartsWithFragment) {\n throw new Error();\n }\n\n [...Array(p.w_RtpNumObus - 1).keys()].forEach((i) => {\n const [elementSize, bytes] = leb128decode(buf.subarray(offset));\n\n const start = offset + bytes;\n const end = start + elementSize;\n\n let isFragment = false;\n if (p.zBit_RtpStartsWithFragment && i === 0) {\n isFragment = true;\n }\n p.obu_or_fragment.push({ data: buf.subarray(start, end), isFragment });\n\n offset += bytes + elementSize;\n });\n let isFragment = false;\n if (\n p.yBit_RtpEndsWithFragment ||\n (p.w_RtpNumObus === 1 && p.zBit_RtpStartsWithFragment)\n ) {\n isFragment = true;\n }\n p.obu_or_fragment.push({\n data: buf.subarray(offset),\n isFragment: isFragment,\n });\n\n return p;\n };\n\n static isDetectedFinalPacketInSequence(header: RtpHeader) {\n return header.marker;\n }\n\n get isKeyframe() {\n return this.nBit_RtpStartsNewCodedVideoSequence === 1;\n }\n\n static getFrame(payloads: AV1RtpPayload[]) {\n const frames: Buffer[] = [];\n const objects = payloads\n .flatMap((p) => p.obu_or_fragment)\n .reduce(\n (\n acc: Record<number, { data: Buffer; isFragment: boolean }>,\n cur,\n i,\n ) => {\n acc[i] = cur;\n return acc;\n },\n {},\n );\n const length = Object.keys(objects).length;\n\n for (const i of Object.keys(objects).map(Number)) {\n const exist = objects[i];\n if (!exist) continue;\n const { data, isFragment } = exist;\n if (isFragment) {\n let fragments: Buffer[] = [];\n for (let head = i; head < length; head++) {\n const target = objects[head];\n if (target.isFragment) {\n fragments.push(target.data);\n delete objects[head];\n } else {\n break;\n }\n }\n if (fragments.length <= 1) {\n log(\"fragment lost, maybe packet lost\");\n fragments = [];\n }\n frames.push(Buffer.concat(fragments));\n } else {\n frames.push(data);\n }\n }\n const obus = frames.map((f) => AV1Obu.deSerialize(f));\n const lastObu = obus.pop()!;\n return Buffer.concat([\n ...obus.map((o) => {\n o.obu_has_size_field = 1;\n return o.serialize();\n }),\n lastObu.serialize(),\n ]);\n }\n}\n\nexport class AV1Obu {\n obu_forbidden_bit!: number;\n obu_type!: OBU_TYPE;\n obu_extension_flag!: number;\n obu_has_size_field!: number;\n obu_reserved_1bit!: number;\n payload!: Buffer;\n\n static deSerialize(buf: Buffer) {\n const obu = new AV1Obu();\n let offset = 0;\n obu.obu_forbidden_bit = getBit(buf[offset], 0);\n obu.obu_type =\n OBU_TYPES[getBit(buf[offset], 1, 4) as keyof typeof OBU_TYPES];\n obu.obu_extension_flag = getBit(buf[offset], 5);\n obu.obu_has_size_field = getBit(buf[offset], 6);\n obu.obu_reserved_1bit = getBit(buf[offset], 7);\n offset++;\n\n obu.payload = buf.subarray(offset);\n\n return obu;\n }\n\n serialize() {\n const header = new BitWriter2(8)\n .set(this.obu_forbidden_bit)\n .set(OBU_TYPE_IDS[this.obu_type], 4)\n .set(this.obu_extension_flag)\n .set(this.obu_has_size_field)\n .set(this.obu_reserved_1bit).buffer;\n let obuSize: Uint8Array | Buffer = Buffer.alloc(0);\n if (this.obu_has_size_field) {\n obuSize = LEB128.encode(this.payload.length);\n }\n return Buffer.concat([header, obuSize, this.payload]);\n }\n}\n\nexport function leb128decode(buf: Buffer) {\n let value = 0;\n let leb128bytes = 0;\n for (let i = 0; i < 8; i++) {\n const leb128byte = buf.readUInt8(i);\n value |= (leb128byte & 0x7f) << (i * 7);\n leb128bytes++;\n if (!(leb128byte & 0x80)) {\n break;\n }\n }\n return [value, leb128bytes];\n}\n\nconst OBU_TYPES = {\n 0: \"Reserved\",\n 1: \"OBU_SEQUENCE_HEADER\",\n 2: \"OBU_TEMPORAL_DELIMITER\",\n 3: \"OBU_FRAME_HEADER\",\n 4: \"OBU_TILE_GROUP\",\n 5: \"OBU_METADATA\",\n 6: \"OBU_FRAME\",\n 7: \"OBU_REDUNDANT_FRAME_HEADER\",\n 8: \"OBU_TILE_LIST\",\n 15: \"OBU_PADDING\",\n} as const;\ntype OBU_TYPE = (typeof OBU_TYPES)[keyof typeof OBU_TYPES];\nconst OBU_TYPE_IDS: Record<OBU_TYPE, number> = Object.entries(OBU_TYPES).reduce(\n (acc: any, [key, value]) => {\n acc[value] = Number(key);\n return acc;\n },\n {},\n);\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"h264.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/h264.ts"],"names":[],"mappings":";AAAA,gDAAgD;AAChD,WAAW;;;AAEX,6CAAwD;AAIxD,qBAAqB;AACrB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AAEpB,YAAY;AACZ,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AAEpB,kEAAkE;AAClE,mEAAmE;AACnE,iEAAiE;AACjE,iEAAiE;AACjE,iEAAiE;AACjE,iEAAiE;AAEjE,iEAAiE;AACjE,8DAA8D;AAC9D,gEAAgE;AAChE,4DAA4D;AAC5D,4DAA4D;AAC5D,4DAA4D;AAC5D,4DAA4D;AAC5D,4DAA4D;AAC5D,4DAA4D;AAC5D,4DAA4D;AAC5D,4DAA4D;AAC5D,4DAA4D;AAE5D,MAAa,cAAc;IAA3B;QACE,wBAAwB;QACxB;;;;;WAAW;QACX,iBAAiB;QACjB;;;;;WAAa;QACb,oBAAoB;QACpB;;;;;WAAqB;QACrB,oCAAoC;QACpC;;;;;WAAW;QACX,kCAAkC;QAClC;;;;;WAAW;QACX;;;;;WAAW;QACX;;;;;WAA4B;QAC5B;;;;;WAAiB;QACjB;;;;;WAAkB;IA0FpB,CAAC;IAxFC,MAAM,CAAC,WAAW,CAAC,GAAW,EAAE,QAAiB;QAC/C,MAAM,IAAI,GAAG,IAAI,cAAc,EAAE,CAAC;QAElC,IAAI,MAAM,GAAG,CAAC,CAAC;QAEf,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,CAAC,GAAG,IAAA,YAAM,EAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,GAAG,IAAA,YAAM,EAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,WAAW,GAAG,IAAA,YAAM,EAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,MAAM,EAAE,CAAC;QAET,IAAI,CAAC,CAAC,GAAG,IAAA,YAAM,EAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,CAAC,GAAG,IAAA,YAAM,EAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,CAAC,GAAG,IAAA,YAAM,EAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,kBAAkB,GAAG,IAAA,YAAM,EAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,EAAE,CAAC;QAET,+BAA+B;QAC/B,oDAAoD;QACpD,4DAA4D;QAE5D,yBAAyB;QACzB,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,GAAG,mBAAW,CAAC,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"h264.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/h264.ts"],"names":[],"mappings":"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","sourcesContent":["// RFC 6184 - RTP Payload Format for H.264 Video\n// pion/rtp\n\nimport { BitStream, getBit } from \"../../../common/src\";\nimport { RtpHeader } from \"../rtp/rtp\";\nimport { DePacketizerBase } from \"./base\";\n\n// FU indicator octet\n// +---------------+\n// |0|1|2|3|4|5|6|7|\n// +-+-+-+-+-+-+-+-+\n// |F|NRI| Type |\n// +---------------+\n\n// FU header\n// +---------------+\n// |0|1|2|3|4|5|6|7|\n// +-+-+-+-+-+-+-+-+\n// |S|E|R| Type |\n// +---------------+\n\n// NAL Unit Type Content of NAL Unit NRI (binary)\n// ----------------------------------------------------------------\n// 1 non-IDR coded slice 10\n// 2 Coded slice data partition A 10\n// 3 Coded slice data partition B 01\n// 4 Coded slice data partition C 01\n\n// Payload Packet Single NAL Non-Interleaved Interleaved\n// Type Type Unit Mode Mode Mode\n// -------------------------------------------------------------\n// 0 reserved ig ig ig\n// 1-23 NAL unit yes yes no\n// 24 STAP-A no yes no\n// 25 STAP-B no no yes\n// 26 MTAP16 no no yes\n// 27 MTAP24 no no yes\n// 28 FU-A no yes yes\n// 29 FU-B no no yes\n// 30-31 reserved ig ig ig\n\nexport class H264RtpPayload implements DePacketizerBase {\n /**forbidden_zero_bit */\n f!: number;\n /**nal_ref_idc */\n nri!: number;\n /**nal_unit_types */\n nalUnitType!: number;\n /**start of a fragmented NAL unit */\n s!: number;\n /**end of a fragmented NAL unit */\n e!: number;\n r!: number;\n nalUnitPayloadType!: number;\n payload!: Buffer;\n fragment?: Buffer;\n\n static deSerialize(buf: Buffer, fragment?: Buffer) {\n const h264 = new H264RtpPayload();\n\n let offset = 0;\n\n const naluHeader = buf[offset];\n h264.f = getBit(naluHeader, 0);\n h264.nri = getBit(naluHeader, 1, 2);\n h264.nalUnitType = getBit(naluHeader, 3, 5);\n offset++;\n\n h264.s = getBit(buf[offset], 0);\n h264.e = getBit(buf[offset], 1);\n h264.r = getBit(buf[offset], 2);\n h264.nalUnitPayloadType = getBit(buf[offset], 3, 5);\n offset++;\n\n // デフォルトでは packetization-mode=0\n // packetization-mode=0だとSingle NAL Unit Packetしか来ない\n // https://datatracker.ietf.org/doc/html/rfc6184#section-6.2\n\n // Single NAL Unit Packet\n if (0 < h264.nalUnitType && h264.nalUnitType < NalUnitType.stap_a) {\n h264.payload = this.packaging(buf);\n }\n // Single-time aggregation packet\n else if (h264.nalUnitType === NalUnitType.stap_a) {\n let offset = stap_aHeaderSize;\n let result: Buffer = Buffer.alloc(0);\n while (offset < buf.length) {\n const naluSize = buf.readUInt16BE(offset);\n offset += stap_aNALULengthSize;\n\n result = Buffer.concat([\n result,\n this.packaging(buf.subarray(offset, offset + naluSize)),\n ]);\n offset += naluSize;\n }\n h264.payload = result;\n }\n // Fragmentation Units\n else if (h264.nalUnitType === NalUnitType.fu_a) {\n if (!fragment) {\n fragment = Buffer.alloc(0);\n }\n const fu = buf.subarray(offset);\n h264.fragment = Buffer.concat([fragment, fu]);\n\n if (h264.e) {\n const bitStream = new BitStream(Buffer.alloc(1))\n .writeBits(1, 0)\n .writeBits(2, h264.nri)\n .writeBits(5, h264.nalUnitPayloadType);\n const nalu = Buffer.concat([bitStream.uint8Array, h264.fragment]);\n h264.fragment = undefined;\n h264.payload = this.packaging(nalu);\n }\n }\n\n return h264;\n }\n\n private static packaging(buf: Buffer) {\n return Buffer.concat([annex_bNALUStartCode, buf]);\n }\n\n static isDetectedFinalPacketInSequence(header: RtpHeader) {\n return header.marker;\n }\n\n get isKeyframe() {\n return (\n this.nalUnitType === NalUnitType.idrSlice ||\n this.nalUnitPayloadType === NalUnitType.idrSlice\n );\n }\n\n get isPartitionHead() {\n if (\n this.nalUnitType === NalUnitType.fu_a ||\n this.nalUnitType === NalUnitType.fu_b\n ) {\n return this.s !== 0;\n }\n\n return true;\n }\n}\n\nexport const NalUnitType = {\n idrSlice: 5,\n stap_a: 24,\n stap_b: 25,\n mtap16: 26,\n mtap24: 27,\n fu_a: 28,\n fu_b: 29,\n} as const;\n\nconst annex_bNALUStartCode = Buffer.from([0x00, 0x00, 0x00, 0x01]);\n\nconst stap_aHeaderSize = 1;\nconst stap_aNALULengthSize = 2;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,+BAAsC;AAEtC,iCAAwC;AACxC,iCAAwC;AACxC,+BAAsC;AACtC,+BAAsC;AAEtC,wCAAsB;AACtB,yCAAuB;AACvB,yCAAuB;AACvB,yCAAuB;AACvB,wCAAsB;AACtB,wCAAsB;AAEtB,SAAgB,qBAAqB,CACnC,KAAwB,EACxB,OAAoB,EACpB,mBAA4B;IAQ5B,MAAM,gBAAgB,GAAG,CAAC,YAAqC,EAAE,EAAE;QACjE,MAAM,UAAU,GAAuB,EAAE,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { RtpPacket } from \"../rtp/rtp\";\nimport { AV1RtpPayload } from \"./av1\";\nimport { DePacketizerBase } from \"./base\";\nimport { H264RtpPayload } from \"./h264\";\nimport { OpusRtpPayload } from \"./opus\";\nimport { Vp8RtpPayload } from \"./vp8\";\nimport { Vp9RtpPayload } from \"./vp9\";\n\nexport * from \"./av1\";\nexport * from \"./base\";\nexport * from \"./h264\";\nexport * from \"./opus\";\nexport * from \"./vp8\";\nexport * from \"./vp9\";\n\nexport function dePacketizeRtpPackets(\n codec: DepacketizerCodec,\n packets: RtpPacket[],\n frameFragmentBuffer?: Buffer,\n): {\n isKeyframe: boolean;\n data: Buffer;\n sequence: number;\n timestamp: number;\n frameFragmentBuffer?: Buffer;\n} {\n const basicCodecParser = (Depacketizer: typeof DePacketizerBase) => {\n const partitions: DePacketizerBase[] = [];\n for (const p of packets) {\n const codec = Depacketizer.deSerialize(p.payload, frameFragmentBuffer);\n if (codec.fragment) {\n frameFragmentBuffer ??= Buffer.alloc(0);\n frameFragmentBuffer = codec.fragment;\n } else if (codec.payload) {\n frameFragmentBuffer = undefined;\n }\n partitions.push(codec);\n }\n const isKeyframe = !!partitions.find((f) => f.isKeyframe);\n const data = Buffer.concat(\n partitions.map((f) => f.payload).filter((p) => p),\n );\n\n return {\n isKeyframe,\n data,\n sequence: packets.at(-1)?.header.sequenceNumber ?? 0,\n timestamp: packets.at(-1)?.header.timestamp ?? 0,\n frameFragmentBuffer,\n };\n };\n\n switch (codec.toUpperCase()) {\n case \"AV1\": {\n const chunks = packets.map((p) => AV1RtpPayload.deSerialize(p.payload));\n const isKeyframe = !!chunks.find((f) => f.isKeyframe);\n const data = AV1RtpPayload.getFrame(chunks);\n return {\n isKeyframe,\n data,\n sequence: packets.at(-1)?.header.sequenceNumber ?? 0,\n timestamp: packets.at(-1)?.header.timestamp ?? 0,\n };\n }\n case \"MPEG4/ISO/AVC\":\n return basicCodecParser(H264RtpPayload);\n case \"VP8\":\n return basicCodecParser(Vp8RtpPayload);\n case \"VP9\":\n return basicCodecParser(Vp9RtpPayload);\n case \"OPUS\":\n return basicCodecParser(OpusRtpPayload);\n default:\n throw new Error();\n }\n}\n\nexport const depacketizerCodecs = [\n \"MPEG4/ISO/AVC\",\n \"VP8\",\n \"VP9\",\n \"OPUS\",\n \"AV1\",\n] as const;\nexport type DepacketizerCodec =\n | (typeof depacketizerCodecs)[number]\n | Lowercase<(typeof depacketizerCodecs)[number]>;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opus.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/opus.ts"],"names":[],"mappings":";;;AAAA,6CAAmE;AAInE,MAAa,cAAc;IAA3B;QACE;;;;;WAAiB;IAuBnB,CAAC;IArBC,MAAM,CAAC,WAAW,CAAC,GAAW;QAC5B,MAAM,IAAI,GAAG,IAAI,cAAc,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,+BAA+B,CAAC,MAAiB;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,kBAAkB,CAAC,
|
|
1
|
+
{"version":3,"file":"opus.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/opus.ts"],"names":[],"mappings":";;;AAAA,6CAAmE;AAInE,MAAa,cAAc;IAA3B;QACE;;;;;WAAiB;IAuBnB,CAAC;IArBC,MAAM,CAAC,WAAW,CAAC,GAAW;QAC5B,MAAM,IAAI,GAAG,IAAI,cAAc,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,+BAA+B,CAAC,MAAiB;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,kBAAkB,CAAC,iBAAiB,GAAG,KAAK;QACjD,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;YACvB,IAAA,kBAAY,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5B,IAAA,oBAAc,EAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SAC7D,CAAC,CAAC;IACL,CAAC;CACF;AAxBD,wCAwBC","sourcesContent":["import { bufferWriter, bufferWriterLE } from \"../../../common/src\";\nimport { RtpHeader } from \"../rtp/rtp\";\nimport { DePacketizerBase } from \"./base\";\n\nexport class OpusRtpPayload implements DePacketizerBase {\n payload!: Buffer;\n\n static deSerialize(buf: Buffer) {\n const opus = new OpusRtpPayload();\n opus.payload = buf;\n return opus;\n }\n\n static isDetectedFinalPacketInSequence(header: RtpHeader) {\n return true;\n }\n\n get isKeyframe() {\n return true;\n }\n\n static createCodecPrivate(samplingFrequency = 48000) {\n return Buffer.concat([\n Buffer.from(\"OpusHead\"),\n bufferWriter([1, 1], [1, 2]),\n bufferWriterLE([2, 4, 2, 1], [312, samplingFrequency, 0, 0]),\n ]);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vp8.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/vp8.ts"],"names":[],"mappings":";;;AAAA,6CAA0D;AAI1D,8CAA8C;AAE9C,8DAA8D;AAC9D,8DAA8D;AAC9D,yEAAyE;AACzE,8DAA8D;AAC9D,yEAAyE;AACzE,8DAA8D;AAC9D,yEAAyE;AACzE,8DAA8D;AAC9D,8DAA8D;AAC9D,8DAA8D;AAC9D,yEAAyE;AACzE,8DAA8D;AAC9D,yEAAyE;AACzE,8DAA8D;AAE9D,kBAAkB;AAClB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AAEpB,MAAa,aAAa;IAA1B;QACE;;;;;WAAc;QACd;;;;;WAAc;QACd;;;;;WAAc;QACd;;;;;WAAa;QACb;;;;;WAAc;QACd;;;;;WAAc;QACd;;;;;WAAc;QACd;;;;;WAAc;QACd;;;;;WAAc;QACd;;;;;WAAmB;QACnB;;;;;WAAiB;QACjB;;;;
|
|
1
|
+
{"version":3,"file":"vp8.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/vp8.ts"],"names":[],"mappings":"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","sourcesContent":["import { getBit, paddingByte } from \"../../../common/src\";\nimport { RtpHeader } from \"../rtp/rtp\";\nimport { DePacketizerBase } from \"./base\";\n\n// RFC 7741 - RTP Payload Format for VP8 Video\n\n// 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\n// |X|R|N|S|R| PID | (REQUIRED) |X|R|N|S|R| PID | (REQUIRED)\n// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\n// X: |I|L|T|K| RSV | (OPTIONAL) X: |I|L|T|K| RSV | (OPTIONAL)\n// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\n// I: |M| PictureID | (OPTIONAL) I: |M| PictureID | (OPTIONAL)\n// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\n// L: | TL0PICIDX | (OPTIONAL) | PictureID |\n// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\n// T/K: |TID|Y| KEYIDX | (OPTIONAL) L: | TL0PICIDX | (OPTIONAL)\n// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\n// T/K: |TID|Y| KEYIDX | (OPTIONAL)\n// +-+-+-+-+-+-+-+-+\n\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |Size0|H| VER |P|\n// +-+-+-+-+-+-+-+-+\n// | Size1 |\n// +-+-+-+-+-+-+-+-+\n// | Size2 |\n// +-+-+-+-+-+-+-+-+\n// | Octets 4..N of|\n// | VP8 payload |\n// : :\n// +-+-+-+-+-+-+-+-+\n// | OPTIONAL RTP |\n// | padding |\n// : :\n// +-+-+-+-+-+-+-+-+\n\nexport class Vp8RtpPayload implements DePacketizerBase {\n xBit!: number;\n nBit!: number;\n sBit!: number;\n pid!: number;\n iBit?: number;\n lBit?: number;\n tBit?: number;\n kBit?: number;\n mBit?: number;\n pictureId?: number;\n payload!: Buffer;\n size0 = 0;\n hBit?: number;\n ver?: number;\n pBit?: number;\n size1 = 0;\n size2 = 0;\n\n static deSerialize(buf: Buffer) {\n const p = new Vp8RtpPayload();\n\n let offset = 0;\n\n p.xBit = getBit(buf[offset], 0);\n p.nBit = getBit(buf[offset], 2);\n p.sBit = getBit(buf[offset], 3);\n p.pid = getBit(buf[offset], 5, 3);\n offset++;\n\n if (p.xBit) {\n p.iBit = getBit(buf[offset], 0);\n p.lBit = getBit(buf[offset], 1);\n p.tBit = getBit(buf[offset], 2);\n p.kBit = getBit(buf[offset], 3);\n offset++;\n }\n\n if (p.iBit) {\n p.mBit = getBit(buf[offset], 0);\n if (p.mBit) {\n const _7 = paddingByte(getBit(buf[offset], 1, 7));\n const _8 = paddingByte(buf[offset + 1]);\n p.pictureId = parseInt(_7 + _8, 2);\n offset += 2;\n } else {\n p.pictureId = getBit(buf[offset], 1, 7);\n offset++;\n }\n }\n\n if (p.lBit) {\n offset++;\n }\n\n if (p.lBit || p.kBit) {\n if (p.tBit) {\n }\n if (p.kBit) {\n }\n offset++;\n }\n\n p.payload = buf.subarray(offset);\n\n if (p.payloadHeaderExist) {\n p.size0 = getBit(buf[offset], 0, 3);\n p.hBit = getBit(buf[offset], 3);\n p.ver = getBit(buf[offset], 4, 3);\n p.pBit = getBit(buf[offset], 7);\n offset++;\n p.size1 = buf[offset];\n offset++;\n p.size2 = buf[offset];\n }\n\n return p;\n }\n\n static isDetectedFinalPacketInSequence(header: RtpHeader) {\n return header.marker;\n }\n\n get isKeyframe() {\n return this.pBit === 0;\n }\n\n get isPartitionHead() {\n return this.sBit === 1;\n }\n\n get payloadHeaderExist() {\n return this.sBit === 1 && this.pid === 0;\n }\n\n get size() {\n if (this.payloadHeaderExist) {\n const size = this.size0 + 8 * this.size1 + 2048 * this.size2;\n return size;\n }\n return 0;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vp9.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/vp9.ts"],"names":[],"mappings":"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","sourcesContent":["// RTP Payload Format for VP9 Video draft-ietf-payload-vp9-16 https://datatracker.ietf.org/doc/html/draft-ietf-payload-vp9\n\nimport { getBit, paddingByte } from \"../../../common/src\";\nimport { RtpHeader } from \"../rtp/rtp\";\nimport { DePacketizerBase } from \"./base\";\n\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |I|P|L|F|B|E|V|Z| (REQUIRED)\n// +-+-+-+-+-+-+-+-+\n// I: |M| PICTURE ID | (REQUIRED)\n// +-+-+-+-+-+-+-+-+\n// M: | EXTENDED PID | (RECOMMENDED)\n// +-+-+-+-+-+-+-+-+\n// L: | TID |U| SID |D| (Conditionally RECOMMENDED)\n// +-+-+-+-+-+-+-+-+ -\\\n// P,F: | P_DIFF |N| (Conditionally REQUIRED) - up to 3 times\n// +-+-+-+-+-+-+-+-+ -/\n// V: | SS |\n// | .. |\n// +-+-+-+-+-+-+-+-+\n\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |I|P|L|F|B|E|V|Z| (REQUIRED)\n// +-+-+-+-+-+-+-+-+\n// I: |M| PICTURE ID | (RECOMMENDED)\n// +-+-+-+-+-+-+-+-+\n// M: | EXTENDED PID | (RECOMMENDED)\n// +-+-+-+-+-+-+-+-+\n// L: | TID |U| SID |D| (Conditionally RECOMMENDED)\n// +-+-+-+-+-+-+-+-+\n// | TL0PICIDX | (Conditionally REQUIRED)\n// +-+-+-+-+-+-+-+-+\n// V: | SS |\n// | .. |\n// +-+-+-+-+-+-+-+-+\n\nexport class Vp9RtpPayload implements DePacketizerBase {\n /**Picture ID (PID) present */\n iBit!: number;\n /**Inter-picture predicted frame */\n pBit!: number;\n /**Layer indices present */\n lBit!: number;\n /**Flexible mode */\n fBit!: number;\n /**Start of a frame */\n bBit!: number;\n /**End of a frame */\n eBit!: number;\n /**Scalability structure */\n vBit!: number;\n zBit!: number;\n m?: number;\n pictureId?: number;\n tid?: number;\n u?: number;\n sid?: number;\n /**inter_layer_predicted */\n d?: number;\n tl0PicIdx?: number;\n pDiff: number[] = [];\n n_s?: number;\n y?: number;\n g?: number;\n width: number[] = [];\n height: number[] = [];\n n_g: number = 0;\n pgT: number[] = [];\n pgU: number[] = [];\n pgP_Diff: number[][] = [];\n payload!: Buffer;\n\n static deSerialize(buf: Buffer) {\n const { p, offset } = this.parseRtpPayload(buf);\n p.payload = buf.subarray(offset);\n return p;\n }\n\n static parseRtpPayload(buf: Buffer) {\n const p = new Vp9RtpPayload();\n let offset = 0;\n\n p.iBit = getBit(buf[offset], 0); // PictureId present .\n p.pBit = getBit(buf[offset], 1); // Inter-picture predicted.\n p.lBit = getBit(buf[offset], 2); // Layer indices present.\n p.fBit = getBit(buf[offset], 3); // Flexible mode.\n p.bBit = getBit(buf[offset], 4); // Begins frame flag.\n p.eBit = getBit(buf[offset], 5); // Ends frame flag.\n p.vBit = getBit(buf[offset], 6); // Scalability structure present.\n p.zBit = getBit(buf[offset], 7); // Not used for inter-layer prediction\n offset++;\n\n if (p.iBit) {\n p.m = getBit(buf[offset], 0);\n\n if (p.m) {\n const _7 = paddingByte(getBit(buf[offset], 1, 7));\n const _8 = paddingByte(buf[offset + 1]);\n p.pictureId = parseInt(_7 + _8, 2);\n offset += 2;\n } else {\n p.pictureId = getBit(buf[offset], 1, 7);\n offset++;\n }\n }\n\n if (p.lBit) {\n p.tid = getBit(buf[offset], 0, 3);\n p.u = getBit(buf[offset], 3);\n p.sid = getBit(buf[offset], 4, 3);\n p.d = getBit(buf[offset], 7);\n offset++;\n if (p.fBit === 0) {\n p.tl0PicIdx = buf[offset];\n offset++;\n }\n }\n\n if (p.fBit && p.pBit) {\n for (;;) {\n p.pDiff = [...p.pDiff, getBit(buf[offset], 0, 7)];\n const n = getBit(buf[offset], 7);\n offset++;\n if (n === 0) break;\n }\n }\n\n // Scalability structure (SS):\n //\n // +-+-+-+-+-+-+-+-+\n // V: | N_S |Y|G|-|-|-|\n // +-+-+-+-+-+-+-+-+ -|\n // Y: | WIDTH | (OPTIONAL) .\n // + + .\n // | | (OPTIONAL) .\n // +-+-+-+-+-+-+-+-+ . N_S + 1 times\n // | HEIGHT | (OPTIONAL) .\n // + + .\n // | | (OPTIONAL) .\n // +-+-+-+-+-+-+-+-+ -|\n // G: | N_G | (OPTIONAL)\n // +-+-+-+-+-+-+-+-+ -|\n // N_G: | T |U| R |-|-| (OPTIONAL) .\n // +-+-+-+-+-+-+-+-+ -| . N_G times\n // | P_DIFF | (OPTIONAL) . R times .\n // +-+-+-+-+-+-+-+-+ -| -|\n //\n if (p.vBit) {\n p.n_s = getBit(buf[offset], 0, 3);\n p.y = getBit(buf[offset], 3);\n p.g = getBit(buf[offset], 4);\n offset++;\n\n if (p.y) {\n [...Array(p.n_s + 1)].forEach(() => {\n p.width.push(buf.readUInt16BE(offset));\n offset += 2;\n p.height.push(buf.readUInt16BE(offset));\n offset += 2;\n });\n }\n\n if (p.g) {\n p.n_g = buf[offset];\n offset++;\n }\n\n if (p.n_g > 0) {\n [...Array(p.n_g).keys()].forEach((i) => {\n p.pgT.push(getBit(buf[offset], 0, 3));\n p.pgU.push(getBit(buf[offset], 3));\n const r = getBit(buf[offset], 4, 2);\n offset++;\n\n p.pgP_Diff[i] = [];\n if (r > 0) {\n [...Array(r)].forEach(() => {\n p.pgP_Diff[i].push(buf[offset]);\n offset++;\n });\n }\n });\n }\n }\n return { offset, p };\n }\n\n static isDetectedFinalPacketInSequence(header: RtpHeader) {\n return header.marker;\n }\n\n get isKeyframe() {\n return !!(!this.pBit && this.bBit && (!this.sid || !this.lBit));\n }\n\n get isPartitionHead() {\n return this.bBit && (!this.lBit || !this.d);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"vp9.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/vp9.ts"],"names":[],"mappings":"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","sourcesContent":["// RTP Payload Format for VP9 Video draft-ietf-payload-vp9-16 https://datatracker.ietf.org/doc/html/draft-ietf-payload-vp9\n\nimport { getBit, paddingByte } from \"../../../common/src\";\nimport { RtpHeader } from \"../rtp/rtp\";\nimport { DePacketizerBase } from \"./base\";\n\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |I|P|L|F|B|E|V|Z| (REQUIRED)\n// +-+-+-+-+-+-+-+-+\n// I: |M| PICTURE ID | (REQUIRED)\n// +-+-+-+-+-+-+-+-+\n// M: | EXTENDED PID | (RECOMMENDED)\n// +-+-+-+-+-+-+-+-+\n// L: | TID |U| SID |D| (Conditionally RECOMMENDED)\n// +-+-+-+-+-+-+-+-+ -\\\n// P,F: | P_DIFF |N| (Conditionally REQUIRED) - up to 3 times\n// +-+-+-+-+-+-+-+-+ -/\n// V: | SS |\n// | .. |\n// +-+-+-+-+-+-+-+-+\n\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |I|P|L|F|B|E|V|Z| (REQUIRED)\n// +-+-+-+-+-+-+-+-+\n// I: |M| PICTURE ID | (RECOMMENDED)\n// +-+-+-+-+-+-+-+-+\n// M: | EXTENDED PID | (RECOMMENDED)\n// +-+-+-+-+-+-+-+-+\n// L: | TID |U| SID |D| (Conditionally RECOMMENDED)\n// +-+-+-+-+-+-+-+-+\n// | TL0PICIDX | (Conditionally REQUIRED)\n// +-+-+-+-+-+-+-+-+\n// V: | SS |\n// | .. |\n// +-+-+-+-+-+-+-+-+\n\nexport class Vp9RtpPayload implements DePacketizerBase {\n /**Picture ID (PID) present */\n iBit!: number;\n /**Inter-picture predicted frame */\n pBit!: number;\n /**Layer indices present */\n lBit!: number;\n /**Flexible mode */\n fBit!: number;\n /**Start of a frame */\n bBit!: number;\n /**End of a frame */\n eBit!: number;\n /**Scalability structure */\n vBit!: number;\n zBit!: number;\n m?: number;\n pictureId?: number;\n tid?: number;\n u?: number;\n sid?: number;\n /**inter_layer_predicted */\n d?: number;\n tl0PicIdx?: number;\n pDiff: number[] = [];\n n_s?: number;\n y?: number;\n g?: number;\n width: number[] = [];\n height: number[] = [];\n n_g = 0;\n pgT: number[] = [];\n pgU: number[] = [];\n pgP_Diff: number[][] = [];\n payload!: Buffer;\n\n static deSerialize(buf: Buffer) {\n const { p, offset } = this.parseRtpPayload(buf);\n p.payload = buf.subarray(offset);\n return p;\n }\n\n static parseRtpPayload(buf: Buffer) {\n const p = new Vp9RtpPayload();\n let offset = 0;\n\n p.iBit = getBit(buf[offset], 0); // PictureId present .\n p.pBit = getBit(buf[offset], 1); // Inter-picture predicted.\n p.lBit = getBit(buf[offset], 2); // Layer indices present.\n p.fBit = getBit(buf[offset], 3); // Flexible mode.\n p.bBit = getBit(buf[offset], 4); // Begins frame flag.\n p.eBit = getBit(buf[offset], 5); // Ends frame flag.\n p.vBit = getBit(buf[offset], 6); // Scalability structure present.\n p.zBit = getBit(buf[offset], 7); // Not used for inter-layer prediction\n offset++;\n\n if (p.iBit) {\n p.m = getBit(buf[offset], 0);\n\n if (p.m) {\n const _7 = paddingByte(getBit(buf[offset], 1, 7));\n const _8 = paddingByte(buf[offset + 1]);\n p.pictureId = parseInt(_7 + _8, 2);\n offset += 2;\n } else {\n p.pictureId = getBit(buf[offset], 1, 7);\n offset++;\n }\n }\n\n if (p.lBit) {\n p.tid = getBit(buf[offset], 0, 3);\n p.u = getBit(buf[offset], 3);\n p.sid = getBit(buf[offset], 4, 3);\n p.d = getBit(buf[offset], 7);\n offset++;\n if (p.fBit === 0) {\n p.tl0PicIdx = buf[offset];\n offset++;\n }\n }\n\n if (p.fBit && p.pBit) {\n for (;;) {\n p.pDiff = [...p.pDiff, getBit(buf[offset], 0, 7)];\n const n = getBit(buf[offset], 7);\n offset++;\n if (n === 0) break;\n }\n }\n\n // Scalability structure (SS):\n //\n // +-+-+-+-+-+-+-+-+\n // V: | N_S |Y|G|-|-|-|\n // +-+-+-+-+-+-+-+-+ -|\n // Y: | WIDTH | (OPTIONAL) .\n // + + .\n // | | (OPTIONAL) .\n // +-+-+-+-+-+-+-+-+ . N_S + 1 times\n // | HEIGHT | (OPTIONAL) .\n // + + .\n // | | (OPTIONAL) .\n // +-+-+-+-+-+-+-+-+ -|\n // G: | N_G | (OPTIONAL)\n // +-+-+-+-+-+-+-+-+ -|\n // N_G: | T |U| R |-|-| (OPTIONAL) .\n // +-+-+-+-+-+-+-+-+ -| . N_G times\n // | P_DIFF | (OPTIONAL) . R times .\n // +-+-+-+-+-+-+-+-+ -| -|\n //\n if (p.vBit) {\n p.n_s = getBit(buf[offset], 0, 3);\n p.y = getBit(buf[offset], 3);\n p.g = getBit(buf[offset], 4);\n offset++;\n\n if (p.y) {\n [...Array(p.n_s + 1)].forEach(() => {\n p.width.push(buf.readUInt16BE(offset));\n offset += 2;\n p.height.push(buf.readUInt16BE(offset));\n offset += 2;\n });\n }\n\n if (p.g) {\n p.n_g = buf[offset];\n offset++;\n }\n\n if (p.n_g > 0) {\n [...Array(p.n_g).keys()].forEach((i) => {\n p.pgT.push(getBit(buf[offset], 0, 3));\n p.pgU.push(getBit(buf[offset], 3));\n const r = getBit(buf[offset], 4, 2);\n offset++;\n\n p.pgP_Diff[i] = [];\n if (r > 0) {\n [...Array(r)].forEach(() => {\n p.pgP_Diff[i].push(buf[offset]);\n offset++;\n });\n }\n });\n }\n }\n return { offset, p };\n }\n\n static isDetectedFinalPacketInSequence(header: RtpHeader) {\n return header.marker;\n }\n\n get isKeyframe() {\n return !!(!this.pBit && this.bBit && (!this.sid || !this.lBit));\n }\n\n get isPartitionHead() {\n return this.bBit && (!this.lBit || !this.d);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../../../../../../rtp/src/extra/container/mp4/container.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sDAA4B;AAE5B,8CAAgC;AAehC,MAAa,YAAY;IAUvB,YACU,KAEP;;QAFD;;;;mBAAQ,KAAK;WAEZ;QAZH,oCAAkB;QAClB,2CAAoD;QACpD,2CAAoD,CAAC,iBAAiB;QACtE;;;;;WAAoB;QACpB;;;;;WAAoB;QACpB,qCAAgB,CAAC,EAAC;QAClB,qCAAgB,CAAC,EAAC;QAClB;;;;mBAAS,IAAI,iBAAK,EAAa;WAAC;QA6GhC;;;;mBAEO,EAAE;WAAC;QAxGR,uBAAA,IAAI,qBAAQ,IAAI,GAAG,CAAC,OAAO,EAAE,MAAA,CAAC;QAC9B,uBAAA,IAAI,yBAAK,CAAC,IAAI,EAAE,CAAC;IACnB,CAAC;IAED,IAAI,WAAW;QACb,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAC9C,KAAK,GAAG,KAAK,CAAC;SACf;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAC9C,KAAK,GAAG,KAAK,CAAC;SACf;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CACH,KAEC;QAED,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE;YAC1B,OAAO,uBAAA,IAAI,mDAAM,MAAV,IAAI,EAAO,KAAK,CAAC,CAAC;SAC1B;aAAM;YACL,OAAO,uBAAA,IAAI,sDAAS,MAAb,IAAI,EAAU,KAAK,CAAC,CAAC;SAC7B;IACH,CAAC;IAgGO,QAAQ,CACd,KAEC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QAC1E,IAAI,CAAC,KAAK,EAAE;YACV,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;SAClC;QAED,0CAA0C;QAC1C,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE;YAC3B,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,EAAE;gBACvB,yHAAsB,CAAC,MAAA,CAAC;aACzB;iBAAM,IAAI,uBAAA,IAAI,kCAAc,IAAI,CAAC,EAAE;gBAClC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;aAC7C;SACF;aAAM;YACL,yHAAsB,CAAC,MAAA,CAAC;SACzB;QAED,qDAAqD;QACrD,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE;YAC3B,IAAI,CAAC,uBAAA,IAAI,gCAAY,EAAE;gBACrB,uBAAA,IAAI,4BAAe,KAAK,MAAA,CAAC;gBACzB,OAAO;aACR;SACF;aAAM;YACL,IAAI,CAAC,uBAAA,IAAI,gCAAY,EAAE;gBACrB,uBAAA,IAAI,4BAAe,KAAK,MAAA,CAAC;gBACzB,OAAO;aACR;SACF;QAED,MAAM,WAAW,GACf,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,uBAAA,IAAI,gCAAY,CAAC,CAAC,CAAC,uBAAA,IAAI,gCAAY,CAAC;QAEhE,IAAI,CAAC,WAAW,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;SACxC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;QAEzD,6DAA6D;QAC7D,6EAA6E;QAC7E,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QACtD,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE3B,kCAAkC;QAClC,uBAAA,IAAI,yBAAK,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE;YACjC,QAAQ;YACR,GAAG,EAAE,WAAW,CAAC,SAAS;YAC1B,GAAG,EAAE,WAAW,CAAC,SAAS;YAC1B,OAAO,EAAE,WAAW,CAAC,IAAI,IAAI,KAAK;SACnC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAEnE,4CAA4C;QAC5C,iFAAiF;QACjF,SAAS;YACP,MAAM,IAAI,GAAG,uBAAA,IAAI,yBAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,uBAAA,IAAI,yBAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAErC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;gBAAE,MAAM;YAC1B,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;YAE3C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SACpB;QAED,yEAAyE;QACzE,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE3C,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE;YAC3B,uBAAA,IAAI,4BAAe,KAAK,MAAA,CAAC;SAC1B;aAAM;YACL,uBAAA,IAAI,4BAAe,KAAK,MAAA,CAAC;SAC1B;QAED,MAAM,GAAG,GAAG;YACV,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,SAAS,EAAE,WAAW,CAAC,SAAS;YAChC,IAAI,EAAE,KAAK,CAAC,KAAK;YACjB,QAAQ;YACR,IAAI;SACL,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;CAUF;AA3OD,oCA2OC;ySAhMG,KAEC;IAED,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,IAAI,KAAK,IAAI,MAAM,EAAE;QACnB,KAAK,GAAG,MAAM,CAAC;KAChB;IAED,MAAM,OAAO,GAAqB;QAChC,IAAI,EAAE,KAAK;QACX,SAAS,EAAE,OAAS;KACrB,CAAC;IAEF,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE;QACxB,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;QACjC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC;KACpC;SAAM;QACL,OAAO,CAAC,aAAa,GAAG,KAAK,CAAC,gBAAgB,CAAC;QAC/C,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QACtC,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC;KACvB;IAED,IAAI,CAAC,KAAK,CAAC,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACrE,MAAM,IAAI,GAAG,KAAK,CAAC,WAA8B,CAAC;IAElD,IAAI,KAAK,KAAK,MAAM,EAAE;QACpB,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;KACvC;SAAM,IAAI,KAAK,KAAK,MAAM,EAAE;QAC3B,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC;KACxC;SAAM,IAAI,KAAK,KAAK,MAAM,EAAE;QAC3B,qGAAqG;QACrG,wFAAwF;QACxF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QAEzC,wFAAwF;QACxF,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;QAE9D,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;KAC5B;SAAM;QACL,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC;KAChD;IAED,MAAM,KAAK,GAAG,uBAAA,IAAI,yBAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,KAAK,IAAI,SAAS,EAAE;QACtB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;KACnD;IACD,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE;QAC3B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;KACzB;SAAM;QACL,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;KACzB;IAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;QACrB,OAAO;KACR;IAED,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,0BAA0B,CACnD,uBAAA,IAAI,yBAAK,CAAC,IAAK,EACf,uBAAA,IAAI,yBAAK,CAAC,IAAK,EACf,CAAC,EACD,CAAC,CACF,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG;QACV,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,CAAC;QACZ,QAAQ,EAAE,CAAC;QACX,IAAI;QACJ,IAAI,EAAE,KAAK,CAAC,KAAK;KACT,CAAC;IACX,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC,yDAOC,KAEC;IAED,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;QACrB,OAAO;KACR;IACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE;QACpC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;KACtB;IACD,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;AACxB,CAAC;AAuGH,SAAS,eAAe,CACtB,KAAmC;IAEnC,uEAAuE;IACvE,OAAQ,KAAuB,CAAC,KAAK,KAAK,SAAS,CAAC;AACtD,CAAC;AAED,SAAS,aAAa,CAAC,KAAoB;IACzC,OAAQ,KAA4B,CAAC,UAAU,KAAK,SAAS,CAAC;AAChE,CAAC;AAuCY,QAAA,kBAAkB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAU,CAAC","sourcesContent":["import Event from \"rx.mini\";\n\nimport * as MP4 from \"./mp4box\";\n\ntype DecoderConfig = AudioDecoderConfig | VideoDecoderConfig;\ntype EncodedChunk = EncodedAudioChunk | EncodedVideoChunk;\n\nexport type DataType = \"init\" | \"delta\" | \"key\";\n\nexport interface Mp4Data {\n type: DataType;\n timestamp: number;\n duration: number;\n data: Uint8Array;\n kind: \"audio\" | \"video\";\n}\n\nexport class Mp4Container {\n #mp4: MP4.ISOFile;\n #audioFrame?: EncodedAudioChunk | EncodedVideoChunk;\n #videoFrame?: EncodedAudioChunk | EncodedVideoChunk; // 1 frame buffer\n audioTrack?: number;\n videoTrack?: number;\n #audioSegment = 0;\n #videoSegment = 0;\n onData = new Event<[Mp4Data]>();\n\n constructor(\n private props: {\n track: { audio: boolean; video: boolean };\n },\n ) {\n this.#mp4 = new MP4.ISOFile();\n this.#mp4.init();\n }\n\n get tracksReady() {\n let ready = true;\n if (this.props.track.audio && !this.audioTrack) {\n ready = false;\n }\n if (this.props.track.video && !this.videoTrack) {\n ready = false;\n }\n return ready;\n }\n\n write(\n frame: (DecoderConfig | EncodedChunk) & {\n track: \"video\" | \"audio\";\n },\n ) {\n if (isDecoderConfig(frame)) {\n return this.#init(frame);\n } else {\n return this.#enqueue(frame);\n }\n }\n\n #init(\n frame: DecoderConfig & {\n track: \"video\" | \"audio\";\n },\n ) {\n let codec = frame.codec.substring(0, 4);\n if (codec == \"opus\") {\n codec = \"Opus\";\n }\n\n const options: MP4.TrackOptions = {\n type: codec,\n timescale: 1_000_000,\n };\n\n if (isVideoConfig(frame)) {\n options.width = frame.codedWidth;\n options.height = frame.codedHeight;\n } else {\n options.channel_count = frame.numberOfChannels;\n options.samplerate = frame.sampleRate;\n options.hdlr = \"soun\";\n }\n\n if (!frame.description) throw new Error(\"missing frame description\");\n const desc = frame.description as ArrayBufferLike;\n\n if (codec === \"avc1\") {\n options.avcDecoderConfigRecord = desc;\n } else if (codec === \"hev1\") {\n options.hevcDecoderConfigRecord = desc;\n } else if (codec === \"Opus\") {\n // description is an identification header: https://datatracker.ietf.org/doc/html/rfc7845#section-5.1\n // The first 8 bytes are the magic string \"OpusHead\", followed by what we actually want.\n const dops = new MP4.BoxParser.dOpsBox();\n\n // Annoyingly, the header is little endian while MP4 is big endian, so we have to parse.\n dops.parse(new MP4.Stream(desc, 8, MP4.Stream.LITTLE_ENDIAN));\n\n options.description = dops;\n } else {\n throw new Error(`unsupported codec: ${codec}`);\n }\n\n const track = this.#mp4.addTrack(options);\n if (track == undefined) {\n throw new Error(\"failed to initialize MP4 track\");\n }\n if (frame.track === \"audio\") {\n this.audioTrack = track;\n } else {\n this.videoTrack = track;\n }\n\n if (!this.tracksReady) {\n return;\n }\n\n const buffer = MP4.ISOFile.writeInitializationSegment(\n this.#mp4.ftyp!,\n this.#mp4.moov!,\n 0,\n 0,\n );\n const data = new Uint8Array(buffer);\n const res = {\n type: \"init\",\n timestamp: 0,\n duration: 0,\n data,\n kind: frame.track,\n } as const;\n this.onData.execute(res);\n }\n\n frameBuffer: (EncodedChunk & {\n track: \"video\" | \"audio\";\n })[] = [];\n\n #enqueue(\n frame: EncodedChunk & {\n track: \"video\" | \"audio\";\n },\n ) {\n this.frameBuffer.push(frame);\n if (!this.tracksReady) {\n return;\n }\n for (const frame of this.frameBuffer) {\n this._enqueue(frame);\n }\n this.frameBuffer = [];\n }\n\n private _enqueue(\n frame: EncodedChunk & {\n track: \"video\" | \"audio\";\n },\n ) {\n const track = frame.track === \"audio\" ? this.audioTrack : this.videoTrack;\n if (!track) {\n throw new Error(\"track missing\");\n }\n\n // Check if we should create a new segment\n if (frame.track === \"video\") {\n if (frame.type == \"key\") {\n this.#videoSegment += 1;\n } else if (this.#videoSegment == 0) {\n throw new Error(\"must start with keyframe\");\n }\n } else {\n this.#audioSegment += 1;\n }\n\n // We need a one frame buffer to compute the duration\n if (frame.track === \"video\") {\n if (!this.#videoFrame) {\n this.#videoFrame = frame;\n return;\n }\n } else {\n if (!this.#audioFrame) {\n this.#audioFrame = frame;\n return;\n }\n }\n\n const bufferFrame =\n frame.track === \"video\" ? this.#videoFrame : this.#audioFrame;\n\n if (!bufferFrame) {\n throw new Error(\"bufferFrame missing\");\n }\n\n const duration = frame.timestamp - bufferFrame.timestamp;\n\n // TODO avoid this extra copy by writing to the mdat directly\n // ...which means changing mp4box.js to take an offset instead of ArrayBuffer\n const buffer = new Uint8Array(bufferFrame.byteLength);\n bufferFrame.copyTo(buffer);\n\n // Add the sample to the container\n this.#mp4.addSample(track, buffer, {\n duration,\n dts: bufferFrame.timestamp,\n cts: bufferFrame.timestamp,\n is_sync: bufferFrame.type == \"key\",\n });\n\n const stream = new MP4.Stream(undefined, 0, MP4.Stream.BIG_ENDIAN);\n\n // Moof and mdat atoms are written in pairs.\n // TODO remove the moof/mdat from the Box to reclaim memory once everything works\n for (;;) {\n const moof = this.#mp4.moofs.shift();\n const mdat = this.#mp4.mdats.shift();\n\n if (!moof && !mdat) break;\n if (!moof) throw new Error(\"moof missing\");\n if (!mdat) throw new Error(\"mdat missing\");\n\n moof.write(stream);\n mdat.write(stream);\n }\n\n // TODO avoid this extra copy by writing to the buffer provided in copyTo\n const data = new Uint8Array(stream.buffer);\n\n if (frame.track === \"video\") {\n this.#videoFrame = frame;\n } else {\n this.#audioFrame = frame;\n }\n\n const res = {\n type: bufferFrame.type,\n timestamp: bufferFrame.timestamp,\n kind: frame.track,\n duration,\n data,\n };\n this.onData.execute(res);\n }\n\n /* TODO flush the last frame\n\t#flush(controller: TransformStreamDefaultController<Chunk>) {\n\t\tif (this.#frame) {\n\t\t\t// TODO guess the duration\n\t\t\tthis.#enqueue(this.#frame, 0, controller)\n\t\t}\n\t}\n\t*/\n}\n\nfunction isDecoderConfig(\n frame: DecoderConfig | EncodedChunk,\n): frame is DecoderConfig {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return (frame as DecoderConfig).codec !== undefined;\n}\n\nfunction isVideoConfig(frame: DecoderConfig): frame is VideoDecoderConfig {\n return (frame as VideoDecoderConfig).codedWidth !== undefined;\n}\n\nexport interface AudioDecoderConfig {\n codec: string;\n description?: ArrayBuffer | undefined;\n numberOfChannels: number;\n sampleRate: number;\n}\n\nexport interface VideoDecoderConfig {\n codec: string;\n codedHeight?: number | undefined;\n codedWidth?: number | undefined;\n description?: ArrayBuffer | undefined;\n displayAspectHeight?: number | undefined;\n displayAspectWidth?: number | undefined;\n optimizeForLatency?: boolean | undefined;\n}\n\ninterface EncodedAudioChunk {\n readonly byteLength: number;\n readonly duration: number | null;\n readonly timestamp: number;\n readonly type: EncodedAudioChunkType;\n copyTo(destination: ArrayBuffer): void;\n}\n\ntype EncodedAudioChunkType = \"delta\" | \"key\";\n\ninterface EncodedVideoChunk {\n readonly byteLength: number;\n readonly duration: number | null;\n readonly timestamp: number;\n readonly type: EncodedVideoChunkType;\n copyTo(destination: ArrayBuffer): void;\n}\n\ntype EncodedVideoChunkType = \"delta\" | \"key\";\n\nexport const mp4SupportedCodecs = [\"avc1\", \"opus\"] as const;\nexport type Mp4SupportedCodec = (typeof mp4SupportedCodecs)[number];\n"]}
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../../../../../../rtp/src/extra/container/mp4/container.ts"],"names":[],"mappings":"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","sourcesContent":["import Event from \"rx.mini\";\n\nimport * as MP4 from \"./mp4box\";\n\ntype DecoderConfig = AudioDecoderConfig | VideoDecoderConfig;\ntype EncodedChunk = EncodedAudioChunk | EncodedVideoChunk;\n\nexport type DataType = \"init\" | \"delta\" | \"key\";\n\nexport interface Mp4Data {\n type: DataType;\n timestamp: number;\n duration: number;\n data: Uint8Array;\n kind: \"audio\" | \"video\";\n}\n\nexport class Mp4Container {\n #mp4: MP4.ISOFile;\n #audioFrame?: EncodedAudioChunk | EncodedVideoChunk;\n #videoFrame?: EncodedAudioChunk | EncodedVideoChunk; // 1 frame buffer\n audioTrack?: number;\n videoTrack?: number;\n #audioSegment = 0;\n #videoSegment = 0;\n onData = new Event<[Mp4Data]>();\n\n constructor(\n private props: {\n track: { audio: boolean; video: boolean };\n },\n ) {\n this.#mp4 = new MP4.ISOFile();\n this.#mp4.init();\n }\n\n get tracksReady() {\n let ready = true;\n if (this.props.track.audio && !this.audioTrack) {\n ready = false;\n }\n if (this.props.track.video && !this.videoTrack) {\n ready = false;\n }\n return ready;\n }\n\n write(\n frame: (DecoderConfig | EncodedChunk) & {\n track: \"video\" | \"audio\";\n },\n ) {\n if (isDecoderConfig(frame)) {\n return this.#init(frame);\n } else {\n return this.#enqueue(frame);\n }\n }\n\n #init(\n frame: DecoderConfig & {\n track: \"video\" | \"audio\";\n },\n ) {\n let codec = frame.codec.substring(0, 4);\n if (codec == \"opus\") {\n codec = \"Opus\";\n }\n\n const options: MP4.TrackOptions = {\n type: codec,\n timescale: 1_000_000,\n };\n\n if (isVideoConfig(frame)) {\n options.width = frame.codedWidth;\n options.height = frame.codedHeight;\n } else {\n options.channel_count = frame.numberOfChannels;\n options.samplerate = frame.sampleRate;\n options.hdlr = \"soun\";\n }\n\n if (!frame.description) throw new Error(\"missing frame description\");\n const desc = frame.description as ArrayBufferLike;\n\n if (codec === \"avc1\") {\n options.avcDecoderConfigRecord = desc;\n } else if (codec === \"hev1\") {\n options.hevcDecoderConfigRecord = desc;\n } else if (codec === \"Opus\") {\n // description is an identification header: https://datatracker.ietf.org/doc/html/rfc7845#section-5.1\n // The first 8 bytes are the magic string \"OpusHead\", followed by what we actually want.\n const dops = new MP4.BoxParser.dOpsBox();\n\n // Annoyingly, the header is little endian while MP4 is big endian, so we have to parse.\n dops.parse(new MP4.Stream(desc, 8, MP4.Stream.LITTLE_ENDIAN));\n\n options.description = dops;\n } else {\n throw new Error(`unsupported codec: ${codec}`);\n }\n\n const track = this.#mp4.addTrack(options);\n if (track == undefined) {\n throw new Error(\"failed to initialize MP4 track\");\n }\n if (frame.track === \"audio\") {\n this.audioTrack = track;\n } else {\n this.videoTrack = track;\n }\n\n if (!this.tracksReady) {\n return;\n }\n\n const buffer = MP4.ISOFile.writeInitializationSegment(\n this.#mp4.ftyp!,\n this.#mp4.moov!,\n 0,\n 0,\n );\n const data = new Uint8Array(buffer);\n const res = {\n type: \"init\",\n timestamp: 0,\n duration: 0,\n data,\n kind: frame.track,\n } as const;\n this.onData.execute(res);\n }\n\n frameBuffer: (EncodedChunk & {\n track: \"video\" | \"audio\";\n })[] = [];\n\n #enqueue(\n frame: EncodedChunk & {\n track: \"video\" | \"audio\";\n },\n ) {\n this.frameBuffer.push(frame);\n if (!this.tracksReady) {\n return;\n }\n for (const frame of this.frameBuffer) {\n this._enqueue(frame);\n }\n this.frameBuffer = [];\n }\n\n private _enqueue(\n frame: EncodedChunk & {\n track: \"video\" | \"audio\";\n },\n ) {\n const track = frame.track === \"audio\" ? this.audioTrack : this.videoTrack;\n if (!track) {\n throw new Error(\"track missing\");\n }\n\n // Check if we should create a new segment\n if (frame.track === \"video\") {\n if (frame.type == \"key\") {\n this.#videoSegment += 1;\n } else if (this.#videoSegment == 0) {\n throw new Error(\"must start with keyframe\");\n }\n } else {\n this.#audioSegment += 1;\n }\n\n // We need a one frame buffer to compute the duration\n if (frame.track === \"video\") {\n if (!this.#videoFrame) {\n this.#videoFrame = frame;\n return;\n }\n } else {\n if (!this.#audioFrame) {\n this.#audioFrame = frame;\n return;\n }\n }\n\n const bufferFrame =\n frame.track === \"video\" ? this.#videoFrame : this.#audioFrame;\n\n if (!bufferFrame) {\n throw new Error(\"bufferFrame missing\");\n }\n\n const duration = frame.timestamp - bufferFrame.timestamp;\n\n // TODO avoid this extra copy by writing to the mdat directly\n // ...which means changing mp4box.js to take an offset instead of ArrayBuffer\n const buffer = new Uint8Array(bufferFrame.byteLength);\n bufferFrame.copyTo(buffer);\n\n // Add the sample to the container\n this.#mp4.addSample(track, buffer, {\n duration,\n dts: bufferFrame.timestamp,\n cts: bufferFrame.timestamp,\n is_sync: bufferFrame.type == \"key\",\n });\n\n const stream = new MP4.Stream(undefined, 0, MP4.Stream.BIG_ENDIAN);\n\n // Moof and mdat atoms are written in pairs.\n // TODO remove the moof/mdat from the Box to reclaim memory once everything works\n for (;;) {\n const moof = this.#mp4.moofs.shift();\n const mdat = this.#mp4.mdats.shift();\n\n if (!moof && !mdat) break;\n if (!moof) throw new Error(\"moof missing\");\n if (!mdat) throw new Error(\"mdat missing\");\n\n moof.write(stream);\n mdat.write(stream);\n }\n\n // TODO avoid this extra copy by writing to the buffer provided in copyTo\n const data = new Uint8Array(stream.buffer);\n\n if (frame.track === \"video\") {\n this.#videoFrame = frame;\n } else {\n this.#audioFrame = frame;\n }\n\n const res = {\n type: bufferFrame.type,\n timestamp: bufferFrame.timestamp,\n kind: frame.track,\n duration,\n data,\n };\n this.onData.execute(res);\n }\n\n /* TODO flush the last frame\n\t#flush(controller: TransformStreamDefaultController<Chunk>) {\n\t\tif (this.#frame) {\n\t\t\t// TODO guess the duration\n\t\t\tthis.#enqueue(this.#frame, 0, controller)\n\t\t}\n\t}\n\t*/\n}\n\nfunction isDecoderConfig(\n frame: DecoderConfig | EncodedChunk,\n): frame is DecoderConfig {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return (frame as DecoderConfig).codec !== undefined;\n}\n\nfunction isVideoConfig(frame: DecoderConfig): frame is VideoDecoderConfig {\n return (frame as VideoDecoderConfig).codedWidth !== undefined;\n}\n\nexport interface AudioDecoderConfig {\n codec: string;\n description?: ArrayBuffer | undefined;\n numberOfChannels: number;\n sampleRate: number;\n}\n\nexport interface VideoDecoderConfig {\n codec: string;\n codedHeight?: number | undefined;\n codedWidth?: number | undefined;\n description?: ArrayBuffer | undefined;\n displayAspectHeight?: number | undefined;\n displayAspectWidth?: number | undefined;\n optimizeForLatency?: boolean | undefined;\n}\n\ninterface EncodedAudioChunk {\n readonly byteLength: number;\n readonly duration: number | null;\n readonly timestamp: number;\n readonly type: EncodedAudioChunkType;\n copyTo(destination: ArrayBuffer): void;\n}\n\ntype EncodedAudioChunkType = \"delta\" | \"key\";\n\ninterface EncodedVideoChunk {\n readonly byteLength: number;\n readonly duration: number | null;\n readonly timestamp: number;\n readonly type: EncodedVideoChunkType;\n copyTo(destination: ArrayBuffer): void;\n}\n\ntype EncodedVideoChunkType = \"delta\" | \"key\";\n\nexport const mp4SupportedCodecs = [\"avc1\", \"opus\"] as const;\nexport type Mp4SupportedCodec = (typeof mp4SupportedCodecs)[number];\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exp-golomb.js","sourceRoot":"","sources":["../../../../../../../rtp/src/extra/container/mp4/exp-golomb.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG;;AAEH,oCAAoC;AACpC,MAAM,SAAS;IASb,YAAoB,UAAsB;QAA9B;;;;mBAAQ,UAAU;WAAY;QAR1C;;;;mBAAM,WAAW;WAAC;QAClB;;;;;WAAoB;QACpB;;;;mBAAgB,CAAC;WAAC;QAClB;;;;;WAAqB;QACrB;;;;;WAAoB;QACpB;;;;mBAAgB,CAAC;WAAC;QAClB;;;;mBAA0B,CAAC;WAAC;QAG1B,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC;QAC1B,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,UAAU,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,UAAU,GAAG,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO;QACL,IAAI,CAAC,OAAO,GAAG,IAAW,CAAC;IAC7B,CAAC;IAED,gBAAgB;QACd,MAAM,iBAAiB,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC;QACjE,IAAI,iBAAiB,IAAI,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAE1E,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,CACN,IAAI,CAAC,OAAO,CAAC,QAAQ,CACnB,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,aAAa,GAAG,UAAU,CAChC,CACF,CAAC;QACF,IAAI,CAAC,aAAa,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAEnE,IAAI,CAAC,aAAa,IAAI,UAAU,CAAC;QACjC,IAAI,CAAC,uBAAuB,GAAG,UAAU,GAAG,CAAC,CAAC;IAChD,CAAC;IAED,QAAQ,CAAC,IAAI;QACX,IAAI,IAAI,GAAG,EAAE;YACX,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QAErE,IAAI,IAAI,IAAI,IAAI,CAAC,uBAAuB,EAAE;
|
|
1
|
+
{"version":3,"file":"exp-golomb.js","sourceRoot":"","sources":["../../../../../../../rtp/src/extra/container/mp4/exp-golomb.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian <xqq@xqq.im>\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Exponential-Golomb buffer decoder\nclass ExpGolomb {\n TAG = \"ExpGolomb\";\n _buffer: Uint8Array;\n _buffer_index = 0;\n _total_bytes: number;\n _total_bits: number;\n _current_word = 0;\n _current_word_bits_left = 0;\n\n constructor(private uint8array: Uint8Array) {\n this._buffer = uint8array;\n this._total_bytes = uint8array.byteLength;\n this._total_bits = uint8array.byteLength * 8;\n }\n\n destroy() {\n this._buffer = null as any;\n }\n\n _fillCurrentWord() {\n const buffer_bytes_left = this._total_bytes - this._buffer_index;\n if (buffer_bytes_left <= 0)\n throw new Error(\"ExpGolomb: _fillCurrentWord() but no bytes available\");\n\n const bytes_read = Math.min(4, buffer_bytes_left);\n const word = new Uint8Array(4);\n word.set(\n this._buffer.subarray(\n this._buffer_index,\n this._buffer_index + bytes_read,\n ),\n );\n this._current_word = new DataView(word.buffer).getUint32(0, false);\n\n this._buffer_index += bytes_read;\n this._current_word_bits_left = bytes_read * 8;\n }\n\n readBits(bits) {\n if (bits > 32)\n throw new Error(\"ExpGolomb: readBits() bits exceeded max 32bits!\");\n\n if (bits <= this._current_word_bits_left) {\n const result = this._current_word >>> (32 - bits);\n this._current_word <<= bits;\n this._current_word_bits_left -= bits;\n return result;\n }\n\n let result = this._current_word_bits_left ? this._current_word : 0;\n result = result >>> (32 - this._current_word_bits_left);\n const bits_need_left = bits - this._current_word_bits_left;\n\n this._fillCurrentWord();\n const bits_read_next = Math.min(\n bits_need_left,\n this._current_word_bits_left,\n );\n\n const result2 = this._current_word >>> (32 - bits_read_next);\n this._current_word <<= bits_read_next;\n this._current_word_bits_left -= bits_read_next;\n\n result = (result << bits_read_next) | result2;\n return result;\n }\n\n readBool() {\n return this.readBits(1) === 1;\n }\n\n readByte() {\n return this.readBits(8);\n }\n\n _skipLeadingZero() {\n let zero_count;\n for (\n zero_count = 0;\n zero_count < this._current_word_bits_left;\n zero_count++\n ) {\n if (0 !== (this._current_word & (0x80000000 >>> zero_count))) {\n this._current_word <<= zero_count;\n this._current_word_bits_left -= zero_count;\n return zero_count;\n }\n }\n this._fillCurrentWord();\n return zero_count + this._skipLeadingZero();\n }\n\n readUEG() {\n // unsigned exponential golomb\n const leading_zeros = this._skipLeadingZero();\n return this.readBits(leading_zeros + 1) - 1;\n }\n\n readSEG() {\n // signed exponential golomb\n const value = this.readUEG();\n if (value & 0x01) {\n return (value + 1) >>> 1;\n } else {\n return -1 * (value >>> 1);\n }\n }\n}\n\nexport default ExpGolomb;\n"]}
|
|
@@ -22,7 +22,7 @@ var H264NaluType;
|
|
|
22
22
|
H264NaluType[H264NaluType["kFiller"] = 12] = "kFiller";
|
|
23
23
|
H264NaluType[H264NaluType["kSPSExt"] = 13] = "kSPSExt";
|
|
24
24
|
H264NaluType[H264NaluType["kReserved0"] = 14] = "kReserved0";
|
|
25
|
-
})(H264NaluType
|
|
25
|
+
})(H264NaluType || (exports.H264NaluType = H264NaluType = {}));
|
|
26
26
|
class H264NaluPayload {
|
|
27
27
|
constructor() {
|
|
28
28
|
Object.defineProperty(this, "type", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"h264.js","sourceRoot":"","sources":["../../../../../../../rtp/src/extra/container/mp4/h264.ts"],"names":[],"mappings":"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","sourcesContent":["import SPSParser from \"./sps-parser\";\n\nexport enum H264NaluType {\n kUnspecified = 0,\n kSliceNonIDR,\n kSliceDPA,\n kSliceDPB,\n kSliceDPC,\n kSliceIDR,\n kSliceSEI,\n kSliceSPS,\n kSlicePPS,\n kSliceAUD,\n kEndOfSequence,\n kEndOfStream,\n kFiller,\n kSPSExt,\n kReserved0,\n}\n\nexport class H264NaluPayload {\n type!: H264NaluType;\n data!: Uint8Array;\n}\n\nexport class H264NaluAVC1 {\n type: H264NaluType;\n data: Uint8Array;\n\n constructor(nalu: H264NaluPayload) {\n const nalu_size = nalu.data.byteLength;\n\n this.type = nalu.type;\n this.data = new Uint8Array(4 + nalu_size); // 4 byte length-header + nalu payload\n\n const v = new DataView(this.data.buffer);\n // Fill 4 byte length-header\n v.setUint32(0, nalu_size);\n // Copy payload\n this.data.set(nalu.data, 4);\n }\n}\n\nexport class H264AnnexBParser {\n private readonly TAG: string = \"H264AnnexBParser\";\n\n private data_: Uint8Array;\n private current_startcode_offset_: number = 0;\n private eof_flag_: boolean = false;\n\n public constructor(data: Uint8Array) {\n this.data_ = data;\n this.current_startcode_offset_ = this.findNextStartCodeOffset(0);\n }\n\n private findNextStartCodeOffset(start_offset: number) {\n let i = start_offset;\n const data = this.data_;\n\n for (;;) {\n if (i + 3 >= data.byteLength) {\n this.eof_flag_ = true;\n return data.byteLength;\n }\n\n // search 00 00 00 01 or 00 00 01\n const uint32 =\n (data[i + 0] << 24) |\n (data[i + 1] << 16) |\n (data[i + 2] << 8) |\n data[i + 3];\n const uint24 = (data[i + 0] << 16) | (data[i + 1] << 8) | data[i + 2];\n if (uint32 === 0x00000001 || uint24 === 0x000001) {\n return i;\n } else {\n i++;\n }\n }\n }\n\n public readNextNaluPayload(): H264NaluPayload | null {\n const data = this.data_;\n let nalu_payload: H264NaluPayload | null = null;\n\n while (nalu_payload == null) {\n if (this.eof_flag_) {\n break;\n }\n // offset pointed to start code\n const startcode_offset = this.current_startcode_offset_;\n\n // nalu payload start offset\n let offset = startcode_offset;\n const u32 =\n (data[offset] << 24) |\n (data[offset + 1] << 16) |\n (data[offset + 2] << 8) |\n data[offset + 3];\n if (u32 === 0x00000001) {\n offset += 4;\n } else {\n offset += 3;\n }\n\n const nalu_type: H264NaluType = data[offset] & 0x1f;\n const forbidden_bit = (data[offset] & 0x80) >>> 7;\n\n const next_startcode_offset = this.findNextStartCodeOffset(offset);\n this.current_startcode_offset_ = next_startcode_offset;\n\n if (nalu_type >= H264NaluType.kReserved0) {\n continue;\n }\n if (forbidden_bit !== 0) {\n // Log.e(this.TAG, `forbidden_bit near offset ${offset} should be 0 but has value ${forbidden_bit}`);\n continue;\n }\n\n const payload_data = data.subarray(offset, next_startcode_offset);\n\n nalu_payload = new H264NaluPayload();\n nalu_payload.type = nalu_type;\n nalu_payload.data = payload_data;\n }\n\n return nalu_payload;\n }\n}\n\nexport class AVCDecoderConfigurationRecord {\n private data: Uint8Array;\n\n // sps, pps: require Nalu without 4 byte length-header\n public constructor(sps: Uint8Array, pps: Uint8Array, sps_details: any) {\n let length = 6 + 2 + sps.byteLength + 1 + 2 + pps.byteLength;\n let need_extra_fields = false;\n\n if (sps[3] !== 66 && sps[3] !== 77 && sps[3] !== 88) {\n need_extra_fields = true;\n length += 4;\n }\n\n const data = (this.data = new Uint8Array(length));\n\n data[0] = 0x01; // configurationVersion\n data[1] = sps[1]; // AVCProfileIndication\n data[2] = sps[2]; // profile_compatibility\n data[3] = sps[3]; // AVCLevelIndication\n data[4] = 0xff; // 111111 + lengthSizeMinusOne(3)\n\n data[5] = 0xe0 | 0x01; // 111 + numOfSequenceParameterSets\n\n const sps_length = sps.byteLength;\n data[6] = sps_length >>> 8; // sequenceParameterSetLength\n data[7] = sps_length & 0xff;\n\n let offset = 8;\n data.set(sps, 8);\n offset += sps_length;\n\n data[offset] = 1; // numOfPictureParameterSets\n\n const pps_length = pps.byteLength;\n data[offset + 1] = pps_length >>> 8; // pictureParameterSetLength\n data[offset + 2] = pps_length & 0xff;\n\n data.set(pps, offset + 3);\n offset += 3 + pps_length;\n\n if (need_extra_fields) {\n data[offset] = 0xfc | sps_details.chroma_format_idc;\n data[offset + 1] = 0xf8 | (sps_details.bit_depth_luma - 8);\n data[offset + 2] = 0xf8 | (sps_details.bit_depth_chroma - 8);\n data[offset + 3] = 0x00; // number of sps ext\n offset += 4;\n }\n }\n\n public getData() {\n return this.data;\n }\n}\n\nexport function annexb2avcc(data: Buffer) {\n const annexb_parser = new H264AnnexBParser(data);\n let nalu_payload: H264NaluPayload | null = null;\n const video_init_segment_dispatched_ = false;\n const video_metadata_changed_ = false;\n\n const video_metadata_: {\n sps: H264NaluAVC1 | undefined;\n pps: H264NaluAVC1 | undefined;\n details: any;\n } = {\n sps: undefined,\n pps: undefined,\n details: undefined,\n };\n\n while ((nalu_payload = annexb_parser.readNextNaluPayload()) != null) {\n const nalu_avc1 = new H264NaluAVC1(nalu_payload);\n\n if (nalu_avc1.type === H264NaluType.kSliceSPS) {\n // Notice: parseSPS requires Nalu without startcode or length-header\n const details = SPSParser.parseSPS(nalu_payload.data);\n if (!video_init_segment_dispatched_) {\n video_metadata_.sps = nalu_avc1;\n video_metadata_.details = details;\n }\n } else if (nalu_avc1.type === H264NaluType.kSlicePPS) {\n if (!video_init_segment_dispatched_ || video_metadata_changed_) {\n video_metadata_.pps = nalu_avc1;\n }\n }\n }\n\n const sps_without_header = video_metadata_.sps!.data.subarray(4);\n const pps_without_header = video_metadata_.pps!.data.subarray(4);\n const details = video_metadata_.details;\n const avcc = new AVCDecoderConfigurationRecord(\n sps_without_header,\n pps_without_header,\n details,\n );\n return avcc.getData();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"h264.js","sourceRoot":"","sources":["../../../../../../../rtp/src/extra/container/mp4/h264.ts"],"names":[],"mappings":"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","sourcesContent":["import SPSParser from \"./sps-parser\";\n\nexport enum H264NaluType {\n kUnspecified = 0,\n kSliceNonIDR = 1,\n kSliceDPA = 2,\n kSliceDPB = 3,\n kSliceDPC = 4,\n kSliceIDR = 5,\n kSliceSEI = 6,\n kSliceSPS = 7,\n kSlicePPS = 8,\n kSliceAUD = 9,\n kEndOfSequence = 10,\n kEndOfStream = 11,\n kFiller = 12,\n kSPSExt = 13,\n kReserved0 = 14,\n}\n\nexport class H264NaluPayload {\n type!: H264NaluType;\n data!: Uint8Array;\n}\n\nexport class H264NaluAVC1 {\n type: H264NaluType;\n data: Uint8Array;\n\n constructor(nalu: H264NaluPayload) {\n const nalu_size = nalu.data.byteLength;\n\n this.type = nalu.type;\n this.data = new Uint8Array(4 + nalu_size); // 4 byte length-header + nalu payload\n\n const v = new DataView(this.data.buffer);\n // Fill 4 byte length-header\n v.setUint32(0, nalu_size);\n // Copy payload\n this.data.set(nalu.data, 4);\n }\n}\n\nexport class H264AnnexBParser {\n private readonly TAG: string = \"H264AnnexBParser\";\n\n private data_: Uint8Array;\n private current_startcode_offset_: number = 0;\n private eof_flag_: boolean = false;\n\n public constructor(data: Uint8Array) {\n this.data_ = data;\n this.current_startcode_offset_ = this.findNextStartCodeOffset(0);\n }\n\n private findNextStartCodeOffset(start_offset: number) {\n let i = start_offset;\n const data = this.data_;\n\n for (;;) {\n if (i + 3 >= data.byteLength) {\n this.eof_flag_ = true;\n return data.byteLength;\n }\n\n // search 00 00 00 01 or 00 00 01\n const uint32 =\n (data[i + 0] << 24) |\n (data[i + 1] << 16) |\n (data[i + 2] << 8) |\n data[i + 3];\n const uint24 = (data[i + 0] << 16) | (data[i + 1] << 8) | data[i + 2];\n if (uint32 === 0x00000001 || uint24 === 0x000001) {\n return i;\n } else {\n i++;\n }\n }\n }\n\n public readNextNaluPayload(): H264NaluPayload | null {\n const data = this.data_;\n let nalu_payload: H264NaluPayload | null = null;\n\n while (nalu_payload == null) {\n if (this.eof_flag_) {\n break;\n }\n // offset pointed to start code\n const startcode_offset = this.current_startcode_offset_;\n\n // nalu payload start offset\n let offset = startcode_offset;\n const u32 =\n (data[offset] << 24) |\n (data[offset + 1] << 16) |\n (data[offset + 2] << 8) |\n data[offset + 3];\n if (u32 === 0x00000001) {\n offset += 4;\n } else {\n offset += 3;\n }\n\n const nalu_type: H264NaluType = data[offset] & 0x1f;\n const forbidden_bit = (data[offset] & 0x80) >>> 7;\n\n const next_startcode_offset = this.findNextStartCodeOffset(offset);\n this.current_startcode_offset_ = next_startcode_offset;\n\n if (nalu_type >= H264NaluType.kReserved0) {\n continue;\n }\n if (forbidden_bit !== 0) {\n // Log.e(this.TAG, `forbidden_bit near offset ${offset} should be 0 but has value ${forbidden_bit}`);\n continue;\n }\n\n const payload_data = data.subarray(offset, next_startcode_offset);\n\n nalu_payload = new H264NaluPayload();\n nalu_payload.type = nalu_type;\n nalu_payload.data = payload_data;\n }\n\n return nalu_payload;\n }\n}\n\nexport class AVCDecoderConfigurationRecord {\n private data: Uint8Array;\n\n // sps, pps: require Nalu without 4 byte length-header\n public constructor(sps: Uint8Array, pps: Uint8Array, sps_details: any) {\n let length = 6 + 2 + sps.byteLength + 1 + 2 + pps.byteLength;\n let need_extra_fields = false;\n\n if (sps[3] !== 66 && sps[3] !== 77 && sps[3] !== 88) {\n need_extra_fields = true;\n length += 4;\n }\n\n const data = (this.data = new Uint8Array(length));\n\n data[0] = 0x01; // configurationVersion\n data[1] = sps[1]; // AVCProfileIndication\n data[2] = sps[2]; // profile_compatibility\n data[3] = sps[3]; // AVCLevelIndication\n data[4] = 0xff; // 111111 + lengthSizeMinusOne(3)\n\n data[5] = 0xe0 | 0x01; // 111 + numOfSequenceParameterSets\n\n const sps_length = sps.byteLength;\n data[6] = sps_length >>> 8; // sequenceParameterSetLength\n data[7] = sps_length & 0xff;\n\n let offset = 8;\n data.set(sps, 8);\n offset += sps_length;\n\n data[offset] = 1; // numOfPictureParameterSets\n\n const pps_length = pps.byteLength;\n data[offset + 1] = pps_length >>> 8; // pictureParameterSetLength\n data[offset + 2] = pps_length & 0xff;\n\n data.set(pps, offset + 3);\n offset += 3 + pps_length;\n\n if (need_extra_fields) {\n data[offset] = 0xfc | sps_details.chroma_format_idc;\n data[offset + 1] = 0xf8 | (sps_details.bit_depth_luma - 8);\n data[offset + 2] = 0xf8 | (sps_details.bit_depth_chroma - 8);\n data[offset + 3] = 0x00; // number of sps ext\n offset += 4;\n }\n }\n\n public getData() {\n return this.data;\n }\n}\n\nexport function annexb2avcc(data: Buffer) {\n const annexb_parser = new H264AnnexBParser(data);\n let nalu_payload: H264NaluPayload | null = null;\n const video_init_segment_dispatched_ = false;\n const video_metadata_changed_ = false;\n\n const video_metadata_: {\n sps: H264NaluAVC1 | undefined;\n pps: H264NaluAVC1 | undefined;\n details: any;\n } = {\n sps: undefined,\n pps: undefined,\n details: undefined,\n };\n\n while ((nalu_payload = annexb_parser.readNextNaluPayload()) != null) {\n const nalu_avc1 = new H264NaluAVC1(nalu_payload);\n\n if (nalu_avc1.type === H264NaluType.kSliceSPS) {\n // Notice: parseSPS requires Nalu without startcode or length-header\n const details = SPSParser.parseSPS(nalu_payload.data);\n if (!video_init_segment_dispatched_) {\n video_metadata_.sps = nalu_avc1;\n video_metadata_.details = details;\n }\n } else if (nalu_avc1.type === H264NaluType.kSlicePPS) {\n if (!video_init_segment_dispatched_ || video_metadata_changed_) {\n video_metadata_.pps = nalu_avc1;\n }\n }\n }\n\n const sps_without_header = video_metadata_.sps!.data.subarray(4);\n const pps_without_header = video_metadata_.pps!.data.subarray(4);\n const details = video_metadata_.details;\n const avcc = new AVCDecoderConfigurationRecord(\n sps_without_header,\n pps_without_header,\n details,\n );\n return avcc.getData();\n}\n"]}
|
|
@@ -211,14 +211,14 @@ class SPSParser {
|
|
|
211
211
|
codec_mimetype,
|
|
212
212
|
profile_idc,
|
|
213
213
|
level_idc,
|
|
214
|
-
profile_string,
|
|
215
|
-
level_string,
|
|
214
|
+
profile_string, // baseline, high, high10, ...
|
|
215
|
+
level_string, // 3, 3.1, 4, 4.1, 5, 5.1, ...
|
|
216
216
|
chroma_format_idc,
|
|
217
|
-
bit_depth: bit_depth_luma,
|
|
217
|
+
bit_depth: bit_depth_luma, // 8bit, 10bit, ...
|
|
218
218
|
bit_depth_luma,
|
|
219
219
|
bit_depth_chroma,
|
|
220
220
|
ref_frames,
|
|
221
|
-
chroma_format,
|
|
221
|
+
chroma_format, // 4:2:0, 4:2:2, ...
|
|
222
222
|
chroma_format_string: SPSParser.getChromaFormatString(chroma_format),
|
|
223
223
|
frame_rate: {
|
|
224
224
|
fixed: fps_fixed,
|