---
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:
      description:
        type: object
        title: Description
        description: The session description object
        properties:
          type:
            type: string
            enum:
            - offer
            - answer
            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 negotiation is valid for.
          Once the negotiation age exceeds this value, clients should discard it.
      sdp_stream_metadata:
        $ref: components/sdp_stream_metadata.yaml
    required:
    - description
    - lifetime
  type:
    type: string
    enum:
    - m.call.negotiate

