--- type: object description: | Provides SDP negotiation semantics for media pause, hold/resume, ICE restarts and voice/video call up/downgrading. Clients should implement and honour hold functionality as per [WebRTC's recommendation](https://www.w3.org/TR/webrtc/#hold-functionality). If both the invite event and the accepted answer event have `version` equal to `"1"`, either party may send `m.call.negotiate` with a `description` field to offer new SDP to the other party. This event has `call_id` with the ID of the call and `party_id` equal to the client's party ID for that call. The caller ignores any negotiate events with `party_id` + `user_id` tuple not equal to that of the answer it accepted and the callee ignores any negotiate events with `party_id` + `user_id` tuple not equal to that of the caller. Clients should use the `party_id` field to ignore the remote echo of their own negotiate events. This has a `lifetime` field as in `m.call.invite`, after which the sender of the negotiate event should consider the negotiation failed (timed out) and the recipient should ignore it. The `description` field is the same as the `offer` field in `m.call.invite` and `answer` field in `m.call.answer` and is an `RTCSessionDescriptionInit` object as per https://www.w3.org/TR/webrtc/#dom-rtcsessiondescriptioninit. Once an `m.call.negotiate` event is received, the client must respond with another `m.call.negotiate` event, with the SDP answer (with `"type": "answer"`) in the `description` property. In the `m.call.invite` and `m.call.answer` events, the `offer` and `answer` fields respectively are objects of type `RTCSessionDescriptionInit`. Hence the `type` field, whilst redundant in these events, is included for ease of working with the WebRTC API and is mandatory. Receiving clients should not attempt to validate the `type` field, but simply pass the object into the WebRTC API. x-addedInMatrixVersion: "1.7" allOf: - "$ref": core-event-schema/room_event.yaml properties: content: type: object allOf: - "$ref": core-event-schema/call_event.yaml properties: offer: type: object title: Offer description: The session description object properties: type: type: string enum: - offer description: The type of session description. sdp: type: string description: The SDP text of the session description. required: - type - sdp lifetime: type: integer description: The time in milliseconds that the invite is valid for. Once the invite age exceeds this value, clients should discard it. They should also no longer show the call as awaiting an answer in the UI. required: - offer - lifetime type: type: string enum: - m.call.negotiate