diff --git a/package.json b/package.json index 0cd570a1459..034a3b599f3 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ ], "dependencies": { "@babel/runtime": "^7.12.5", + "@types/sdp-transform": "^2.4.5", "another-json": "^0.2.0", "browser-request": "^0.3.3", "bs58": "^4.0.1", @@ -63,6 +64,7 @@ "p-retry": "^4.5.0", "qs": "^6.9.6", "request": "^2.88.2", + "sdp-transform": "^2.14.1", "unhomoglyph": "^1.0.6" }, "devDependencies": { diff --git a/src/webrtc/call.ts b/src/webrtc/call.ts index 2539eaaa291..288bc92c976 100644 --- a/src/webrtc/call.ts +++ b/src/webrtc/call.ts @@ -22,6 +22,8 @@ limitations under the License. * @module webrtc/call */ +import { parse as parseSdp, write as writeSdp } from "sdp-transform"; + import { logger } from '../logger'; import * as utils from '../utils'; import { MatrixEvent } from '../models/event'; @@ -171,6 +173,11 @@ export enum CallErrorCode { */ CreateAnswer = 'create_answer', + /** + * An offer could not be created + */ + CreateOffer = 'create_offer', + /** * Error code used when we fail to send the answer * for some reason other than there being unknown devices @@ -1438,6 +1445,31 @@ export class MatrixCall extends TypedEventEmitter { + if (media.type === "audio") { + media.fmtp.forEach(fmtp => fmtp.config += ";usedtx=1"); + } + }); + description.sdp = writeSdp(sdp); + } + + private async createOffer(): Promise { + const offer = await this.peerConn.createOffer(); + this.enableDtx(offer); + return offer; + } + + private async createAnswer(): Promise { + const answer = await this.peerConn.createAnswer(); + this.enableDtx(answer); + return answer; + } + private async gotCallFeedsForAnswer(callFeeds: CallFeed[]): Promise { if (this.callHasEnded()) return; @@ -1449,10 +1481,10 @@ export class MatrixCall extends TypedEventEmitter { this.makingOffer = true; try { - this.getRidOfRTXCodecs(); await this.gotLocalOffer(); } catch (e) { this.getLocalOfferFailed(e); @@ -1766,8 +1806,18 @@ export class MatrixCall extends TypedEventEmitter