aboutsummaryrefslogtreecommitdiff
path: root/cast/protocol/castv2/streaming_schema.json
blob: 4c78d5264a07a9a159733e04fa7bb4ffeb866e61 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://something/streaming_schema.json",
  "definitions": {
    "ssrc": {"type": "integer", "minimum": 0, "maximum": 4294967295},
    "delay": {"type": "integer", "minimum": 1, "maximum": 4000},
    "resolution": {
      "width": {"type": "integer", "minimum": 320},
      "height": {"type": "integer", "minimum": 240}
    },
    "frame_rate": {
      "type": "string",
      "pattern": "[0-9]+(/[0-9]+)?",
      "examples": ["30", "30000/1001"]
    },
    "dimensions": {
      "allOf": [
        {"$ref": "#/definitions/resolution"},
        {"properties": {"frameRate": {"$ref": "#/definitions/frame_rate"}}}
      ]
    },
    "rtp_extensions": {
      "type": "array",
      "items": {"type": "string", "enum": ["adaptive_playout_delay"]}
    },
    "stream": {
      "properties": {
        "index": {"type": "integer", "minimum": 0},
        "type": {"type": "string", "enum": ["audio_source", "video_source"]},
        "codecName": {"type": "string", "enum": ["aac", "opus", "h264", "vp8", "hevc", "vp9", "av1"]},
        "codecParameter": {"type": "string"},
        "rtpProfile": {"type": "string", "enum": ["cast"]},
        "rtpPayloadType": {"type": "integer", "minimum": 96, "maximum": 127},
        "ssrc": {"$ref": "#/definitions/ssrc"},
        "targetDelay": {"$ref": "#/definitions/delay"},
        "aesKey": {"type": "string", "pattern": "[0-9a-fA-F]{32}"},
        "aesIvMask": {"type": "string", "pattern": "[0-9a-fA-F]{32}"},
        "receiverRtcpEventLog": {"type": "boolean"},
        "receiverRtcpDscp": {"type": "integer", "minimum": 0, "default": 46},
        "rtpExtensions": {"$ref": "#/definitions/rtp_extensions"},
        "timeBase": {
          "type": "string",
          "pattern": "1/[0-9]+",
          "default": "1/90000"
        }
      },
      "required": [
        "index",
        "type",
        "codecName",
        "rtpPayloadType",
        "ssrc",
        "aesKey",
        "aesIvMask",
        "timeBase"
      ]
    },
    "audio_stream": {
      "allOf": [
        {"$ref": "#/definitions/stream"},
        {
          "properties": {
            "bitRate": {"type": "integer", "minimum": 0},
            "channels": {"type": "integer", "minimum": 1}
          },
          "required": ["bitRate", "channels"]
        }
      ]
    },
    "video_stream": {
      "allOf": [
        {"$ref": "#/definitions/stream"},
        {
          "properties": {
            "maxFrameRate": {"$ref": "#/definitions/frame_rate"},
            "maxBitRate": {"type": "integer", "minimum": 0},
            "resolutions": {
              "type": "array",
              "items": {"$ref": "#/definitions/resolution"}
            },
            "errorRecoveryMode": {
              "type": "string",
              "enum": ["castv2", "intra_mb_refresh"],
              "default": "castv2"
            }
          },
          "required": ["maxFrameRate", "maxBitRate", "resolutions"]
        }
      ]
    },
    "offer": {
      "properties": {
        "supportedStreams": {
          "type": "array",
          "items": {"$ref": "#/definitions/stream"}
        },
        "castMode": {"type": "string", "enum": ["mirroring", "remoting"]},
        "receiverStatus": {"type": "boolean"}
      }
    },
    "audio_constraints": {
      "properties": {
        "maxSampleRate": {
          "type": "integer",
          "minimum": 16000,
          "default": 48000,
          "maximum": 96000
        },
        "maxChannels": {"type": "integer", "minimum": 1, "default": 2},
        "minBitRate": {"type": "integer", "minimum": 32000, "maximum": 320000},
        "maxBitRate": {"type": "integer", "minimum": 32000, "maximum": 320000},
        "maxDelay": {"$ref": "#/definitions/delay"}
      },
      "required": ["maxSampleRate", "maxChannels", "maxBitRate"]
    },
    "video_constraints": {
      "properties": {
        "maxPixelsPerSecond": {"type": "number", "minimum": 0},
        "minResolution": {"$ref": "#/definitions/resolution"},
        "maxDimensions": {"$ref": "#/definitions/dimensions"},
        "minBitRate": {"type": "integer", "minimum": 300000},
        "maxBitRate": {"type": "integer", "minimum": 300000},
        "maxDelay": {"$ref": "#/definitions/delay"}
      },
      "required": ["maxDimensions", "maxBitRate"]
    },
    "constraints": {
      "properties": {
        "audio": {"$ref": "#/definitions/audio_constraints"},
        "video": {"$ref": "#/definitions/video_constraints"}
      },
      "required": ["audio", "video"]
    },
    "display": {
      "$id": "#display",
      "properties": {
        "dimensions": {"$ref": "#/definitions/dimensions"},
        "aspectRatio": {"type": "string", "pattern": "[0-9]+:[0-9]+"},
        "scaling": {"type": "string", "enum": ["sender", "receiver"]}
      },
      "required": []
    },
    "error": {
      "properties": {
        "code": {"type": "integer"},
        "description": {"type": "string"}
      },
      "required": ["code", "description"]
    },
    "answer": {
      "type": "object",
      "properties": {
        "udpPort": {"type": "integer", "minimum": 1, "maximum": 65535},
        "sendIndexes": {
          "type": "array",
          "items": {"type": "integer", "minimum": 0}
        },
        "ssrcs": {"type": "array", "items": {"$ref": "#/definitions/ssrc"}},
        "constraints": {"$ref": "#/definitions/constraints"},
        "display": {"$ref": "#/definitions/display"},
        "receiverRtcpEventLog": {
          "type": "array",
          "items": {"type": "integer", "minimum": 0}
        },
        "receiverRtcpDscp": {
          "type": "array",
          "items": {"type": "integer", "minimum": 0}
        },
        "rtpExtensions": {"$ref": "#/definitions/rtp_extensions"}
      },
      "required": ["udpPort", "sendIndexes", "ssrcs"]
    },
    "capabilities": {
      "$id": "#capabilities",
      "type": "object",
      "properties": {
        "mediaCaps": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "audio",
              "aac",
              "opus",
              "video",
              "4k",
              "h264",
              "vp8",
              "hevc",
              "vp9"
            ]
          }
        },
        "remoting": {"type": "integer"}
      },
      "required": ["mediaCaps"]
    }
  },
  "type": "object",
  "properties": {
    "offer": {"$ref": "#/definitions/offer"},
    "answer": {"$ref": "#/definitions/answer"},
    "capabilities": {"$ref": "#/definitions/capabilities"},
    "error": {"$ref": "#/definitions/error"},
    "result": {"type": "string", "enum": ["ok", "error"]},
    "seqNum": {"type": "integer", "minimum": 0},
    "sessionId": {"type": "integer"},
    "type": {
      "type": "string",
      "enum": [
        "OFFER",
        "ANSWER",
        "GET_STATUS",
        "STATUS_RESPONSE",
        "GET_CAPABILITIES",
        "CAPABILITIES_RESPONSE",
        "RPC"
      ]
    }
  },
  "required": ["type"],
  "allOf": [
    {
      "if": {
        "properties": {
          "type": {
            "enum": ["ANSWER", "CAPABILITIES_RESPONSE", "STATUS_RESPONSE"]
          }
        }
      },
      "then": {"required": ["result"]}
    },
    {
      "if": {
        "properties": {
          "type": {
            "enum": [
              "OFFER",
              "ANSWER",
              "GET_CAPABILITIES",
              "CAPABILITIES_RESPONSE",
              "GET_STATUS",
              "STATUS_RESPONSE"
            ]
          }
        }
      },
      "then": {"required": ["seqNum"]}
    },
    {
      "if": {"properties": {"type": {"const": "OFFER"}}},
      "then": {"required": ["offer"]}
    },
    {
      "if": {
        "properties": {"type": {"const": "ANSWER"}, "result": {"const": "ok"}}
      },
      "then": {"required": ["answer"]}
    },
    {
      "if": {
        "properties": {
          "type": {"const": "CAPABILITIES_RESPONSE"},
          "result": {"const": "ok"}
        }
      },
      "then": {"required": ["capabilities"]}
    },
    {
      "if": {
        "properties": {"type": {"const": "RPC"}, "result": {"const": "ok"}}
      },
      "then": {"required": ["rpc"]}
    }
  ]
}