werift 0.12.8 → 0.13.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.d.ts +9 -0
- package/lib/common/src/binary.js +37 -1
- package/lib/common/src/binary.js.map +1 -1
- package/lib/dtls/src/context/srtp.d.ts +6 -2
- package/lib/dtls/src/context/srtp.js +9 -3
- package/lib/dtls/src/context/srtp.js.map +1 -1
- package/lib/dtls/src/flight/client/flight5.js.map +1 -1
- package/lib/dtls/src/flight/server/flight2.js.map +1 -1
- package/lib/dtls/src/socket.d.ts +3 -3
- package/lib/dtls/src/socket.js +6 -8
- package/lib/dtls/src/socket.js.map +1 -1
- package/lib/ice/src/utils.d.ts +1 -0
- package/lib/ice/src/utils.js +5 -1
- package/lib/ice/src/utils.js.map +1 -1
- package/lib/rtp/src/codec/base.d.ts +8 -0
- package/lib/rtp/src/codec/base.js +16 -0
- package/lib/rtp/src/codec/base.js.map +1 -0
- package/lib/rtp/src/codec/h264.d.ts +23 -2
- package/lib/rtp/src/codec/h264.js +66 -3
- package/lib/rtp/src/codec/h264.js.map +1 -1
- package/lib/rtp/src/codec/opus.d.ts +9 -0
- package/lib/rtp/src/codec/opus.js +18 -0
- package/lib/rtp/src/codec/opus.js.map +1 -0
- package/lib/rtp/src/codec/vp8.d.ts +18 -11
- package/lib/rtp/src/codec/vp8.js +51 -29
- package/lib/rtp/src/codec/vp8.js.map +1 -1
- package/lib/rtp/src/codec/vp9.d.ts +38 -10
- package/lib/rtp/src/codec/vp9.js +115 -26
- package/lib/rtp/src/codec/vp9.js.map +1 -1
- package/lib/rtp/src/index.d.ts +2 -0
- package/lib/rtp/src/index.js +2 -0
- package/lib/rtp/src/index.js.map +1 -1
- package/lib/rtp/src/rtcp/psfb/index.d.ts +2 -2
- package/lib/rtp/src/rtcp/psfb/index.js.map +1 -1
- package/lib/rtp/src/rtcp/rr.d.ts +2 -2
- package/lib/rtp/src/rtcp/rr.js.map +1 -1
- package/lib/rtp/src/rtcp/rtpfb/index.d.ts +2 -2
- package/lib/rtp/src/rtcp/rtpfb/index.js.map +1 -1
- package/lib/rtp/src/rtcp/sdes.d.ts +2 -2
- package/lib/rtp/src/rtcp/sdes.js.map +1 -1
- package/lib/rtp/src/rtcp/sr.d.ts +2 -2
- package/lib/rtp/src/rtcp/sr.js +36 -0
- package/lib/rtp/src/rtcp/sr.js.map +1 -1
- package/lib/rtp/src/rtp/rtp.d.ts +2 -0
- package/lib/rtp/src/rtp/rtp.js +2 -0
- package/lib/rtp/src/rtp/rtp.js.map +1 -1
- package/lib/rtp/src/srtp/cipher/ctr.d.ts +17 -0
- package/lib/rtp/src/srtp/cipher/ctr.js +103 -0
- package/lib/rtp/src/srtp/cipher/ctr.js.map +1 -0
- package/lib/rtp/src/srtp/cipher/gcm.d.ts +15 -0
- package/lib/rtp/src/srtp/cipher/gcm.js +106 -0
- package/lib/rtp/src/srtp/cipher/gcm.js.map +1 -0
- package/lib/rtp/src/srtp/cipher/index.d.ts +14 -0
- package/lib/rtp/src/srtp/cipher/index.js +25 -0
- package/lib/rtp/src/srtp/cipher/index.js.map +1 -0
- package/lib/rtp/src/srtp/const.d.ts +5 -0
- package/lib/rtp/src/srtp/const.js +23 -0
- package/lib/rtp/src/srtp/const.js.map +1 -0
- package/lib/rtp/src/srtp/context/context.d.ts +13 -11
- package/lib/rtp/src/srtp/context/context.js +23 -23
- package/lib/rtp/src/srtp/context/context.js.map +1 -1
- package/lib/rtp/src/srtp/context/srtcp.d.ts +3 -2
- package/lib/rtp/src/srtp/context/srtcp.js +10 -34
- package/lib/rtp/src/srtp/context/srtcp.js.map +1 -1
- package/lib/rtp/src/srtp/context/srtp.d.ts +4 -3
- package/lib/rtp/src/srtp/context/srtp.js +9 -28
- package/lib/rtp/src/srtp/context/srtp.js.map +1 -1
- package/lib/rtp/src/srtp/srtp.js +2 -2
- package/lib/rtp/src/srtp/srtp.js.map +1 -1
- package/lib/webrtc/src/const.d.ts +4 -3
- package/lib/webrtc/src/const.js +5 -4
- package/lib/webrtc/src/const.js.map +1 -1
- package/lib/webrtc/src/helper.d.ts +2 -2
- package/lib/webrtc/src/helper.js +2 -2
- package/lib/webrtc/src/helper.js.map +1 -1
- package/lib/webrtc/src/index.d.ts +6 -2
- package/lib/webrtc/src/index.js +6 -2
- package/lib/webrtc/src/index.js.map +1 -1
- package/lib/webrtc/src/{extension → media/extension}/rtcpFeedback.d.ts +1 -1
- package/lib/webrtc/src/{extension → media/extension}/rtcpFeedback.js +0 -0
- package/lib/webrtc/src/media/extension/rtcpFeedback.js.map +1 -0
- package/lib/webrtc/src/{extension → media/extension}/rtpExtension.d.ts +1 -1
- package/lib/webrtc/src/{extension → media/extension}/rtpExtension.js +1 -1
- package/lib/webrtc/src/media/extension/rtpExtension.js.map +1 -0
- package/lib/webrtc/src/media/{nack.d.ts → receiver/nack.d.ts} +2 -2
- package/lib/webrtc/src/media/{nack.js → receiver/nack.js} +2 -2
- package/lib/webrtc/src/media/receiver/nack.js.map +1 -0
- package/lib/webrtc/src/media/{statistics.d.ts → receiver/statistics.d.ts} +1 -1
- package/lib/webrtc/src/media/{statistics.js → receiver/statistics.js} +1 -1
- package/lib/webrtc/src/media/receiver/statistics.js.map +1 -0
- package/lib/webrtc/src/media/router.js +1 -1
- package/lib/webrtc/src/media/router.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +4 -2
- package/lib/webrtc/src/media/rtpReceiver.js +13 -6
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +4 -4
- package/lib/webrtc/src/media/rtpSender.js +12 -6
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/{senderBWE → sender}/cumulativeResult.d.ts +0 -0
- package/lib/webrtc/src/media/{senderBWE → sender}/cumulativeResult.js +0 -0
- package/lib/webrtc/src/media/sender/cumulativeResult.js.map +1 -0
- package/lib/webrtc/src/media/{senderBWE → sender}/senderBWE.d.ts +0 -0
- package/lib/webrtc/src/media/{senderBWE → sender}/senderBWE.js +0 -0
- package/lib/webrtc/src/media/sender/senderBWE.js.map +1 -0
- package/lib/webrtc/src/media/track.d.ts +3 -0
- package/lib/webrtc/src/media/track.js +2 -0
- package/lib/webrtc/src/media/track.js.map +1 -1
- package/lib/webrtc/src/nonstandard/jitterBuffer.d.ts +12 -0
- package/lib/webrtc/src/nonstandard/jitterBuffer.js +48 -0
- package/lib/webrtc/src/nonstandard/jitterBuffer.js.map +1 -0
- package/lib/webrtc/src/nonstandard/lipsync.d.ts +20 -0
- package/lib/webrtc/src/nonstandard/lipsync.js +39 -0
- package/lib/webrtc/src/nonstandard/lipsync.js.map +1 -0
- package/lib/webrtc/src/nonstandard/recorder.d.ts +18 -0
- package/lib/webrtc/src/nonstandard/recorder.js +25 -0
- package/lib/webrtc/src/nonstandard/recorder.js.map +1 -0
- package/lib/webrtc/src/nonstandard/sampleBuilder.d.ts +18 -0
- package/lib/webrtc/src/nonstandard/sampleBuilder.js +60 -0
- package/lib/webrtc/src/nonstandard/sampleBuilder.js.map +1 -0
- package/lib/webrtc/src/nonstandard/userMedia.d.ts +15 -0
- package/lib/webrtc/src/nonstandard/userMedia.js +67 -0
- package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -0
- package/lib/webrtc/src/nonstandard/webm.d.ts +24 -0
- package/lib/webrtc/src/nonstandard/webm.js +308 -0
- package/lib/webrtc/src/nonstandard/webm.js.map +1 -0
- package/lib/webrtc/src/peerConnection.js +1 -0
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/transport/dtls.d.ts +2 -1
- package/lib/webrtc/src/transport/dtls.js +7 -3
- package/lib/webrtc/src/transport/dtls.js.map +1 -1
- package/lib/webrtc/src/utils.d.ts +3 -0
- package/lib/webrtc/src/utils.js +13 -9
- package/lib/webrtc/src/utils.js.map +1 -1
- package/package.json +5 -4
- package/src/const.ts +8 -3
- package/src/helper.ts +4 -4
- package/src/index.ts +6 -2
- package/src/{extension → media/extension}/rtcpFeedback.ts +1 -1
- package/src/{extension → media/extension}/rtpExtension.ts +1 -1
- package/src/media/{nack.ts → receiver/nack.ts} +3 -3
- package/src/media/{statistics.ts → receiver/statistics.ts} +2 -2
- package/src/media/router.ts +1 -1
- package/src/media/rtpReceiver.ts +11 -7
- package/src/media/rtpSender.ts +19 -9
- package/src/media/{senderBWE → sender}/cumulativeResult.ts +0 -0
- package/src/media/{senderBWE → sender}/senderBWE.ts +0 -0
- package/src/media/track.ts +6 -0
- package/src/nonstandard/jitterBuffer.ts +47 -0
- package/src/nonstandard/lipsync.ts +55 -0
- package/src/nonstandard/recorder.ts +26 -0
- package/src/nonstandard/sampleBuilder.ts +71 -0
- package/src/nonstandard/userMedia.ts +74 -0
- package/src/nonstandard/webm.ts +421 -0
- package/src/peerConnection.ts +3 -1
- package/src/transport/dtls.ts +12 -4
- package/src/utils.ts +20 -12
- package/lib/webrtc/src/extension/rtcpFeedback.js.map +0 -1
- package/lib/webrtc/src/extension/rtpExtension.js.map +0 -1
- package/lib/webrtc/src/media/nack.js.map +0 -1
- package/lib/webrtc/src/media/senderBWE/cumulativeResult.js.map +0 -1
- package/lib/webrtc/src/media/senderBWE/senderBWE.js.map +0 -1
- package/lib/webrtc/src/media/statistics.js.map +0 -1
|
@@ -3,20 +3,83 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.NalUnitType = exports.H264RtpPayload = void 0;
|
|
5
5
|
const src_1 = require("../../../common/src");
|
|
6
|
+
// FU indicator octet
|
|
7
|
+
// +---------------+
|
|
8
|
+
// |0|1|2|3|4|5|6|7|
|
|
9
|
+
// +-+-+-+-+-+-+-+-+
|
|
10
|
+
// |F|NRI| Type |
|
|
11
|
+
// +---------------+
|
|
12
|
+
// FU header
|
|
13
|
+
// +---------------+
|
|
14
|
+
// |0|1|2|3|4|5|6|7|
|
|
15
|
+
// +-+-+-+-+-+-+-+-+
|
|
16
|
+
// |S|E|R| Type |
|
|
17
|
+
// +---------------+
|
|
6
18
|
class H264RtpPayload {
|
|
7
19
|
static deSerialize(buf) {
|
|
8
20
|
const h264 = new H264RtpPayload();
|
|
9
21
|
let offset = 0;
|
|
10
22
|
h264.f = src_1.getBit(buf[offset], 0);
|
|
11
23
|
h264.nri = src_1.getBit(buf[offset], 1, 2);
|
|
12
|
-
h264.
|
|
24
|
+
h264.nalUnitType = src_1.getBit(buf[offset], 3, 5);
|
|
13
25
|
offset++;
|
|
26
|
+
h264.s = src_1.getBit(buf[offset], 0);
|
|
27
|
+
h264.e = src_1.getBit(buf[offset], 1);
|
|
28
|
+
h264.r = src_1.getBit(buf[offset], 2);
|
|
29
|
+
h264.nalUnitPayloadType = src_1.getBit(buf[offset], 3, 5);
|
|
30
|
+
offset++;
|
|
31
|
+
// デフォルトでは packetization-mode=0
|
|
32
|
+
// packetization-mode=0だとSingle NAL Unit Packetしか来ない
|
|
33
|
+
// https://datatracker.ietf.org/doc/html/rfc6184#section-6.2
|
|
34
|
+
// Single NAL Unit Packet
|
|
35
|
+
if (0 < h264.nalUnitType && h264.nalUnitType < 24) {
|
|
36
|
+
h264.payload = this.packaging(buf);
|
|
37
|
+
}
|
|
38
|
+
// Single-time aggregation packet
|
|
39
|
+
else if (h264.nalUnitType === exports.NalUnitType.stap_a) {
|
|
40
|
+
let offset = stap_aHeaderSize;
|
|
41
|
+
let result = Buffer.alloc(0);
|
|
42
|
+
while (offset < buf.length) {
|
|
43
|
+
const naluSize = buf.readUInt16BE(offset);
|
|
44
|
+
offset += stap_aNALULengthSize;
|
|
45
|
+
result = Buffer.concat([
|
|
46
|
+
result,
|
|
47
|
+
this.packaging(buf.slice(offset, offset + naluSize)),
|
|
48
|
+
]);
|
|
49
|
+
offset += naluSize;
|
|
50
|
+
}
|
|
51
|
+
h264.payload = result;
|
|
52
|
+
}
|
|
14
53
|
return h264;
|
|
15
54
|
}
|
|
55
|
+
static packaging(buf) {
|
|
56
|
+
return Buffer.concat([annex_bNALUStartCode, buf]);
|
|
57
|
+
}
|
|
58
|
+
static isDetectedFinalPacketInSequence(header) {
|
|
59
|
+
return header.marker;
|
|
60
|
+
}
|
|
16
61
|
get isKeyframe() {
|
|
17
|
-
return this.
|
|
62
|
+
return this.nalUnitType === exports.NalUnitType.idrSlice;
|
|
63
|
+
}
|
|
64
|
+
get isPartitionHead() {
|
|
65
|
+
if (this.nalUnitType === exports.NalUnitType.fu_a ||
|
|
66
|
+
this.nalUnitType === exports.NalUnitType.fu_b) {
|
|
67
|
+
return this.s !== 0;
|
|
68
|
+
}
|
|
69
|
+
return true;
|
|
18
70
|
}
|
|
19
71
|
}
|
|
20
72
|
exports.H264RtpPayload = H264RtpPayload;
|
|
21
|
-
exports.NalUnitType = {
|
|
73
|
+
exports.NalUnitType = {
|
|
74
|
+
idrSlice: 5,
|
|
75
|
+
stap_a: 24,
|
|
76
|
+
stap_b: 25,
|
|
77
|
+
mtap16: 26,
|
|
78
|
+
mtap24: 27,
|
|
79
|
+
fu_a: 28,
|
|
80
|
+
fu_b: 29,
|
|
81
|
+
};
|
|
82
|
+
const annex_bNALUStartCode = Buffer.from([0x00, 0x00, 0x00, 0x01]);
|
|
83
|
+
const stap_aHeaderSize = 1;
|
|
84
|
+
const stap_aNALULengthSize = 2;
|
|
22
85
|
//# sourceMappingURL=h264.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"h264.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/h264.ts"],"names":[],"mappings":";AAAA,gDAAgD;;;AAEhD,6CAA6C;
|
|
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\nimport { 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\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\n static deSerialize(buf: Buffer) {\n const h264 = new H264RtpPayload();\n\n let offset = 0;\n\n h264.f = getBit(buf[offset], 0);\n h264.nri = getBit(buf[offset], 1, 2);\n h264.nalUnitType = getBit(buf[offset], 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 < 24) {\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.slice(offset, offset + naluSize)),\n ]);\n offset += naluSize;\n }\n h264.payload = result;\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 this.nalUnitType === NalUnitType.idrSlice;\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"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { RtpHeader } from "../rtp/rtp";
|
|
3
|
+
import { DePacketizerBase } from "./base";
|
|
4
|
+
export declare class OpusRtpPayload implements DePacketizerBase {
|
|
5
|
+
payload: Buffer;
|
|
6
|
+
static deSerialize(buf: Buffer): OpusRtpPayload;
|
|
7
|
+
static isDetectedFinalPacketInSequence(header: RtpHeader): boolean;
|
|
8
|
+
get isKeyframe(): boolean;
|
|
9
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OpusRtpPayload = void 0;
|
|
4
|
+
class OpusRtpPayload {
|
|
5
|
+
static deSerialize(buf) {
|
|
6
|
+
const opus = new OpusRtpPayload();
|
|
7
|
+
opus.payload = buf;
|
|
8
|
+
return opus;
|
|
9
|
+
}
|
|
10
|
+
static isDetectedFinalPacketInSequence(header) {
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
get isKeyframe() {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.OpusRtpPayload = OpusRtpPayload;
|
|
18
|
+
//# sourceMappingURL=opus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opus.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/opus.ts"],"names":[],"mappings":";;;AAGA,MAAa,cAAc;IAGzB,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;CACF;AAhBD,wCAgBC","sourcesContent":["import { 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"]}
|
|
@@ -1,19 +1,26 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
import { RtpHeader } from "../rtp/rtp";
|
|
3
|
+
import { DePacketizerBase } from "./base";
|
|
4
|
+
export declare class Vp8RtpPayload implements DePacketizerBase {
|
|
5
|
+
xBit: number;
|
|
6
|
+
nBit: number;
|
|
7
|
+
sBit: number;
|
|
6
8
|
pid: number;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
iBit?: number;
|
|
10
|
+
lBit?: number;
|
|
11
|
+
tBit?: number;
|
|
12
|
+
kBit?: number;
|
|
13
|
+
mBit?: number;
|
|
12
14
|
pictureId?: number;
|
|
15
|
+
payload: Buffer;
|
|
13
16
|
size0?: number;
|
|
14
|
-
|
|
17
|
+
hBit?: number;
|
|
15
18
|
ver?: number;
|
|
16
|
-
|
|
19
|
+
pBit?: number;
|
|
20
|
+
size1?: number;
|
|
21
|
+
size2?: number;
|
|
17
22
|
static deSerialize(buf: Buffer): Vp8RtpPayload;
|
|
23
|
+
static isDetectedFinalPacketInSequence(header: RtpHeader): boolean;
|
|
18
24
|
get isKeyframe(): boolean;
|
|
25
|
+
get isPartitionHead(): boolean;
|
|
19
26
|
}
|
package/lib/rtp/src/codec/vp8.js
CHANGED
|
@@ -35,43 +35,65 @@ const src_1 = require("../../../common/src");
|
|
|
35
35
|
// +-+-+-+-+-+-+-+-+
|
|
36
36
|
class Vp8RtpPayload {
|
|
37
37
|
static deSerialize(buf) {
|
|
38
|
-
const
|
|
38
|
+
const p = new Vp8RtpPayload();
|
|
39
39
|
let offset = 0;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
40
|
+
p.xBit = src_1.getBit(buf[offset], 0);
|
|
41
|
+
p.nBit = src_1.getBit(buf[offset], 2);
|
|
42
|
+
p.sBit = src_1.getBit(buf[offset], 3);
|
|
43
|
+
p.pid = src_1.getBit(buf[offset], 5, 3);
|
|
44
44
|
offset++;
|
|
45
|
-
if (
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
45
|
+
if (p.xBit) {
|
|
46
|
+
p.iBit = src_1.getBit(buf[offset], 0);
|
|
47
|
+
p.lBit = src_1.getBit(buf[offset], 1);
|
|
48
|
+
p.tBit = src_1.getBit(buf[offset], 2);
|
|
49
|
+
p.kBit = src_1.getBit(buf[offset], 3);
|
|
50
50
|
offset++;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
51
|
+
}
|
|
52
|
+
if (p.iBit) {
|
|
53
|
+
p.mBit = src_1.getBit(buf[offset], 0);
|
|
54
|
+
if (p.mBit) {
|
|
55
|
+
const _7 = src_1.paddingByte(src_1.getBit(buf[offset], 1, 7));
|
|
56
|
+
const _8 = src_1.paddingByte(buf[offset + 1]);
|
|
57
|
+
p.pictureId = parseInt(_7 + _8, 2);
|
|
58
|
+
offset += 2;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
p.pictureId = src_1.getBit(buf[offset], 1, 7);
|
|
62
|
+
offset++;
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
|
-
if (
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
65
|
+
if (p.lBit) {
|
|
66
|
+
offset++;
|
|
67
|
+
}
|
|
68
|
+
if (p.lBit || p.kBit) {
|
|
69
|
+
if (p.tBit) {
|
|
70
|
+
}
|
|
71
|
+
if (p.kBit) {
|
|
72
|
+
}
|
|
73
|
+
offset++;
|
|
70
74
|
}
|
|
71
|
-
|
|
75
|
+
p.payload = buf.slice(offset);
|
|
76
|
+
if (p.sBit === 1 && p.pid === 0) {
|
|
77
|
+
p.size0 = src_1.getBit(buf[offset], 0, 3);
|
|
78
|
+
p.hBit = src_1.getBit(buf[offset], 3);
|
|
79
|
+
p.ver = src_1.getBit(buf[offset], 4, 3);
|
|
80
|
+
p.pBit = src_1.getBit(buf[offset], 7);
|
|
81
|
+
offset++;
|
|
82
|
+
}
|
|
83
|
+
p.size1 = buf[offset];
|
|
84
|
+
offset++;
|
|
85
|
+
p.size2 = buf[offset];
|
|
86
|
+
offset++;
|
|
87
|
+
return p;
|
|
88
|
+
}
|
|
89
|
+
static isDetectedFinalPacketInSequence(header) {
|
|
90
|
+
return header.marker;
|
|
72
91
|
}
|
|
73
92
|
get isKeyframe() {
|
|
74
|
-
return this.
|
|
93
|
+
return this.pBit === 0;
|
|
94
|
+
}
|
|
95
|
+
get isPartitionHead() {
|
|
96
|
+
return this.sBit === 1;
|
|
75
97
|
}
|
|
76
98
|
}
|
|
77
99
|
exports.Vp8RtpPayload = Vp8RtpPayload;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vp8.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/vp8.ts"],"names":[],"mappings":";;;AAAA,6CAA0D;
|
|
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?: number;\n hBit?: number;\n ver?: number;\n pBit?: number;\n size1?: number;\n size2?: number;\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.slice(offset);\n\n if (p.sBit === 1 && p.pid === 0) {\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 }\n\n p.size1 = buf[offset];\n offset++;\n p.size2 = buf[offset];\n offset++;\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"]}
|
|
@@ -1,19 +1,47 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
2
|
+
import { RtpHeader } from "../rtp/rtp";
|
|
3
|
+
import { DePacketizerBase } from "./base";
|
|
4
|
+
export declare class Vp9RtpPayload implements DePacketizerBase {
|
|
5
|
+
/**Picture ID (PID) present */
|
|
6
|
+
iBit: number;
|
|
7
|
+
/**Inter-picture predicted frame */
|
|
8
|
+
pBit: number;
|
|
9
|
+
/**Layer indices present */
|
|
10
|
+
lBit: number;
|
|
11
|
+
/**Flexible mode */
|
|
12
|
+
fBit: number;
|
|
13
|
+
/**Start of a frame */
|
|
14
|
+
bBit: number;
|
|
15
|
+
/**End of a frame */
|
|
16
|
+
eBit: number;
|
|
17
|
+
/**Scalability structure */
|
|
18
|
+
vBit: number;
|
|
19
|
+
zBit: number;
|
|
11
20
|
m?: number;
|
|
12
21
|
pictureId?: number;
|
|
13
22
|
tid?: number;
|
|
14
23
|
u?: number;
|
|
15
24
|
sid?: number;
|
|
25
|
+
/**inter_layer_predicted */
|
|
16
26
|
d?: number;
|
|
27
|
+
tl0PicIdx?: number;
|
|
28
|
+
pDiff: number[];
|
|
29
|
+
n_s?: number;
|
|
30
|
+
y?: number;
|
|
31
|
+
g?: number;
|
|
32
|
+
width: number[];
|
|
33
|
+
height: number[];
|
|
34
|
+
n_g: number;
|
|
35
|
+
pgT: number[];
|
|
36
|
+
pgU: number[];
|
|
37
|
+
pgP_Diff: number[][];
|
|
38
|
+
payload: Buffer;
|
|
17
39
|
static deSerialize(buf: Buffer): Vp9RtpPayload;
|
|
18
|
-
|
|
40
|
+
static parseRtpPayload(buf: Buffer): {
|
|
41
|
+
offset: number;
|
|
42
|
+
p: Vp9RtpPayload;
|
|
43
|
+
};
|
|
44
|
+
static isDetectedFinalPacketInSequence(header: RtpHeader): boolean;
|
|
45
|
+
get isKeyframe(): boolean;
|
|
46
|
+
get isPartitionHead(): boolean | 0;
|
|
19
47
|
}
|
package/lib/rtp/src/codec/vp9.js
CHANGED
|
@@ -34,39 +34,128 @@ const src_1 = require("../../../common/src");
|
|
|
34
34
|
// | .. |
|
|
35
35
|
// +-+-+-+-+-+-+-+-+
|
|
36
36
|
class Vp9RtpPayload {
|
|
37
|
+
constructor() {
|
|
38
|
+
this.pDiff = [];
|
|
39
|
+
this.width = [];
|
|
40
|
+
this.height = [];
|
|
41
|
+
this.n_g = 0;
|
|
42
|
+
this.pgT = [];
|
|
43
|
+
this.pgU = [];
|
|
44
|
+
this.pgP_Diff = [];
|
|
45
|
+
}
|
|
37
46
|
static deSerialize(buf) {
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
47
|
+
const { p, offset } = this.parseRtpPayload(buf);
|
|
48
|
+
p.payload = buf.slice(offset);
|
|
49
|
+
return p;
|
|
50
|
+
}
|
|
51
|
+
static parseRtpPayload(buf) {
|
|
52
|
+
const p = new Vp9RtpPayload();
|
|
53
|
+
let offset = 0;
|
|
54
|
+
p.iBit = src_1.getBit(buf[offset], 0); // PictureId present .
|
|
55
|
+
p.pBit = src_1.getBit(buf[offset], 1); // Inter-picture predicted.
|
|
56
|
+
p.lBit = src_1.getBit(buf[offset], 2); // Layer indices present.
|
|
57
|
+
p.fBit = src_1.getBit(buf[offset], 3); // Flexible mode.
|
|
58
|
+
p.bBit = src_1.getBit(buf[offset], 4); // Begins frame flag.
|
|
59
|
+
p.eBit = src_1.getBit(buf[offset], 5); // Ends frame flag.
|
|
60
|
+
p.vBit = src_1.getBit(buf[offset], 6); // Scalability structure present.
|
|
61
|
+
p.zBit = src_1.getBit(buf[offset], 7); // Not used for inter-layer prediction
|
|
62
|
+
offset++;
|
|
63
|
+
if (p.iBit) {
|
|
64
|
+
p.m = src_1.getBit(buf[offset], 0);
|
|
65
|
+
if (p.m) {
|
|
66
|
+
const _7 = src_1.paddingByte(src_1.getBit(buf[offset], 1, 7));
|
|
67
|
+
const _8 = src_1.paddingByte(buf[offset + 1]);
|
|
68
|
+
p.pictureId = parseInt(_7 + _8, 2);
|
|
69
|
+
offset += 2;
|
|
56
70
|
}
|
|
57
71
|
else {
|
|
58
|
-
|
|
59
|
-
|
|
72
|
+
p.pictureId = src_1.getBit(buf[offset], 1, 7);
|
|
73
|
+
offset++;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (p.lBit) {
|
|
77
|
+
p.tid = src_1.getBit(buf[offset], 0, 3);
|
|
78
|
+
p.u = src_1.getBit(buf[offset], 3);
|
|
79
|
+
p.sid = src_1.getBit(buf[offset], 4, 3);
|
|
80
|
+
p.d = src_1.getBit(buf[offset], 7);
|
|
81
|
+
offset++;
|
|
82
|
+
if (p.fBit === 0) {
|
|
83
|
+
p.tl0PicIdx = buf[offset];
|
|
84
|
+
offset++;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (p.fBit && p.pBit) {
|
|
88
|
+
for (;;) {
|
|
89
|
+
p.pDiff = [...p.pDiff, src_1.getBit(buf[offset], 0, 7)];
|
|
90
|
+
const n = src_1.getBit(buf[offset], 7);
|
|
91
|
+
offset++;
|
|
92
|
+
if (n === 0)
|
|
93
|
+
break;
|
|
60
94
|
}
|
|
61
95
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
96
|
+
// Scalability structure (SS):
|
|
97
|
+
//
|
|
98
|
+
// +-+-+-+-+-+-+-+-+
|
|
99
|
+
// V: | N_S |Y|G|-|-|-|
|
|
100
|
+
// +-+-+-+-+-+-+-+-+ -|
|
|
101
|
+
// Y: | WIDTH | (OPTIONAL) .
|
|
102
|
+
// + + .
|
|
103
|
+
// | | (OPTIONAL) .
|
|
104
|
+
// +-+-+-+-+-+-+-+-+ . N_S + 1 times
|
|
105
|
+
// | HEIGHT | (OPTIONAL) .
|
|
106
|
+
// + + .
|
|
107
|
+
// | | (OPTIONAL) .
|
|
108
|
+
// +-+-+-+-+-+-+-+-+ -|
|
|
109
|
+
// G: | N_G | (OPTIONAL)
|
|
110
|
+
// +-+-+-+-+-+-+-+-+ -|
|
|
111
|
+
// N_G: | T |U| R |-|-| (OPTIONAL) .
|
|
112
|
+
// +-+-+-+-+-+-+-+-+ -| . N_G times
|
|
113
|
+
// | P_DIFF | (OPTIONAL) . R times .
|
|
114
|
+
// +-+-+-+-+-+-+-+-+ -| -|
|
|
115
|
+
//
|
|
116
|
+
if (p.vBit) {
|
|
117
|
+
p.n_s = src_1.getBit(buf[offset], 0, 3);
|
|
118
|
+
p.y = src_1.getBit(buf[offset], 3);
|
|
119
|
+
p.g = src_1.getBit(buf[offset], 4);
|
|
120
|
+
offset++;
|
|
121
|
+
if (p.y) {
|
|
122
|
+
[...Array(p.n_s + 1)].forEach(() => {
|
|
123
|
+
p.width.push(buf.readUInt16BE(offset));
|
|
124
|
+
offset += 2;
|
|
125
|
+
p.height.push(buf.readUInt16BE(offset));
|
|
126
|
+
offset += 2;
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
if (p.g) {
|
|
130
|
+
p.n_g = buf[offset];
|
|
131
|
+
offset++;
|
|
132
|
+
}
|
|
133
|
+
if (p.n_g > 0) {
|
|
134
|
+
[...Array(p.n_g).keys()].forEach((i) => {
|
|
135
|
+
p.pgT.push(src_1.getBit(buf[offset], 0, 3));
|
|
136
|
+
p.pgU.push(src_1.getBit(buf[offset], 3));
|
|
137
|
+
const r = src_1.getBit(buf[offset], 4, 2);
|
|
138
|
+
offset++;
|
|
139
|
+
p.pgP_Diff[i] = [];
|
|
140
|
+
if (r > 0) {
|
|
141
|
+
[...Array(r)].forEach(() => {
|
|
142
|
+
p.pgP_Diff[i].push(buf[offset]);
|
|
143
|
+
offset++;
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return { offset, p };
|
|
150
|
+
}
|
|
151
|
+
static isDetectedFinalPacketInSequence(header) {
|
|
152
|
+
return header.marker;
|
|
67
153
|
}
|
|
68
154
|
get isKeyframe() {
|
|
69
|
-
return !this.
|
|
155
|
+
return !!(!this.pBit && this.bBit && (!this.sid || !this.lBit));
|
|
156
|
+
}
|
|
157
|
+
get isPartitionHead() {
|
|
158
|
+
return this.bBit && (!this.lBit || !this.d);
|
|
70
159
|
}
|
|
71
160
|
}
|
|
72
161
|
exports.Vp9RtpPayload = Vp9RtpPayload;
|
|
@@ -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\";\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 {\n i!: number;\n p!: number;\n l!: number;\n f!: number;\n b!: number;\n e!: number;\n v!: number;\n z!: number;\n m?: number;\n pictureId?: number;\n tid?: number;\n u?: number;\n sid?: number;\n d?: number;\n\n static deSerialize(buf: Buffer) {\n const c = new Vp9RtpPayload();\n\n let index = 0;\n\n c.i = getBit(buf[index], 0);\n c.p = getBit(buf[index], 1);\n c.l = getBit(buf[index], 2);\n c.f = getBit(buf[index], 3);\n c.b = getBit(buf[index], 4);\n c.e = getBit(buf[index], 5);\n c.v = getBit(buf[index], 6);\n c.z = getBit(buf[index], 7);\n\n index++;\n\n if (c.i === 1) {\n c.m = getBit(buf[index], 0);\n\n if (c.m === 1) {\n const _7 = paddingByte(getBit(buf[index], 1, 7));\n const _8 = paddingByte(buf[index + 1]);\n c.pictureId = parseInt(_7 + _8, 2);\n index += 2;\n } else {\n c.pictureId = getBit(buf[index], 1, 7);\n index++;\n }\n }\n\n c.tid = getBit(buf[index], 0, 3);\n c.u = getBit(buf[index], 3);\n c.sid = getBit(buf[index], 4, 3);\n c.d = getBit(buf[index], 7);\n\n return c;\n }\n\n get isKeyframe() {\n return !this.p && this.b && (!this.sid || !this.l);\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: 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.slice(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"]}
|
package/lib/rtp/src/index.d.ts
CHANGED
package/lib/rtp/src/index.js
CHANGED
|
@@ -12,7 +12,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
13
|
exports.SrtpSession = exports.SrtcpSession = exports.GenericNack = exports.RtcpTransportLayerFeedback = exports.ReceiverEstimatedMaxBitrate = exports.PictureLossIndication = exports.RtcpPayloadSpecificFeedback = exports.RtcpHeader = void 0;
|
|
14
14
|
__exportStar(require("./codec/av1"), exports);
|
|
15
|
+
__exportStar(require("./codec/base"), exports);
|
|
15
16
|
__exportStar(require("./codec/h264"), exports);
|
|
17
|
+
__exportStar(require("./codec/opus"), exports);
|
|
16
18
|
__exportStar(require("./codec/vp8"), exports);
|
|
17
19
|
__exportStar(require("./codec/vp9"), exports);
|
|
18
20
|
var header_1 = require("./rtcp/header");
|
package/lib/rtp/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../rtp/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,+CAA6B;AAC7B,8CAA4B;AAC5B,8CAA4B;AAC5B,wCAA2C;AAAlC,oGAAA,UAAU,OAAA;AACnB,oCAA0D;AAAjD,mHAAA,2BAA2B,OAAA;AACpC,2EAA0E;AAAjE,8HAAA,qBAAqB,OAAA;AAC9B,yCAA+D;AAAtD,mHAAA,2BAA2B,OAAA;AACpC,4CAA0B;AAC1B,8CAA4B;AAC5B,sCAA0D;AAAjD,mHAAA,0BAA0B,OAAA;AACnC,0CAAgD;AAAvC,mGAAA,WAAW,OAAA;AACpB,oDAAkC;AAClC,8CAA4B;AAC5B,4CAA0B;AAC1B,4CAA0B;AAC1B,sCAA4C;AAAnC,qGAAA,YAAY,OAAA;AACrB,oCAA0C;AAAjC,mGAAA,WAAW,OAAA","sourcesContent":["export * from \"./codec/av1\";\nexport * from \"./codec/h264\";\nexport * from \"./codec/vp8\";\nexport * from \"./codec/vp9\";\nexport { RtcpHeader } from \"./rtcp/header\";\nexport { RtcpPayloadSpecificFeedback } from \"./rtcp/psfb\";\nexport { PictureLossIndication } from \"./rtcp/psfb/pictureLossIndication\";\nexport { ReceiverEstimatedMaxBitrate } from \"./rtcp/psfb/remb\";\nexport * from \"./rtcp/rr\";\nexport * from \"./rtcp/rtcp\";\nexport { RtcpTransportLayerFeedback } from \"./rtcp/rtpfb\";\nexport { GenericNack } from \"./rtcp/rtpfb/nack\";\nexport * from \"./rtcp/rtpfb/twcc\";\nexport * from \"./rtcp/sdes\";\nexport * from \"./rtcp/sr\";\nexport * from \"./rtp/rtp\";\nexport { SrtcpSession } from \"./srtp/srtcp\";\nexport { SrtpSession } from \"./srtp/srtp\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../rtp/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,+CAA6B;AAC7B,+CAA6B;AAC7B,+CAA6B;AAC7B,8CAA4B;AAC5B,8CAA4B;AAC5B,wCAA2C;AAAlC,oGAAA,UAAU,OAAA;AACnB,oCAA0D;AAAjD,mHAAA,2BAA2B,OAAA;AACpC,2EAA0E;AAAjE,8HAAA,qBAAqB,OAAA;AAC9B,yCAA+D;AAAtD,mHAAA,2BAA2B,OAAA;AACpC,4CAA0B;AAC1B,8CAA4B;AAC5B,sCAA0D;AAAjD,mHAAA,0BAA0B,OAAA;AACnC,0CAAgD;AAAvC,mGAAA,WAAW,OAAA;AACpB,oDAAkC;AAClC,8CAA4B;AAC5B,4CAA0B;AAC1B,4CAA0B;AAC1B,sCAA4C;AAAnC,qGAAA,YAAY,OAAA;AACrB,oCAA0C;AAAjC,mGAAA,WAAW,OAAA","sourcesContent":["export * from \"./codec/av1\";\nexport * from \"./codec/base\";\nexport * from \"./codec/h264\";\nexport * from \"./codec/opus\";\nexport * from \"./codec/vp8\";\nexport * from \"./codec/vp9\";\nexport { RtcpHeader } from \"./rtcp/header\";\nexport { RtcpPayloadSpecificFeedback } from \"./rtcp/psfb\";\nexport { PictureLossIndication } from \"./rtcp/psfb/pictureLossIndication\";\nexport { ReceiverEstimatedMaxBitrate } from \"./rtcp/psfb/remb\";\nexport * from \"./rtcp/rr\";\nexport * from \"./rtcp/rtcp\";\nexport { RtcpTransportLayerFeedback } from \"./rtcp/rtpfb\";\nexport { GenericNack } from \"./rtcp/rtpfb/nack\";\nexport * from \"./rtcp/rtpfb/twcc\";\nexport * from \"./rtcp/sdes\";\nexport * from \"./rtcp/sr\";\nexport * from \"./rtp/rtp\";\nexport { SrtcpSession } from \"./srtp/srtcp\";\nexport { SrtpSession } from \"./srtp/srtp\";\n"]}
|
|
@@ -5,8 +5,8 @@ import { PictureLossIndication } from "./pictureLossIndication";
|
|
|
5
5
|
import { ReceiverEstimatedMaxBitrate } from "./remb";
|
|
6
6
|
declare type Feedback = FullIntraRequest | PictureLossIndication | ReceiverEstimatedMaxBitrate;
|
|
7
7
|
export declare class RtcpPayloadSpecificFeedback {
|
|
8
|
-
static type
|
|
9
|
-
type
|
|
8
|
+
static readonly type = 206;
|
|
9
|
+
readonly type = 206;
|
|
10
10
|
feedback: Feedback;
|
|
11
11
|
constructor(props?: Partial<RtcpPayloadSpecificFeedback>);
|
|
12
12
|
serialize(): Buffer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../rtp/src/rtcp/psfb/index.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAG1B,kCAA8C;AAC9C,yDAAsD;AACtD,mEAAgE;AAChE,iCAAqD;AAErD,MAAM,GAAG,GAAG,eAAK,CAAC,4BAA4B,CAAC,CAAC;AAOhD,MAAa,2BAA2B;IAMtC,YAAY,QAA8C,EAAE;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../rtp/src/rtcp/psfb/index.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAG1B,kCAA8C;AAC9C,yDAAsD;AACtD,mEAAgE;AAChE,iCAAqD;AAErD,MAAM,GAAG,GAAG,eAAK,CAAC,4BAA4B,CAAC,CAAC;AAOhD,MAAa,2BAA2B;IAMtC,YAAY,QAA8C,EAAE;QAJnD,SAAI,GAAG,2BAA2B,CAAC,IAAI,CAAC;QAK/C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS;QACP,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC1C,OAAO,0BAAmB,CAAC,SAAS,CAClC,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,QAAQ,CAAC,KAAK,EACnB,OAAO,EACP,IAAI,CAAC,QAAQ,CAAC,MAAM,CACrB,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,IAAY,EAAE,MAAkB;QACjD,IAAI,QAA8B,CAAC;QAEnC,QAAQ,MAAM,CAAC,KAAK,EAAE;YACpB,KAAK,mCAAgB,CAAC,KAAK;gBACzB,QAAQ,GAAG,mCAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC9C,MAAM;YACR,KAAK,6CAAqB,CAAC,KAAK;gBAC9B,QAAQ,GAAG,6CAAqB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBACnD,MAAM;YACR,KAAK,kCAA2B,CAAC,KAAK;gBACpC,QAAQ,GAAG,kCAA2B,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBACzD,MAAM;YACR;gBACE,GAAG,CAAC,qBAAqB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;gBACzC,MAAM;SACT;QAED,OAAO,IAAI,2BAA2B,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvD,CAAC;;AAvCH,kEAwCC;AAvCiB,gCAAI,GAAG,GAAG,CAAC","sourcesContent":["import debug from \"debug\";\n\nimport { RtcpHeader } from \"../header\";\nimport { RtcpPacketConverter } from \"../rtcp\";\nimport { FullIntraRequest } from \"./fullIntraRequest\";\nimport { PictureLossIndication } from \"./pictureLossIndication\";\nimport { ReceiverEstimatedMaxBitrate } from \"./remb\";\n\nconst log = debug(\"werift/rtp/rtcp/psfb/index\");\n\ntype Feedback =\n | FullIntraRequest\n | PictureLossIndication\n | ReceiverEstimatedMaxBitrate;\n\nexport class RtcpPayloadSpecificFeedback {\n static readonly type = 206;\n readonly type = RtcpPayloadSpecificFeedback.type;\n\n feedback!: Feedback;\n\n constructor(props: Partial<RtcpPayloadSpecificFeedback> = {}) {\n Object.assign(this, props);\n }\n\n serialize() {\n const payload = this.feedback.serialize();\n return RtcpPacketConverter.serialize(\n this.type,\n this.feedback.count,\n payload,\n this.feedback.length\n );\n }\n\n static deSerialize(data: Buffer, header: RtcpHeader) {\n let feedback: Feedback | undefined;\n\n switch (header.count) {\n case FullIntraRequest.count:\n feedback = FullIntraRequest.deSerialize(data);\n break;\n case PictureLossIndication.count:\n feedback = PictureLossIndication.deSerialize(data);\n break;\n case ReceiverEstimatedMaxBitrate.count:\n feedback = ReceiverEstimatedMaxBitrate.deSerialize(data);\n break;\n default:\n log(\"unknown psfb packet\", header.count);\n break;\n }\n\n return new RtcpPayloadSpecificFeedback({ feedback });\n }\n}\n"]}
|