piixishstream 0.0.0-stage → 1.0.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/README.md +124 -2
- package/dist/client/GatewayEvents.d.ts +30 -0
- package/dist/client/GatewayEvents.js +2 -0
- package/dist/client/GatewayEvents.js.map +1 -0
- package/dist/client/GatewayOpCodes.d.ts +40 -0
- package/dist/client/GatewayOpCodes.js +42 -0
- package/dist/client/GatewayOpCodes.js.map +1 -0
- package/dist/client/Streamer.d.ts +30 -0
- package/dist/client/Streamer.js +188 -0
- package/dist/client/Streamer.js.map +1 -0
- package/dist/client/index.d.ts +3 -0
- package/dist/client/index.js +4 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/processing/AnnexBBitstreamReaderWriter.d.ts +23 -0
- package/dist/client/processing/AnnexBBitstreamReaderWriter.js +149 -0
- package/dist/client/processing/AnnexBBitstreamReaderWriter.js.map +1 -0
- package/dist/client/processing/AnnexBHelper.d.ts +93 -0
- package/dist/client/processing/AnnexBHelper.js +127 -0
- package/dist/client/processing/AnnexBHelper.js.map +1 -0
- package/dist/client/processing/SPSVUIRewriter.d.ts +1 -0
- package/dist/client/processing/SPSVUIRewriter.js +297 -0
- package/dist/client/processing/SPSVUIRewriter.js.map +1 -0
- package/dist/client/voice/BaseMediaConnection.d.ts +80 -0
- package/dist/client/voice/BaseMediaConnection.js +552 -0
- package/dist/client/voice/BaseMediaConnection.js.map +1 -0
- package/dist/client/voice/CodecPayloadType.d.ts +59 -0
- package/dist/client/voice/CodecPayloadType.js +60 -0
- package/dist/client/voice/CodecPayloadType.js.map +1 -0
- package/dist/client/voice/StreamConnection.d.ts +11 -0
- package/dist/client/voice/StreamConnection.js +34 -0
- package/dist/client/voice/StreamConnection.js.map +1 -0
- package/dist/client/voice/VoiceConnection.d.ts +8 -0
- package/dist/client/voice/VoiceConnection.js +15 -0
- package/dist/client/voice/VoiceConnection.js.map +1 -0
- package/dist/client/voice/VoiceMessageTypes.d.ts +178 -0
- package/dist/client/voice/VoiceMessageTypes.js +2 -0
- package/dist/client/voice/VoiceMessageTypes.js.map +1 -0
- package/dist/client/voice/VoiceOpCodes.d.ts +35 -0
- package/dist/client/voice/VoiceOpCodes.js +38 -0
- package/dist/client/voice/VoiceOpCodes.js.map +1 -0
- package/dist/client/voice/WebRtcWrapper.d.ts +23 -0
- package/dist/client/voice/WebRtcWrapper.js +159 -0
- package/dist/client/voice/WebRtcWrapper.js.map +1 -0
- package/dist/client/voice/index.d.ts +4 -0
- package/dist/client/voice/index.js +6 -0
- package/dist/client/voice/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/media/AudioStream.d.ts +7 -0
- package/dist/media/AudioStream.js +12 -0
- package/dist/media/AudioStream.js.map +1 -0
- package/dist/media/BaseMediaStream.d.ts +31 -0
- package/dist/media/BaseMediaStream.js +164 -0
- package/dist/media/BaseMediaStream.js.map +1 -0
- package/dist/media/LibavCodecId.d.ts +541 -0
- package/dist/media/LibavCodecId.js +553 -0
- package/dist/media/LibavCodecId.js.map +1 -0
- package/dist/media/LibavDecoder.d.ts +5 -0
- package/dist/media/LibavDecoder.js +43 -0
- package/dist/media/LibavDecoder.js.map +1 -0
- package/dist/media/LibavDemuxer.d.ts +44 -0
- package/dist/media/LibavDemuxer.js +231 -0
- package/dist/media/LibavDemuxer.js.map +1 -0
- package/dist/media/VideoStream.d.ts +7 -0
- package/dist/media/VideoStream.js +12 -0
- package/dist/media/VideoStream.js.map +1 -0
- package/dist/media/encoders/index.d.ts +26 -0
- package/dist/media/encoders/index.js +12 -0
- package/dist/media/encoders/index.js.map +1 -0
- package/dist/media/encoders/merge.d.ts +3 -0
- package/dist/media/encoders/merge.js +10 -0
- package/dist/media/encoders/merge.js.map +1 -0
- package/dist/media/encoders/nvenc.d.ts +10 -0
- package/dist/media/encoders/nvenc.js +23 -0
- package/dist/media/encoders/nvenc.js.map +1 -0
- package/dist/media/encoders/software.d.ts +17 -0
- package/dist/media/encoders/software.js +31 -0
- package/dist/media/encoders/software.js.map +1 -0
- package/dist/media/encoders/vaapi.d.ts +6 -0
- package/dist/media/encoders/vaapi.js +22 -0
- package/dist/media/encoders/vaapi.js.map +1 -0
- package/dist/media/index.d.ts +4 -0
- package/dist/media/index.js +5 -0
- package/dist/media/index.js.map +1 -0
- package/dist/media/newApi.d.ts +130 -0
- package/dist/media/newApi.js +409 -0
- package/dist/media/newApi.js.map +1 -0
- package/dist/utils.d.ts +25 -0
- package/dist/utils.js +65 -0
- package/dist/utils.js.map +1 -0
- package/package.json +82 -5
- package/src/client/GatewayEvents.ts +48 -0
- package/src/client/GatewayOpCodes.ts +40 -0
- package/src/client/Streamer.ts +259 -0
- package/src/client/index.ts +3 -0
- package/src/client/processing/AnnexBBitstreamReaderWriter.ts +148 -0
- package/src/client/processing/AnnexBHelper.ts +134 -0
- package/src/client/processing/SPSVUIRewriter.ts +332 -0
- package/src/client/voice/BaseMediaConnection.ts +639 -0
- package/src/client/voice/CodecPayloadType.ts +59 -0
- package/src/client/voice/MediaUdp.ts.bak +171 -0
- package/src/client/voice/StreamConnection.ts +38 -0
- package/src/client/voice/VoiceConnection.ts +19 -0
- package/src/client/voice/VoiceMessageTypes.ts +263 -0
- package/src/client/voice/VoiceOpCodes.ts +36 -0
- package/src/client/voice/WebRtcWrapper.ts +218 -0
- package/src/client/voice/index.ts +5 -0
- package/src/index.ts +3 -0
- package/src/media/AudioStream.ts +18 -0
- package/src/media/BaseMediaStream.ts +198 -0
- package/src/media/LibavCodecId.ts +564 -0
- package/src/media/LibavDecoder.ts +47 -0
- package/src/media/LibavDemuxer.ts +293 -0
- package/src/media/VideoStream.ts +17 -0
- package/src/media/encoders/index.ts +27 -0
- package/src/media/encoders/merge.ts +14 -0
- package/src/media/encoders/nvenc.ts +38 -0
- package/src/media/encoders/software.ts +76 -0
- package/src/media/encoders/vaapi.ts +29 -0
- package/src/media/index.ts +4 -0
- package/src/media/newApi.ts +642 -0
- package/src/utils.ts +101 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export const CodecPayloadType = {
|
|
2
|
+
opus: {
|
|
3
|
+
name: "opus",
|
|
4
|
+
type: "audio",
|
|
5
|
+
clockRate: 48000,
|
|
6
|
+
priority: 1000,
|
|
7
|
+
payload_type: 120,
|
|
8
|
+
},
|
|
9
|
+
H264: {
|
|
10
|
+
name: "H264",
|
|
11
|
+
type: "video",
|
|
12
|
+
clockRate: 90000,
|
|
13
|
+
priority: 1000,
|
|
14
|
+
payload_type: 101,
|
|
15
|
+
rtx_payload_type: 102,
|
|
16
|
+
encode: true,
|
|
17
|
+
decode: true,
|
|
18
|
+
},
|
|
19
|
+
H265: {
|
|
20
|
+
name: "H265",
|
|
21
|
+
type: "video",
|
|
22
|
+
clockRate: 90000,
|
|
23
|
+
priority: 1000,
|
|
24
|
+
payload_type: 103,
|
|
25
|
+
rtx_payload_type: 104,
|
|
26
|
+
encode: true,
|
|
27
|
+
decode: true,
|
|
28
|
+
},
|
|
29
|
+
VP8: {
|
|
30
|
+
name: "VP8",
|
|
31
|
+
type: "video",
|
|
32
|
+
clockRate: 90000,
|
|
33
|
+
priority: 1000,
|
|
34
|
+
payload_type: 105,
|
|
35
|
+
rtx_payload_type: 106,
|
|
36
|
+
encode: true,
|
|
37
|
+
decode: true,
|
|
38
|
+
},
|
|
39
|
+
VP9: {
|
|
40
|
+
name: "VP9",
|
|
41
|
+
type: "video",
|
|
42
|
+
clockRate: 90000,
|
|
43
|
+
priority: 1000,
|
|
44
|
+
payload_type: 107,
|
|
45
|
+
rtx_payload_type: 108,
|
|
46
|
+
encode: true,
|
|
47
|
+
decode: true,
|
|
48
|
+
},
|
|
49
|
+
AV1: {
|
|
50
|
+
name: "AV1",
|
|
51
|
+
type: "video",
|
|
52
|
+
clockRate: 90000,
|
|
53
|
+
priority: 1000,
|
|
54
|
+
payload_type: 109,
|
|
55
|
+
rtx_payload_type: 110,
|
|
56
|
+
encode: true,
|
|
57
|
+
decode: true,
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=CodecPayloadType.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodecPayloadType.js","sourceRoot":"","sources":["../../../src/client/voice/CodecPayloadType.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,KAAK;QAChB,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,GAAG;KAClB;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,KAAK;QAChB,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,GAAG;QACjB,gBAAgB,EAAE,GAAG;QACrB,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,IAAI;KACb;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,KAAK;QAChB,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,GAAG;QACjB,gBAAgB,EAAE,GAAG;QACrB,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,IAAI;KACb;IACD,GAAG,EAAE;QACH,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,KAAK;QAChB,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,GAAG;QACjB,gBAAgB,EAAE,GAAG;QACrB,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,IAAI;KACb;IACD,GAAG,EAAE;QACH,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,KAAK;QAChB,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,GAAG;QACjB,gBAAgB,EAAE,GAAG;QACrB,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,IAAI;KACb;IACD,GAAG,EAAE;QACH,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,KAAK;QAChB,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,GAAG;QACjB,gBAAgB,EAAE,GAAG;QACrB,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,IAAI;KACb;CACO,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BaseMediaConnection } from "./BaseMediaConnection.js";
|
|
2
|
+
export declare class StreamConnection extends BaseMediaConnection {
|
|
3
|
+
private _streamKey;
|
|
4
|
+
private _serverId;
|
|
5
|
+
setSpeaking(speaking: boolean): void;
|
|
6
|
+
get daveChannelId(): string;
|
|
7
|
+
get serverId(): string | null;
|
|
8
|
+
set serverId(id: string);
|
|
9
|
+
get streamKey(): string | null;
|
|
10
|
+
set streamKey(value: string);
|
|
11
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { VoiceOpCodes } from "../voice/VoiceOpCodes.js";
|
|
2
|
+
import { BaseMediaConnection } from "./BaseMediaConnection.js";
|
|
3
|
+
export class StreamConnection extends BaseMediaConnection {
|
|
4
|
+
_streamKey = null;
|
|
5
|
+
_serverId = null;
|
|
6
|
+
setSpeaking(speaking) {
|
|
7
|
+
if (!this.webRtcParams)
|
|
8
|
+
throw new Error("WebRTC connection not ready");
|
|
9
|
+
this.sendOpcode(VoiceOpCodes.SPEAKING, {
|
|
10
|
+
delay: 0,
|
|
11
|
+
speaking: speaking ? 2 : 0,
|
|
12
|
+
ssrc: this.webRtcParams.audioSsrc,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
get daveChannelId() {
|
|
16
|
+
if (this._serverId === null)
|
|
17
|
+
throw new Error("Server ID not set (this shouldn't happen)");
|
|
18
|
+
const channelId = BigInt(this._serverId) - 1n;
|
|
19
|
+
return channelId.toString();
|
|
20
|
+
}
|
|
21
|
+
get serverId() {
|
|
22
|
+
return this._serverId;
|
|
23
|
+
}
|
|
24
|
+
set serverId(id) {
|
|
25
|
+
this._serverId = id;
|
|
26
|
+
}
|
|
27
|
+
get streamKey() {
|
|
28
|
+
return this._streamKey;
|
|
29
|
+
}
|
|
30
|
+
set streamKey(value) {
|
|
31
|
+
this._streamKey = value;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=StreamConnection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StreamConnection.js","sourceRoot":"","sources":["../../../src/client/voice/StreamConnection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,OAAO,gBAAiB,SAAQ,mBAAmB;IAC/C,UAAU,GAAkB,IAAI,CAAC;IACjC,SAAS,GAAkB,IAAI,CAAC;IAExB,WAAW,CAAC,QAAiB;QAC3C,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACvE,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,EAAE;YACrC,KAAK,EAAE,CAAC;YACR,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS;SAClC,CAAC,CAAC;IACL,CAAC;IAED,IAAoB,aAAa;QAC/B,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI;YACzB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QAC9C,OAAO,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAED,IAAoB,QAAQ;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAW,QAAQ,CAAC,EAAU;QAC5B,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IAED,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IACD,IAAW,SAAS,CAAC,KAAa;QAChC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BaseMediaConnection } from "./BaseMediaConnection.js";
|
|
2
|
+
import type { StreamConnection } from "./StreamConnection.js";
|
|
3
|
+
export declare class VoiceConnection extends BaseMediaConnection {
|
|
4
|
+
streamConnection?: StreamConnection;
|
|
5
|
+
get daveChannelId(): string;
|
|
6
|
+
get serverId(): string;
|
|
7
|
+
stop(): void;
|
|
8
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BaseMediaConnection } from "./BaseMediaConnection.js";
|
|
2
|
+
export class VoiceConnection extends BaseMediaConnection {
|
|
3
|
+
streamConnection;
|
|
4
|
+
get daveChannelId() {
|
|
5
|
+
return this.channelId;
|
|
6
|
+
}
|
|
7
|
+
get serverId() {
|
|
8
|
+
return this.guildId ?? this.channelId; // for guild vc it is the guild id, for dm voice it is the channel id
|
|
9
|
+
}
|
|
10
|
+
stop() {
|
|
11
|
+
super.stop();
|
|
12
|
+
this.streamConnection?.stop();
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=VoiceConnection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VoiceConnection.js","sourceRoot":"","sources":["../../../src/client/voice/VoiceConnection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAG/D,MAAM,OAAO,eAAgB,SAAQ,mBAAmB;IAC/C,gBAAgB,CAAoB;IAE3C,IAAoB,aAAa;QAC/B,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAoB,QAAQ;QAC1B,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,qEAAqE;IAC9G,CAAC;IAEe,IAAI;QAClB,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import type { VoiceOpCodes } from "./VoiceOpCodes.js";
|
|
2
|
+
import type { SupportedEncryptionModes } from "../../utils.js";
|
|
3
|
+
type StreamInfo = {
|
|
4
|
+
active: boolean;
|
|
5
|
+
quality: number;
|
|
6
|
+
rid: string;
|
|
7
|
+
ssrc: number;
|
|
8
|
+
rtx_ssrc: number;
|
|
9
|
+
/**
|
|
10
|
+
* always "video" from what I observed
|
|
11
|
+
*/
|
|
12
|
+
type: string;
|
|
13
|
+
};
|
|
14
|
+
type SimulcastInfo = {
|
|
15
|
+
type: string;
|
|
16
|
+
rid: string;
|
|
17
|
+
quality: number;
|
|
18
|
+
};
|
|
19
|
+
type CodecPayloadType = {
|
|
20
|
+
name: string;
|
|
21
|
+
type: "audio";
|
|
22
|
+
priority: number;
|
|
23
|
+
payload_type: number;
|
|
24
|
+
} | {
|
|
25
|
+
name: string;
|
|
26
|
+
type: "video";
|
|
27
|
+
priority: number;
|
|
28
|
+
payload_type: number;
|
|
29
|
+
rtx_payload_type: number;
|
|
30
|
+
encode: boolean;
|
|
31
|
+
decode: boolean;
|
|
32
|
+
};
|
|
33
|
+
export declare namespace Message {
|
|
34
|
+
type Identify = {
|
|
35
|
+
server_id: string;
|
|
36
|
+
user_id: string;
|
|
37
|
+
session_id: string;
|
|
38
|
+
token: string;
|
|
39
|
+
video: boolean;
|
|
40
|
+
streams: SimulcastInfo[];
|
|
41
|
+
max_dave_protocol_version?: number;
|
|
42
|
+
};
|
|
43
|
+
type Resume = {
|
|
44
|
+
server_id: string;
|
|
45
|
+
session_id: string;
|
|
46
|
+
token: string;
|
|
47
|
+
seq_ack: number;
|
|
48
|
+
};
|
|
49
|
+
type Heartbeat = {
|
|
50
|
+
t: number;
|
|
51
|
+
seq_ack?: number;
|
|
52
|
+
};
|
|
53
|
+
type SelectProtocol = {
|
|
54
|
+
protocol: "udp";
|
|
55
|
+
codecs: CodecPayloadType[];
|
|
56
|
+
data: {
|
|
57
|
+
address: string;
|
|
58
|
+
port: number;
|
|
59
|
+
mode: SupportedEncryptionModes;
|
|
60
|
+
};
|
|
61
|
+
} | {
|
|
62
|
+
protocol: "webrtc";
|
|
63
|
+
codecs: CodecPayloadType[];
|
|
64
|
+
data: string;
|
|
65
|
+
sdp: string;
|
|
66
|
+
rtc_connection_id: string;
|
|
67
|
+
};
|
|
68
|
+
type Video = {
|
|
69
|
+
audio_ssrc: number;
|
|
70
|
+
video_ssrc: number;
|
|
71
|
+
rtx_ssrc: number;
|
|
72
|
+
streams: {
|
|
73
|
+
type: "video";
|
|
74
|
+
rid: string;
|
|
75
|
+
ssrc: number;
|
|
76
|
+
active: boolean;
|
|
77
|
+
quality: number;
|
|
78
|
+
rtx_ssrc: number;
|
|
79
|
+
max_bitrate: number;
|
|
80
|
+
max_framerate: number;
|
|
81
|
+
max_resolution: {
|
|
82
|
+
type: "fixed";
|
|
83
|
+
width: number;
|
|
84
|
+
height: number;
|
|
85
|
+
};
|
|
86
|
+
}[];
|
|
87
|
+
};
|
|
88
|
+
type Hello = {
|
|
89
|
+
heartbeat_interval: number;
|
|
90
|
+
};
|
|
91
|
+
type Ready = {
|
|
92
|
+
ssrc: number;
|
|
93
|
+
ip: string;
|
|
94
|
+
port: number;
|
|
95
|
+
modes: SupportedEncryptionModes[];
|
|
96
|
+
experiments: string[];
|
|
97
|
+
streams: StreamInfo[];
|
|
98
|
+
};
|
|
99
|
+
type Speaking = {
|
|
100
|
+
speaking: 0 | 1 | 2;
|
|
101
|
+
delay: number;
|
|
102
|
+
ssrc: number;
|
|
103
|
+
};
|
|
104
|
+
type SelectProtocolAck = {
|
|
105
|
+
audio_codec: string;
|
|
106
|
+
video_codec: string;
|
|
107
|
+
dave_protocol_version: number;
|
|
108
|
+
} & ({
|
|
109
|
+
secret_key: number[];
|
|
110
|
+
mode: string;
|
|
111
|
+
} | {
|
|
112
|
+
media_session_id: number;
|
|
113
|
+
sdp: string;
|
|
114
|
+
});
|
|
115
|
+
type HeartbeatAck = {
|
|
116
|
+
t: number;
|
|
117
|
+
};
|
|
118
|
+
type ClientsConnect = {
|
|
119
|
+
user_ids: string[];
|
|
120
|
+
};
|
|
121
|
+
type ClientDisconnect = {
|
|
122
|
+
user_id: string;
|
|
123
|
+
};
|
|
124
|
+
type DavePrepareTransition = {
|
|
125
|
+
transition_id: number;
|
|
126
|
+
protocol_version: number;
|
|
127
|
+
};
|
|
128
|
+
type DaveExecuteTransition = {
|
|
129
|
+
transition_id: number;
|
|
130
|
+
};
|
|
131
|
+
type DaveTransitionReady = {
|
|
132
|
+
transition_id: number;
|
|
133
|
+
};
|
|
134
|
+
type DavePrepareEpoch = {
|
|
135
|
+
epoch: number;
|
|
136
|
+
protocol_version: number;
|
|
137
|
+
};
|
|
138
|
+
type MlsInvalidCommitWelcome = {
|
|
139
|
+
transition_id: number;
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
export declare namespace GatewayResponse {
|
|
143
|
+
type Generic<Op extends VoiceOpCodes, T extends Record<string, unknown> | null> = {
|
|
144
|
+
op: Op;
|
|
145
|
+
d: T;
|
|
146
|
+
seq?: number;
|
|
147
|
+
};
|
|
148
|
+
export type Hello = Generic<VoiceOpCodes.HELLO, Message.Hello>;
|
|
149
|
+
export type Ready = Generic<VoiceOpCodes.READY, Message.Ready>;
|
|
150
|
+
export type Resumed = Generic<VoiceOpCodes.RESUMED, null>;
|
|
151
|
+
export type Speaking = Generic<VoiceOpCodes.SPEAKING, Message.Speaking>;
|
|
152
|
+
export type SelectProtocolAck = Generic<VoiceOpCodes.SELECT_PROTOCOL_ACK, Message.SelectProtocolAck>;
|
|
153
|
+
export type HeartbeatAck = Generic<VoiceOpCodes.HEARTBEAT_ACK, Message.HeartbeatAck>;
|
|
154
|
+
export type ClientsConnect = Generic<VoiceOpCodes.CLIENTS_CONNECT, Message.ClientsConnect>;
|
|
155
|
+
export type ClientDisconnect = Generic<VoiceOpCodes.CLIENT_DISCONNECT, Message.ClientDisconnect>;
|
|
156
|
+
export type DavePrepareTransition = Generic<VoiceOpCodes.DAVE_PREPARE_TRANSITION, Message.DavePrepareTransition>;
|
|
157
|
+
export type DaveExecuteTransition = Generic<VoiceOpCodes.DAVE_EXECUTE_TRANSITION, Message.DaveExecuteTransition>;
|
|
158
|
+
export type DavePrepareEpoch = Generic<VoiceOpCodes.DAVE_PREPARE_EPOCH, Message.DavePrepareEpoch>;
|
|
159
|
+
export {};
|
|
160
|
+
}
|
|
161
|
+
export type GatewayResponse = GatewayResponse.Hello | GatewayResponse.Ready | GatewayResponse.Resumed | GatewayResponse.Speaking | GatewayResponse.SelectProtocolAck | GatewayResponse.HeartbeatAck | GatewayResponse.ClientsConnect | GatewayResponse.ClientDisconnect | GatewayResponse.DavePrepareTransition | GatewayResponse.DaveExecuteTransition | GatewayResponse.DavePrepareEpoch;
|
|
162
|
+
export declare namespace GatewayRequest {
|
|
163
|
+
type Generic<Op extends VoiceOpCodes, T extends Record<string, unknown> | null> = {
|
|
164
|
+
op: Op;
|
|
165
|
+
d: T;
|
|
166
|
+
};
|
|
167
|
+
export type Identify = Generic<VoiceOpCodes.IDENTIFY, Message.Identify>;
|
|
168
|
+
export type Resume = Generic<VoiceOpCodes.RESUME, Message.Resume>;
|
|
169
|
+
export type Heartbeat = Generic<VoiceOpCodes.HEARTBEAT, Message.Heartbeat>;
|
|
170
|
+
export type SelectProtocol = Generic<VoiceOpCodes.SELECT_PROTOCOL, Message.SelectProtocol>;
|
|
171
|
+
export type Video = Generic<VoiceOpCodes.VIDEO, Message.Video>;
|
|
172
|
+
export type Speaking = Generic<VoiceOpCodes.SPEAKING, Message.Speaking>;
|
|
173
|
+
export type DaveTransitionReady = Generic<VoiceOpCodes.DAVE_TRANSITION_READY, Message.DaveTransitionReady>;
|
|
174
|
+
export type MlsInvalidCommitWelcome = Generic<VoiceOpCodes.MLS_INVALID_COMMIT_WELCOME, Message.MlsInvalidCommitWelcome>;
|
|
175
|
+
export {};
|
|
176
|
+
}
|
|
177
|
+
export type GatewayRequest = GatewayRequest.Identify | GatewayRequest.Resume | GatewayRequest.Heartbeat | GatewayRequest.SelectProtocol | GatewayRequest.Video | GatewayRequest.Speaking | GatewayRequest.DaveTransitionReady | GatewayRequest.MlsInvalidCommitWelcome;
|
|
178
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VoiceMessageTypes.js","sourceRoot":"","sources":["../../../src/client/voice/VoiceMessageTypes.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export declare enum VoiceOpCodes {
|
|
2
|
+
IDENTIFY = 0,
|
|
3
|
+
SELECT_PROTOCOL = 1,
|
|
4
|
+
READY = 2,
|
|
5
|
+
HEARTBEAT = 3,
|
|
6
|
+
SELECT_PROTOCOL_ACK = 4,
|
|
7
|
+
SPEAKING = 5,
|
|
8
|
+
HEARTBEAT_ACK = 6,
|
|
9
|
+
RESUME = 7,
|
|
10
|
+
HELLO = 8,
|
|
11
|
+
RESUMED = 9,
|
|
12
|
+
CLIENTS_CONNECT = 11,
|
|
13
|
+
VIDEO = 12,
|
|
14
|
+
CLIENT_DISCONNECT = 13,
|
|
15
|
+
SESSION_UPDATE = 14,
|
|
16
|
+
MEDIA_SINK_WANTS = 15,
|
|
17
|
+
VOICE_BACKEND_VERSION = 16,
|
|
18
|
+
CHANNEL_OPTIONS_UPDATE = 17,
|
|
19
|
+
FLAGS = 18,
|
|
20
|
+
SPEED_TEST = 19,
|
|
21
|
+
PLATFORM = 20,
|
|
22
|
+
DAVE_PREPARE_TRANSITION = 21,
|
|
23
|
+
DAVE_EXECUTE_TRANSITION = 22,
|
|
24
|
+
DAVE_TRANSITION_READY = 23,
|
|
25
|
+
DAVE_PREPARE_EPOCH = 24,
|
|
26
|
+
MLS_INVALID_COMMIT_WELCOME = 31
|
|
27
|
+
}
|
|
28
|
+
export declare enum VoiceOpCodesBinary {
|
|
29
|
+
MLS_EXTERNAL_SENDER = 25,
|
|
30
|
+
MLS_KEY_PACKAGE = 26,
|
|
31
|
+
MLS_PROPOSALS = 27,
|
|
32
|
+
MLS_COMMIT_WELCOME = 28,
|
|
33
|
+
MLS_ANNOUNCE_COMMIT_TRANSITION = 29,
|
|
34
|
+
MLS_WELCOME = 30
|
|
35
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export var VoiceOpCodes;
|
|
2
|
+
(function (VoiceOpCodes) {
|
|
3
|
+
VoiceOpCodes[VoiceOpCodes["IDENTIFY"] = 0] = "IDENTIFY";
|
|
4
|
+
VoiceOpCodes[VoiceOpCodes["SELECT_PROTOCOL"] = 1] = "SELECT_PROTOCOL";
|
|
5
|
+
VoiceOpCodes[VoiceOpCodes["READY"] = 2] = "READY";
|
|
6
|
+
VoiceOpCodes[VoiceOpCodes["HEARTBEAT"] = 3] = "HEARTBEAT";
|
|
7
|
+
VoiceOpCodes[VoiceOpCodes["SELECT_PROTOCOL_ACK"] = 4] = "SELECT_PROTOCOL_ACK";
|
|
8
|
+
VoiceOpCodes[VoiceOpCodes["SPEAKING"] = 5] = "SPEAKING";
|
|
9
|
+
VoiceOpCodes[VoiceOpCodes["HEARTBEAT_ACK"] = 6] = "HEARTBEAT_ACK";
|
|
10
|
+
VoiceOpCodes[VoiceOpCodes["RESUME"] = 7] = "RESUME";
|
|
11
|
+
VoiceOpCodes[VoiceOpCodes["HELLO"] = 8] = "HELLO";
|
|
12
|
+
VoiceOpCodes[VoiceOpCodes["RESUMED"] = 9] = "RESUMED";
|
|
13
|
+
VoiceOpCodes[VoiceOpCodes["CLIENTS_CONNECT"] = 11] = "CLIENTS_CONNECT";
|
|
14
|
+
VoiceOpCodes[VoiceOpCodes["VIDEO"] = 12] = "VIDEO";
|
|
15
|
+
VoiceOpCodes[VoiceOpCodes["CLIENT_DISCONNECT"] = 13] = "CLIENT_DISCONNECT";
|
|
16
|
+
VoiceOpCodes[VoiceOpCodes["SESSION_UPDATE"] = 14] = "SESSION_UPDATE";
|
|
17
|
+
VoiceOpCodes[VoiceOpCodes["MEDIA_SINK_WANTS"] = 15] = "MEDIA_SINK_WANTS";
|
|
18
|
+
VoiceOpCodes[VoiceOpCodes["VOICE_BACKEND_VERSION"] = 16] = "VOICE_BACKEND_VERSION";
|
|
19
|
+
VoiceOpCodes[VoiceOpCodes["CHANNEL_OPTIONS_UPDATE"] = 17] = "CHANNEL_OPTIONS_UPDATE";
|
|
20
|
+
VoiceOpCodes[VoiceOpCodes["FLAGS"] = 18] = "FLAGS";
|
|
21
|
+
VoiceOpCodes[VoiceOpCodes["SPEED_TEST"] = 19] = "SPEED_TEST";
|
|
22
|
+
VoiceOpCodes[VoiceOpCodes["PLATFORM"] = 20] = "PLATFORM";
|
|
23
|
+
VoiceOpCodes[VoiceOpCodes["DAVE_PREPARE_TRANSITION"] = 21] = "DAVE_PREPARE_TRANSITION";
|
|
24
|
+
VoiceOpCodes[VoiceOpCodes["DAVE_EXECUTE_TRANSITION"] = 22] = "DAVE_EXECUTE_TRANSITION";
|
|
25
|
+
VoiceOpCodes[VoiceOpCodes["DAVE_TRANSITION_READY"] = 23] = "DAVE_TRANSITION_READY";
|
|
26
|
+
VoiceOpCodes[VoiceOpCodes["DAVE_PREPARE_EPOCH"] = 24] = "DAVE_PREPARE_EPOCH";
|
|
27
|
+
VoiceOpCodes[VoiceOpCodes["MLS_INVALID_COMMIT_WELCOME"] = 31] = "MLS_INVALID_COMMIT_WELCOME";
|
|
28
|
+
})(VoiceOpCodes || (VoiceOpCodes = {}));
|
|
29
|
+
export var VoiceOpCodesBinary;
|
|
30
|
+
(function (VoiceOpCodesBinary) {
|
|
31
|
+
VoiceOpCodesBinary[VoiceOpCodesBinary["MLS_EXTERNAL_SENDER"] = 25] = "MLS_EXTERNAL_SENDER";
|
|
32
|
+
VoiceOpCodesBinary[VoiceOpCodesBinary["MLS_KEY_PACKAGE"] = 26] = "MLS_KEY_PACKAGE";
|
|
33
|
+
VoiceOpCodesBinary[VoiceOpCodesBinary["MLS_PROPOSALS"] = 27] = "MLS_PROPOSALS";
|
|
34
|
+
VoiceOpCodesBinary[VoiceOpCodesBinary["MLS_COMMIT_WELCOME"] = 28] = "MLS_COMMIT_WELCOME";
|
|
35
|
+
VoiceOpCodesBinary[VoiceOpCodesBinary["MLS_ANNOUNCE_COMMIT_TRANSITION"] = 29] = "MLS_ANNOUNCE_COMMIT_TRANSITION";
|
|
36
|
+
VoiceOpCodesBinary[VoiceOpCodesBinary["MLS_WELCOME"] = 30] = "MLS_WELCOME";
|
|
37
|
+
})(VoiceOpCodesBinary || (VoiceOpCodesBinary = {}));
|
|
38
|
+
//# sourceMappingURL=VoiceOpCodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VoiceOpCodes.js","sourceRoot":"","sources":["../../../src/client/voice/VoiceOpCodes.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,YA0BX;AA1BD,WAAY,YAAY;IACtB,uDAAY,CAAA;IACZ,qEAAmB,CAAA;IACnB,iDAAS,CAAA;IACT,yDAAa,CAAA;IACb,6EAAuB,CAAA;IACvB,uDAAY,CAAA;IACZ,iEAAiB,CAAA;IACjB,mDAAU,CAAA;IACV,iDAAS,CAAA;IACT,qDAAW,CAAA;IACX,sEAAoB,CAAA;IACpB,kDAAU,CAAA;IACV,0EAAsB,CAAA;IACtB,oEAAmB,CAAA;IACnB,wEAAqB,CAAA;IACrB,kFAA0B,CAAA;IAC1B,oFAA2B,CAAA;IAC3B,kDAAU,CAAA;IACV,4DAAe,CAAA;IACf,wDAAa,CAAA;IACb,sFAA4B,CAAA;IAC5B,sFAA4B,CAAA;IAC5B,kFAA0B,CAAA;IAC1B,4EAAuB,CAAA;IACvB,4FAA+B,CAAA;AACjC,CAAC,EA1BW,YAAY,KAAZ,YAAY,QA0BvB;AAED,MAAM,CAAN,IAAY,kBAOX;AAPD,WAAY,kBAAkB;IAC5B,0FAAwB,CAAA;IACxB,kFAAoB,CAAA;IACpB,8EAAkB,CAAA;IAClB,wFAAuB,CAAA;IACvB,gHAAmC,CAAA;IACnC,0EAAgB,CAAA;AAClB,CAAC,EAPW,kBAAkB,KAAlB,kBAAkB,QAO7B"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { PeerConnection } from "@lng2004/node-datachannel";
|
|
2
|
+
import type { BaseMediaConnection } from "./BaseMediaConnection.js";
|
|
3
|
+
export declare class WebRtcConnWrapper {
|
|
4
|
+
private _mediaConn;
|
|
5
|
+
private _webRtcConn?;
|
|
6
|
+
private _audioDef;
|
|
7
|
+
private _videoDef;
|
|
8
|
+
private _audioTrack?;
|
|
9
|
+
private _videoTrack?;
|
|
10
|
+
private _audioPacketizer?;
|
|
11
|
+
private _videoPacketizer?;
|
|
12
|
+
private _videoCodec?;
|
|
13
|
+
constructor(mediaConn: BaseMediaConnection);
|
|
14
|
+
initWebRtc(): PeerConnection;
|
|
15
|
+
private _setMediaHandler;
|
|
16
|
+
close(): void;
|
|
17
|
+
get webRtcConn(): PeerConnection | undefined;
|
|
18
|
+
get ready(): boolean;
|
|
19
|
+
get mediaConnection(): BaseMediaConnection;
|
|
20
|
+
sendAudioFrame(frame: Buffer, frametime: number): void;
|
|
21
|
+
sendVideoFrame(frame: Buffer, frametime: number): void;
|
|
22
|
+
setPacketizer(videoCodec: string): void;
|
|
23
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { PeerConnection, Audio, Video, PacingHandler, RtpPacketizer, H264RtpPacketizer, H265RtpPacketizer, AV1RtpPacketizer, RtpPacketizationConfig, RtcpNackResponder, RtcpSrReporter, } from "@lng2004/node-datachannel";
|
|
2
|
+
import { CodecPayloadType } from "./CodecPayloadType.js";
|
|
3
|
+
import { normalizeVideoCodec } from "../../utils.js";
|
|
4
|
+
import { splitNalu, H264Helpers, H264NalUnitTypes, startCode3, } from "../processing/AnnexBHelper.js";
|
|
5
|
+
import { rewriteSPSVUI } from "../processing/SPSVUIRewriter.js";
|
|
6
|
+
export class WebRtcConnWrapper {
|
|
7
|
+
_mediaConn;
|
|
8
|
+
_webRtcConn;
|
|
9
|
+
_audioDef;
|
|
10
|
+
_videoDef;
|
|
11
|
+
_audioTrack;
|
|
12
|
+
_videoTrack;
|
|
13
|
+
_audioPacketizer;
|
|
14
|
+
_videoPacketizer;
|
|
15
|
+
_videoCodec;
|
|
16
|
+
constructor(mediaConn) {
|
|
17
|
+
this._mediaConn = mediaConn;
|
|
18
|
+
this._audioDef = new Audio("0", "SendRecv");
|
|
19
|
+
this._videoDef = new Video("1", "SendRecv");
|
|
20
|
+
this._audioDef.addOpusCodec(CodecPayloadType.opus.payload_type);
|
|
21
|
+
for (const { name, payload_type, rtx_payload_type, clockRate, } of Object.values(CodecPayloadType).filter((el) => el.type === "video")) {
|
|
22
|
+
switch (name) {
|
|
23
|
+
case "H264":
|
|
24
|
+
this._videoDef.addH264Codec(payload_type);
|
|
25
|
+
break;
|
|
26
|
+
case "H265":
|
|
27
|
+
this._videoDef.addH265Codec(payload_type);
|
|
28
|
+
break;
|
|
29
|
+
case "VP8":
|
|
30
|
+
this._videoDef.addVP8Codec(payload_type);
|
|
31
|
+
break;
|
|
32
|
+
case "VP9":
|
|
33
|
+
this._videoDef.addVP9Codec(payload_type);
|
|
34
|
+
break;
|
|
35
|
+
case "AV1":
|
|
36
|
+
this._videoDef.addAV1Codec(payload_type);
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
this._videoDef.addRTXCodec(rtx_payload_type, payload_type, clockRate);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
initWebRtc() {
|
|
43
|
+
this._webRtcConn = new PeerConnection("", {
|
|
44
|
+
iceServers: ["stun:stun.l.google.com:19302"],
|
|
45
|
+
});
|
|
46
|
+
this._audioTrack = this._webRtcConn.addTrack(this._audioDef);
|
|
47
|
+
this._videoTrack = this._webRtcConn.addTrack(this._videoDef);
|
|
48
|
+
this._setMediaHandler();
|
|
49
|
+
return this._webRtcConn;
|
|
50
|
+
}
|
|
51
|
+
_setMediaHandler() {
|
|
52
|
+
if (this._audioPacketizer)
|
|
53
|
+
this._audioTrack?.setMediaHandler(this._audioPacketizer);
|
|
54
|
+
if (this._videoPacketizer)
|
|
55
|
+
this._videoTrack?.setMediaHandler(this._videoPacketizer);
|
|
56
|
+
}
|
|
57
|
+
close() {
|
|
58
|
+
this._webRtcConn?.close();
|
|
59
|
+
}
|
|
60
|
+
get webRtcConn() {
|
|
61
|
+
return this._webRtcConn;
|
|
62
|
+
}
|
|
63
|
+
get ready() {
|
|
64
|
+
return this._webRtcConn?.state() === "connected";
|
|
65
|
+
}
|
|
66
|
+
get mediaConnection() {
|
|
67
|
+
return this._mediaConn;
|
|
68
|
+
}
|
|
69
|
+
sendAudioFrame(frame, frametime) {
|
|
70
|
+
if (!this.ready)
|
|
71
|
+
return;
|
|
72
|
+
if (!this._audioPacketizer)
|
|
73
|
+
return;
|
|
74
|
+
const { rtpConfig } = this._audioPacketizer;
|
|
75
|
+
const { clockRate } = rtpConfig;
|
|
76
|
+
if (this.mediaConnection.daveReady)
|
|
77
|
+
frame = this.mediaConnection.daveSession.encryptOpus(frame);
|
|
78
|
+
this._audioTrack?.sendMessageBinary(frame);
|
|
79
|
+
rtpConfig.timestamp += Math.round((frametime * clockRate) / 1000);
|
|
80
|
+
}
|
|
81
|
+
sendVideoFrame(frame, frametime) {
|
|
82
|
+
if (!this.ready)
|
|
83
|
+
return;
|
|
84
|
+
if (!this._videoPacketizer)
|
|
85
|
+
return;
|
|
86
|
+
const { rtpConfig } = this._videoPacketizer;
|
|
87
|
+
const { clockRate } = rtpConfig;
|
|
88
|
+
if (this._videoCodec === "H264") {
|
|
89
|
+
let spsRewritten = false;
|
|
90
|
+
const nalus = splitNalu(frame).map((el) => {
|
|
91
|
+
if (H264Helpers.getUnitType(el) === H264NalUnitTypes.SPS) {
|
|
92
|
+
spsRewritten = true;
|
|
93
|
+
return rewriteSPSVUI(el);
|
|
94
|
+
}
|
|
95
|
+
return el;
|
|
96
|
+
});
|
|
97
|
+
if (spsRewritten)
|
|
98
|
+
frame = Buffer.concat(nalus.flatMap((el) => [startCode3, el]));
|
|
99
|
+
}
|
|
100
|
+
if (this.mediaConnection.daveReady) {
|
|
101
|
+
let daveCodec = 0 /* Codec.UNKNOWN */;
|
|
102
|
+
switch (this._videoCodec) {
|
|
103
|
+
case "H264":
|
|
104
|
+
daveCodec = 4 /* Codec.H264 */;
|
|
105
|
+
break;
|
|
106
|
+
case "H265":
|
|
107
|
+
daveCodec = 5 /* Codec.H265 */;
|
|
108
|
+
break;
|
|
109
|
+
case "VP8":
|
|
110
|
+
daveCodec = 2 /* Codec.VP8 */;
|
|
111
|
+
break;
|
|
112
|
+
case "VP9":
|
|
113
|
+
daveCodec = 3 /* Codec.VP9 */;
|
|
114
|
+
break;
|
|
115
|
+
case "AV1":
|
|
116
|
+
daveCodec = 6 /* Codec.AV1 */;
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
frame = this.mediaConnection.daveSession.encrypt(1 /* MediaType.VIDEO */, daveCodec, frame);
|
|
120
|
+
}
|
|
121
|
+
this._videoTrack?.sendMessageBinary(frame);
|
|
122
|
+
rtpConfig.timestamp += Math.round((frametime * clockRate) / 1000);
|
|
123
|
+
}
|
|
124
|
+
setPacketizer(videoCodec) {
|
|
125
|
+
if (!this.mediaConnection.webRtcParams)
|
|
126
|
+
throw new Error("WebRTC connection not ready");
|
|
127
|
+
const { audioSsrc, videoSsrc } = this.mediaConnection.webRtcParams;
|
|
128
|
+
const rtpConfigAudio = new RtpPacketizationConfig(audioSsrc, "", CodecPayloadType.opus.payload_type, CodecPayloadType.opus.clockRate);
|
|
129
|
+
rtpConfigAudio.playoutDelayId = 5;
|
|
130
|
+
rtpConfigAudio.playoutDelayMin = 0;
|
|
131
|
+
rtpConfigAudio.playoutDelayMax = 1;
|
|
132
|
+
this._audioPacketizer = new RtpPacketizer(rtpConfigAudio);
|
|
133
|
+
this._audioPacketizer.addToChain(new RtcpSrReporter(rtpConfigAudio));
|
|
134
|
+
this._audioPacketizer.addToChain(new RtcpNackResponder());
|
|
135
|
+
this._videoCodec = normalizeVideoCodec(videoCodec);
|
|
136
|
+
const rtpConfigVideo = new RtpPacketizationConfig(videoSsrc, "", CodecPayloadType[this._videoCodec].payload_type, CodecPayloadType[this._videoCodec].clockRate);
|
|
137
|
+
rtpConfigVideo.playoutDelayId = 5;
|
|
138
|
+
rtpConfigVideo.playoutDelayMin = 0;
|
|
139
|
+
rtpConfigVideo.playoutDelayMax = 10;
|
|
140
|
+
switch (this._videoCodec) {
|
|
141
|
+
case "H264":
|
|
142
|
+
this._videoPacketizer = new H264RtpPacketizer("StartSequence", rtpConfigVideo);
|
|
143
|
+
break;
|
|
144
|
+
case "H265":
|
|
145
|
+
this._videoPacketizer = new H265RtpPacketizer("StartSequence", rtpConfigVideo);
|
|
146
|
+
break;
|
|
147
|
+
case "AV1":
|
|
148
|
+
this._videoPacketizer = new AV1RtpPacketizer("Obu", rtpConfigVideo);
|
|
149
|
+
break;
|
|
150
|
+
default:
|
|
151
|
+
throw new Error(`Packetizer not implemented for ${this._videoCodec}`);
|
|
152
|
+
}
|
|
153
|
+
this._videoPacketizer.addToChain(new RtcpSrReporter(rtpConfigVideo));
|
|
154
|
+
this._videoPacketizer.addToChain(new RtcpNackResponder());
|
|
155
|
+
// this._videoPacketizer.addToChain(new PacingHandler(25 * 1000 * 1000, 1));
|
|
156
|
+
this._setMediaHandler();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=WebRtcWrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebRtcWrapper.js","sourceRoot":"","sources":["../../../src/client/voice/WebRtcWrapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/voice/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,iCAAiC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { BaseMediaStream } from "./BaseMediaStream.js";
|
|
2
|
+
import type { WebRtcConnWrapper } from "../client/voice/WebRtcWrapper.js";
|
|
3
|
+
export declare class AudioStream extends BaseMediaStream {
|
|
4
|
+
private _conn;
|
|
5
|
+
constructor(conn: WebRtcConnWrapper, noSleep?: boolean);
|
|
6
|
+
protected _sendFrame(frame: Buffer, frametime: number): Promise<void>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseMediaStream } from "./BaseMediaStream.js";
|
|
2
|
+
export class AudioStream extends BaseMediaStream {
|
|
3
|
+
_conn;
|
|
4
|
+
constructor(conn, noSleep = false) {
|
|
5
|
+
super("audio", noSleep);
|
|
6
|
+
this._conn = conn;
|
|
7
|
+
}
|
|
8
|
+
async _sendFrame(frame, frametime) {
|
|
9
|
+
this._conn.sendAudioFrame(frame, frametime);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=AudioStream.js.map
|