@stinkycomputing/sesame-api-client 1.4.1-beta.9 → 1.4.2-alpha.1

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.
@@ -1,3 +1,6 @@
1
+ <!-- Generated from .proto files — do not edit manually. -->
2
+ <!-- Regenerate: cmake --build build --target proto-docs -->
3
+
1
4
  # Sesame Protocol Reference
2
5
 
3
6
  Complete reference for all protobuf types available through `@stinkycomputing/sesame-api-client`.
@@ -11,97 +14,307 @@ import { sesame } from '@stinkycomputing/sesame-api-client';
11
14
 
12
15
  ## Table of Contents
13
16
 
14
- - [Wire Protocol](#wire-protocol) — `sesame.v1.wire`
15
- - [Common Types](#common-types) — `sesame.v1.common`
16
- - [RPC Envelope](#rpc-envelope) — `sesame.v1.rpc`
17
- - [Commands](#commands) — `sesame.v1.commands`
18
- - [Sources](#sources) — `sesame.v1.sources`
19
- - [Outputs](#outputs) — `sesame.v1.outputs`
20
- - [Compositor & Scene Graph](#compositor--scene-graph) — `sesame.v1.compositor`
21
- - [Audio Mixer](#audio-mixer) — `sesame.v1.audio`
22
- - [Recorder](#recorder) — `sesame.v1.recorder`
23
- - [Jobs](#jobs) — `sesame.v1.jobs`
24
- - [Status & Events](#status--events) — `sesame.v1.status`
25
- - [Statistics](#statistics) — `sesame.v1.status` (statistics)
26
- - [Service Methods](#service-methods)
17
+ - [sesame/v1/audio/audio_mixer.proto](#sesame_v1_audio_audio_mixer-proto)
18
+ - [sesame/v1/commands/commands.proto](#sesame_v1_commands_commands-proto)
19
+ - [sesame/v1/common/common.proto](#sesame_v1_common_common-proto)
20
+ - [sesame/v1/compositor/compositor.proto](#sesame_v1_compositor_compositor-proto)
21
+ - [sesame/v1/jobs/jobs.proto](#sesame_v1_jobs_jobs-proto)
22
+ - [sesame/v1/outputs/output.proto](#sesame_v1_outputs_output-proto)
23
+ - [sesame/v1/recorder/recorder.proto](#sesame_v1_recorder_recorder-proto)
24
+ - [sesame/v1/rpc/rpc.proto](#sesame_v1_rpc_rpc-proto)
25
+ - [sesame/v1/rpc/service.proto](#sesame_v1_rpc_service-proto)
26
+ - [sesame/v1/sources/source.proto](#sesame_v1_sources_source-proto)
27
+ - [sesame/v1/status/statistics.proto](#sesame_v1_status_statistics-proto)
28
+ - [sesame/v1/status/status.proto](#sesame_v1_status_status-proto)
29
+ - [sesame/v1/wire/wire.proto](#sesame_v1_wire_wire-proto)
27
30
  - [Event Subscriptions](#event-subscriptions)
28
31
  - [Scene Graph Properties](#scene-graph-properties)
29
32
 
30
33
  ---
31
34
 
32
- ## Wire Protocol
33
35
 
34
- `sesame.v1.wire`
36
+ ## sesame/v1/audio/audio_mixer.proto
35
37
 
36
- Every WebSocket message is framed as:
38
+ `sesame.v1.audio`
37
39
 
38
- ```
39
- [4-byte LE header_size][FrameHeader protobuf][payload bytes]
40
- ```
41
40
 
42
- ### FrameType
41
+
42
+
43
+ ### AudioMixerChannelType
44
+
45
+ Audio mixer channel type.
43
46
 
44
47
  | Value | Name | Description |
45
48
  |-------|------|-------------|
46
- | 0 | `FRAME_TYPE_UNSPECIFIED` | Invalid |
47
- | 1 | `FRAME_TYPE_RPC` | Request/response RPC and events |
48
- | 2 | `FRAME_TYPE_VIDEO` | Live video frames |
49
- | 3 | `FRAME_TYPE_AUDIO` | Live audio frames |
50
- | 4 | `FRAME_TYPE_MUXED` | Muxed audio+video data |
51
- | 5 | `FRAME_TYPE_DECODER_DATA` | Codec init data (SPS/PPS) |
52
- | 6 | `FRAME_TYPE_DATA` | Live metadata streams |
49
+ | 0 | `AUDIO_MIXER_CHANNEL_TYPE_UNSPECIFIED` | Unspecified (invalid) |
50
+ | 1 | `AUDIO_MIXER_CHANNEL_TYPE_MONO` | Mono channel |
51
+ | 2 | `AUDIO_MIXER_CHANNEL_TYPE_STEREO` | Stereo channel |
53
52
 
54
- ### CodecType
55
53
 
56
- | Value | Name |
57
- |-------|------|
58
- | 0 | `CODEC_TYPE_UNSPECIFIED` |
59
- | 1 | `CODEC_TYPE_VIDEO_VP8` |
60
- | 2 | `CODEC_TYPE_VIDEO_VP9` |
61
- | 3 | `CODEC_TYPE_VIDEO_AVC` |
62
- | 4 | `CODEC_TYPE_VIDEO_HEVC` |
63
- | 5 | `CODEC_TYPE_VIDEO_AV1` |
64
- | 64 | `CODEC_TYPE_AUDIO_OPUS` |
65
- | 65 | `CODEC_TYPE_AUDIO_AAC` |
66
- | 66 | `CODEC_TYPE_AUDIO_PCM` |
54
+ ### AudioChannelAddRequest
55
+
56
+ Request to add a channel to an audio mixer.
67
57
 
68
- ### MediaCodecData
69
58
 
70
59
  | Field | Type | Description |
71
60
  |-------|------|-------------|
72
- | `codec_type` | CodecType | Codec identifier |
73
- | `sample_rate` | uint32 | Audio sample rate |
74
- | `timebase_num` | uint32 | Timebase numerator |
75
- | `timebase_den` | uint32 | Timebase denominator |
76
- | `codec_profile` | uint32 | Codec profile |
77
- | `codec_level` | uint32 | Codec level |
78
- | `width` | uint32 | Video width |
79
- | `height` | uint32 | Video height |
80
- | `channels` | uint32 | Audio channels |
81
- | `bit_depth` | uint32 | Bit depth |
61
+ | `mixer_id` | string | |
62
+ | `channel_config` | AudioMixerChannel | |
63
+
64
+
65
+ ### AudioChannelPluginStatus
66
+
67
+ Audio channel plugin status.
68
+
69
+
70
+ | Field | Type | Description |
71
+ |-------|------|-------------|
72
+ | `id` | string | |
73
+ | `type` | string | |
74
+ | `params` | repeated AudioPluginParamStatus | |
75
+
76
+
77
+ ### AudioChannelRemoveRequest
78
+
79
+ Request to remove a channel from an audio mixer.
80
+
81
+
82
+ | Field | Type | Description |
83
+ |-------|------|-------------|
84
+ | `mixer_id` | string | |
85
+ | `channel_id` | string | |
86
+
87
+
88
+ ### AudioChannelStatus
89
+
90
+ Audio channel status.
91
+
92
+
93
+ | Field | Type | Description |
94
+ |-------|------|-------------|
95
+ | `id` | string | |
96
+ | `output_type` | AudioMixerChannelType | |
97
+ | `level` | float | |
98
+ | `pan` | float | |
99
+ | `vu` | repeated float | |
100
+ | `has_data` | bool | |
101
+ | `read_errors` | uint32 | |
102
+ | `plugins` | repeated AudioChannelPluginStatus | |
103
+
104
+
105
+ ### AudioMixerAddRequest
106
+
107
+ Request to add a new audio mixer.
108
+
109
+
110
+ | Field | Type | Description |
111
+ |-------|------|-------------|
112
+ | `id` | string | |
113
+ | `config` | AudioMixerConfig | |
114
+
115
+
116
+ ### AudioMixerChannel
117
+
118
+ Audio mixer channel configuration.
119
+
120
+
121
+ | Field | Type | Description |
122
+ |-------|------|-------------|
123
+ | `id` | string | |
124
+ | `source_id` | string | |
125
+ | `channel_type` | AudioMixerChannelType | |
126
+ | `source_channels` | repeated uint32 | |
127
+ | `level` | float | |
128
+ | `pan` | float | |
129
+ | `plugins` | repeated AudioPlugin | |
130
+
131
+
132
+ ### AudioMixerConfig
133
+
134
+ Audio mixer configuration.
135
+
136
+
137
+ | Field | Type | Description |
138
+ |-------|------|-------------|
139
+ | `channels` | repeated AudioMixerChannel | |
140
+ | `output_type` | AudioMixerChannelType | |
141
+ | `order` | uint32 | |
142
+
143
+
144
+ ### AudioMixerRemoveRequest
145
+
146
+ Request to remove an audio mixer.
147
+
148
+
149
+ | Field | Type | Description |
150
+ |-------|------|-------------|
151
+ | `id` | string | |
152
+
153
+
154
+ ### AudioMixerStatus
155
+
156
+ Audio mixer status.
157
+
158
+
159
+ | Field | Type | Description |
160
+ |-------|------|-------------|
161
+ | `id` | string | |
162
+ | `output_type` | AudioMixerChannelType | |
163
+ | `vu` | repeated float | |
164
+ | `channels` | repeated AudioChannelStatus | |
165
+
166
+
167
+ ### AudioMixerUpdateRequest
168
+
169
+ Request to update an existing audio mixer.
170
+
171
+
172
+ | Field | Type | Description |
173
+ |-------|------|-------------|
174
+ | `id` | string | |
175
+ | `config` | AudioMixerConfig | |
176
+
177
+
178
+ ### AudioPlugin
179
+
180
+ Audio plugin instance.
181
+
182
+
183
+ | Field | Type | Description |
184
+ |-------|------|-------------|
185
+ | `id` | string | |
186
+ | `type` | string | |
187
+ | `params` | repeated AudioPluginParam | |
188
+ | `aux_input_mix_ids` | repeated string | |
189
+
190
+
191
+ ### AudioPluginParam
192
+
193
+ Audio plugin parameter.
194
+
195
+
196
+ | Field | Type | Description |
197
+ |-------|------|-------------|
198
+ | `id` | uint32 | |
199
+ | `float_value` | float | |
200
+
201
+
202
+ ### AudioPluginParamStatus
203
+
204
+ Audio plugin parameter status (with display info).
205
+
206
+
207
+ | Field | Type | Description |
208
+ |-------|------|-------------|
209
+ | `id` | uint32 | |
210
+ | `float_value` | float | |
211
+ | `label` | string | |
212
+ | `display_value` | string | |
213
+
214
+
215
+ ---
216
+
217
+
218
+ ## sesame/v1/commands/commands.proto
219
+
220
+ `sesame.v1.commands`
221
+
222
+
223
+
224
+
225
+ ### CommandExecutionResponse
226
+
227
+ Command execution response.
228
+
229
+ Reserved for future per-command results.
230
+
231
+
232
+ ### CommandList
233
+
234
+ Command list.
235
+ A list of commands to execute in sequence.
236
+
237
+
238
+ | Field | Type | Description |
239
+ |-------|------|-------------|
240
+ | `command_list` | repeated CommandListItem | |
241
+
242
+
243
+ ### CommandListItem
244
+
245
+ Command list item.
246
+ Each item represents a single command to execute at a specific time offset.
82
247
 
83
- ### FrameHeader
84
248
 
85
249
  | Field | Type | Description |
86
250
  |-------|------|-------------|
87
- | `type` | FrameType | Frame type |
88
- | `pts` | uint64 | Presentation timestamp |
89
- | `id` | uint64 | Frame ID |
90
- | `keyframe` | bool | Is keyframe |
91
- | `codec_data` | MediaCodecData | Codec parameters |
92
- | `routing_metadata` | string | Source routing (inbound only) |
251
+ | `time_offset_us` | int64 | |
252
+ | `add_source` | sesame.v1.sources.SourceAddRequest | |
253
+ | `update_source` | sesame.v1.sources.SourceUpdateRequest | |
254
+ | `remove_source` | sesame.v1.sources.SourceRemoveRequest | |
255
+ | `add_output` | sesame.v1.outputs.OutputAddRequest | |
256
+ | `update_output` | sesame.v1.outputs.OutputUpdateRequest | |
257
+ | `remove_output` | sesame.v1.outputs.OutputRemoveRequest | |
258
+ | `add_compositor` | sesame.v1.compositor.CompositorAddRequest | |
259
+ | `remove_compositor` | sesame.v1.compositor.CompositorRemoveRequest | |
260
+ | `clear_compositor` | sesame.v1.compositor.CompositorClearRequest | |
261
+ | `add_node` | sesame.v1.compositor.NodeAddRequest | |
262
+ | `remove_node` | sesame.v1.compositor.NodeRemoveRequest | |
263
+ | `set_property` | sesame.v1.compositor.PropertySetRequest | |
264
+ | `animate_property` | sesame.v1.compositor.PropertyAnimateRequest | |
265
+ | `add_audio_mixer` | sesame.v1.audio.AudioMixerAddRequest | |
266
+ | `update_audio_mixer` | sesame.v1.audio.AudioMixerUpdateRequest | |
267
+ | `remove_audio_mixer` | sesame.v1.audio.AudioMixerRemoveRequest | |
268
+ | `add_audio_channel` | sesame.v1.audio.AudioChannelAddRequest | |
269
+ | `remove_audio_channel` | sesame.v1.audio.AudioChannelRemoveRequest | |
270
+ | `update_source_transport` | sesame.v1.sources.SourceTransportCommand | |
271
+ | `load_playlist` | sesame.v1.sources.LoadPlaylistRequest | |
272
+ | `eject_playlist` | sesame.v1.sources.EjectPlaylistRequest | |
273
+ | `callback` | sesame.v1.common.Callback | |
274
+ | `set_source_metadata` | sesame.v1.sources.SourceMetadataSetRequest | |
275
+ | `transaction_id` | optional uint32 | |
276
+ | `transaction_deps` | repeated uint32 | |
277
+
93
278
 
94
279
  ---
95
280
 
96
- ## Common Types
281
+
282
+ ## sesame/v1/common/common.proto
97
283
 
98
284
  `sesame.v1.common`
99
285
 
286
+
287
+
288
+
289
+ ### CodecType
290
+
291
+ Shared codec identifier for video and audio.
292
+ Video codecs occupy numbers 1–63; audio codecs start at 64.
293
+
294
+ | Value | Name | Description |
295
+ |-------|------|-------------|
296
+ | 0 | `CODEC_TYPE_UNSPECIFIED` | Unspecified (invalid) |
297
+ | 1 | `CODEC_TYPE_VIDEO_VP8` | VP8 codec |
298
+ | 2 | `CODEC_TYPE_VIDEO_VP9` | VP9 codec |
299
+ | 3 | `CODEC_TYPE_VIDEO_AVC` | H.264/AVC codec |
300
+ | 4 | `CODEC_TYPE_VIDEO_HEVC` | H.265/HEVC codec |
301
+ | 5 | `CODEC_TYPE_VIDEO_AV1` | AV1 codec |
302
+ | 6 | `CODEC_TYPE_VIDEO_PRORES` | Apple ProRes codec family |
303
+ | 7 | `CODEC_TYPE_VIDEO_DNXHR` | Avid DNxHR codec family |
304
+ | 64 | `CODEC_TYPE_AUDIO_OPUS` | Opus audio codec |
305
+ | 65 | `CODEC_TYPE_AUDIO_AAC` | AAC audio codec |
306
+ | 66 | `CODEC_TYPE_AUDIO_PCM` | PCM 16-bit little-endian audio |
307
+ | 67 | `CODEC_TYPE_AUDIO_PCM_S24LE` | PCM 24-bit little-endian audio |
308
+
309
+
100
310
  ### ConnectionState
101
311
 
312
+ Connection/lifecycle state for runtime entities (sources, outputs, etc.).
313
+ Used by source/output status models across the API.
314
+
102
315
  | Value | Name | Description |
103
316
  |-------|------|-------------|
104
- | 0 | `CONNECTION_STATE_UNSPECIFIED` | Invalid |
317
+ | 0 | `CONNECTION_STATE_UNSPECIFIED` | Unspecified |
105
318
  | 1 | `CONNECTION_STATE_INITIALIZING` | Initializing resources |
106
319
  | 2 | `CONNECTION_STATE_CONNECTING` | Connecting/opening |
107
320
  | 3 | `CONNECTION_STATE_ONLINE` | Healthy and running |
@@ -109,208 +322,1089 @@ Every WebSocket message is framed as:
109
322
  | 5 | `CONNECTION_STATE_OFFLINE` | Stopped or unavailable |
110
323
  | 6 | `CONNECTION_STATE_ERROR` | Failed with error |
111
324
 
325
+
326
+ ### EventTopic
327
+
328
+ Typed event topics for subscriptions and event delivery.
329
+ Replaces stringly-typed topic names with compile-time checked values.
330
+
331
+ | Value | Name | Description |
332
+ |-------|------|-------------|
333
+ | 0 | `EVENT_TOPIC_UNSPECIFIED` | Unspecified (invalid) |
334
+ | 1 | `EVENT_TOPIC_ERROR` | Error events |
335
+ | 2 | `EVENT_TOPIC_TRANSPORT` | Source transport/playback state changes |
336
+ | 3 | `EVENT_TOPIC_CALLBACK` | Client callback events |
337
+ | 4 | `EVENT_TOPIC_JOB` | Job events (export, import, etc.) |
338
+ | 6 | `EVENT_TOPIC_RECORDER` | Recorder events |
339
+
340
+
112
341
  ### VideoFormat
113
342
 
343
+ Video format for Decklink and other hardware devices.
344
+
114
345
  | Value | Name | Description |
115
346
  |-------|------|-------------|
116
- | 0 | `VIDEO_FORMAT_UNSPECIFIED` | Invalid |
347
+ | 0 | `VIDEO_FORMAT_UNSPECIFIED` | Unspecified (invalid) |
117
348
  | 1 | `VIDEO_FORMAT_1080_50I` | 1080i50 |
118
349
  | 2 | `VIDEO_FORMAT_1080_50P` | 1080p50 |
119
350
  | 3 | `VIDEO_FORMAT_1080_60I` | 1080i60 |
120
351
  | 4 | `VIDEO_FORMAT_1080_60P` | 1080p60 |
121
352
 
122
- ### CodecId
123
353
 
124
- | Value | Name | Description |
125
- |-------|------|-------------|
126
- | 0 | `CODEC_ID_UNSPECIFIED` | Invalid |
127
- | 1 | `CODEC_ID_H264` | H.264/AVC |
128
- | 2 | `CODEC_ID_HEVC` | H.265/HEVC |
129
- | 3 | `CODEC_ID_AV1` | AV1 |
130
- | 4 | `CODEC_ID_VP8` | VP8 |
131
- | 5 | `CODEC_ID_PRORES` | Apple ProRes |
132
- | 6 | `CODEC_ID_DNXHR` | Avid DNxHR |
354
+ ### Callback
133
355
 
134
- ### EventTopic
356
+ Callback message for event notifications.
357
+ Used to trigger client-side callbacks when specific events occur.
135
358
 
136
- | Value | Name | Description |
359
+
360
+ | Field | Type | Description |
137
361
  |-------|------|-------------|
138
- | 0 | `EVENT_TOPIC_UNSPECIFIED` | Invalid |
139
- | 1 | `EVENT_TOPIC_ERROR` | Error events |
140
- | 2 | `EVENT_TOPIC_TRANSPORT` | Source transport state changes |
141
- | 3 | `EVENT_TOPIC_CALLBACK` | Client callback events |
142
- | 4 | `EVENT_TOPIC_JOB` | Job lifecycle and progress events |
143
- | 6 | `EVENT_TOPIC_RECORDER` | Recorder events |
362
+ | `event` | string | |
363
+ | `data` | string | |
364
+
365
+
366
+ ### Empty
367
+
368
+ Empty message for RPCs that don't need request/response data.
369
+ This is the standard protobuf convention for "void" operations.
370
+
371
+
372
+ ### NameValue
373
+
374
+ Key-value pair for metadata and generic data.
375
+ Used for transport metadata, custom properties, etc.
144
376
 
145
- ### Vec4
146
377
 
147
378
  | Field | Type | Description |
148
379
  |-------|------|-------------|
149
- | `x` | float | Red / X |
150
- | `y` | float | Green / Y |
151
- | `z` | float | Blue / Z |
152
- | `w` | float | Alpha / W |
380
+ | `name` | string | |
381
+ | `value` | PropValue | |
382
+
153
383
 
154
384
  ### PropValue
155
385
 
156
- Oneof `value`:
386
+ Property value union type.
387
+ Used for setting compositor properties, audio parameters, etc.
388
+ Only one field should be set at a time.
389
+
157
390
 
158
391
  | Field | Type | Description |
159
392
  |-------|------|-------------|
160
- | `float_value` | float | Floating point value |
161
- | `vec4_value` | Vec4 | Vector value |
162
- | `string_value` | string | String value |
163
- | `bool_value` | bool | Boolean value |
164
- | `int_value` | int32 | Integer value |
393
+ | `float_value` | float | |
394
+ | `vec4_value` | Vec4 | |
395
+ | `string_value` | string | |
396
+ | `bool_value` | bool | |
397
+ | `int_value` | int32 | |
398
+
165
399
 
166
400
  ### PropertyDomain
167
401
 
168
- Identifies which engine object owns the property. Oneof `owner`:
402
+ Property domain (compositor, audio mixer, etc.).
403
+ Used for property set/animate operations across different domains.
404
+
169
405
 
170
406
  | Field | Type | Description |
171
407
  |-------|------|-------------|
172
- | `compositor_id` | string | Scene graph node/effect |
173
- | `audio_mixer_id` | string | Audio mixer channel/plugin |
174
- | `source_id` | string | Source preprocessor |
175
- | `replay_id` | string | Replay (reserved) |
408
+ | `compositor_id` | string | |
409
+ | `audio_mixer_id` | string | |
410
+ | `replay_id` | string | |
411
+ | `source_id` | string | |
412
+
413
+
414
+ ### TransportMetadata
415
+
416
+ Transport metadata (timecode, etc.).
417
+ Used for source and recorder metadata operations.
418
+
419
+
420
+ | Field | Type | Description |
421
+ |-------|------|-------------|
422
+ | `items` | repeated NameValue | |
423
+
424
+
425
+ ### Vec4
426
+
427
+ 4-component vector used for colors (RGBA), positions, rectangles, etc.
428
+ Components are typically in the range [0.0, 1.0] for colors,
429
+ but can be arbitrary for positions and sizes.
176
430
 
177
- ### Callback
178
431
 
179
432
  | Field | Type | Description |
180
433
  |-------|------|-------------|
181
- | `event` | string | Event name identifier |
182
- | `data` | string | Event data (JSON or other) |
434
+ | `x` | float | |
435
+ | `y` | float | |
436
+ | `z` | float | |
437
+ | `w` | float | |
438
+
183
439
 
184
440
  ---
185
441
 
186
- ## RPC Envelope
187
442
 
188
- `sesame.v1.rpc`
443
+ ## sesame/v1/compositor/compositor.proto
189
444
 
190
- ### Message
445
+ `sesame.v1.compositor`
191
446
 
192
- Oneof `payload`:
193
447
 
194
- | Field | Type | Description |
448
+
449
+
450
+ ### AnimationChannelEvaluationMode
451
+
452
+ Animation channel evaluation mode.
453
+
454
+ | Value | Name | Description |
195
455
  |-------|------|-------------|
196
- | `request` | Request | Client server request |
197
- | `response` | Response | Server client response |
198
- | `event` | Event | Server client push event |
456
+ | 0 | `ANIM_MODE_CONSTANT` | Constant (hold last value) |
457
+ | 1 | `ANIM_MODE_STATE_FROM` | State from (use initial value) |
458
+ | 2 | `ANIM_MODE_LOOP` | Loop animation |
459
+ | 3 | `ANIM_MODE_BOUNCE` | Bounce animation (ping-pong) |
199
460
 
200
- ### Request
201
461
 
202
- | Field | Type | Description |
462
+ ### NodeType
463
+
464
+ Node type in the scene graph.
465
+
466
+ | Value | Name | Description |
203
467
  |-------|------|-------------|
204
- | `method` | string | RPC method name (e.g. `"ExecuteCommandList"`) |
205
- | `seq` | uint32 | Sequence number for response matching |
206
- | `payload` | bytes | Serialized request protobuf |
468
+ | 0 | `NODE_TYPE_UNSPECIFIED` | Unspecified (invalid) |
469
+ | 1 | `NODE_TYPE_GROUP` | Group node (container) |
470
+ | 2 | `NODE_TYPE_TEXT` | Text node |
471
+ | 3 | `NODE_TYPE_VIDEO_BOX` | Video box node |
472
+ | 4 | `NODE_TYPE_IMAGE` | Image node |
473
+ | 5 | `NODE_TYPE_EFFECT_RTT` | Render-to-texture effect |
474
+ | 6 | `NODE_TYPE_EFFECT_TIMECODE` | Timecode display effect |
475
+ | 7 | `NODE_TYPE_EFFECT_CLIP_PLANE` | Clip plane effect |
476
+
477
+
478
+ ### CompositorAddRequest
479
+
480
+ Request to add a new compositor.
207
481
 
208
- ### Response
209
482
 
210
483
  | Field | Type | Description |
211
484
  |-------|------|-------------|
212
- | `seq` | uint32 | Sequence number matching request |
213
- | `ok` | bool | Success flag |
214
- | `payload` | bytes | Serialized response protobuf |
215
- | `error` | string | Error message (when `ok` is false) |
485
+ | `id` | string | |
486
+ | `multisample` | bool | |
487
+ | `width` | uint32 | |
488
+ | `height` | uint32 | |
489
+
490
+
491
+ ### CompositorClearRequest
492
+
493
+ Request to clear a compositor (remove all nodes).
216
494
 
217
- ### Event
218
495
 
219
496
  | Field | Type | Description |
220
497
  |-------|------|-------------|
221
- | `topic` | EventTopic | Event topic |
222
- | `payload` | bytes | Serialized `status.Event` protobuf |
498
+ | `id` | string | |
223
499
 
224
- ---
225
500
 
226
- ## Commands
501
+ ### CompositorRemoveRequest
227
502
 
228
- `sesame.v1.commands`
503
+ Request to remove a compositor.
229
504
 
230
- Commands are batched into a `CommandList` and executed atomically via `ExecuteCommandList`.
231
505
 
232
- ### CommandListItem
506
+ | Field | Type | Description |
507
+ |-------|------|-------------|
508
+ | `id` | string | |
509
+
510
+
511
+ ### KeyFrame
512
+
513
+ Animation keyframe.
514
+
233
515
 
234
516
  | Field | Type | Description |
235
517
  |-------|------|-------------|
236
- | `time_offset_us` | int64 | Schedule time offset (microseconds) |
237
- | `transaction_id` | uint32? | Optional transaction group ID |
238
- | `transaction_deps` | uint32[] | Transaction dependencies |
239
-
240
- Oneof `item` — exactly one per command:
241
-
242
- | Field | Type | Category |
243
- |-------|------|----------|
244
- | `add_source` | SourceAddRequest | Source |
245
- | `update_source` | SourceUpdateRequest | Source |
246
- | `remove_source` | SourceRemoveRequest | Source |
247
- | `add_output` | OutputAddRequest | Output |
248
- | `update_output` | OutputUpdateRequest | Output |
249
- | `remove_output` | OutputRemoveRequest | Output |
250
- | `add_compositor` | CompositorAddRequest | Compositor |
251
- | `remove_compositor` | CompositorRemoveRequest | Compositor |
252
- | `clear_compositor` | CompositorClearRequest | Compositor |
253
- | `add_node` | NodeAddRequest | Scene graph |
254
- | `remove_node` | NodeRemoveRequest | Scene graph |
255
- | `set_property` | PropertySetRequest | Property |
256
- | `animate_property` | PropertyAnimateRequest | Property |
257
- | `add_audio_mixer` | AudioMixerAddRequest | Audio |
258
- | `update_audio_mixer` | AudioMixerUpdateRequest | Audio |
259
- | `remove_audio_mixer` | AudioMixerRemoveRequest | Audio |
260
- | `add_audio_channel` | AudioChannelAddRequest | Audio |
261
- | `remove_audio_channel` | AudioChannelRemoveRequest | Audio |
262
- | `update_source_transport` | SourceTransportCommand | Transport |
263
- | `load_playlist` | LoadPlaylistRequest | Playlist |
264
- | `eject_playlist` | EjectPlaylistRequest | Playlist |
265
- | `callback` | Callback | Callback |
266
- | `set_source_metadata` | SourceMetadataSetRequest | Metadata |
518
+ | `time_us` | int64 | |
519
+ | `value` | sesame.v1.common.PropValue | |
520
+ | `easing_in` | string | |
521
+ | `easing_out` | string | |
267
522
 
268
- ---
269
523
 
270
- ## Sources
524
+ ### NodeAddRequest
271
525
 
272
- `sesame.v1.sources`
526
+ Request to add a node to the scene graph.
273
527
 
274
- ### SourceType
275
528
 
276
- | Value | Name | Description |
529
+ | Field | Type | Description |
277
530
  |-------|------|-------------|
278
- | 0 | `SOURCE_TYPE_UNSPECIFIED` | Invalid |
279
- | 1 | `SOURCE_TYPE_FILE` | File playback |
280
- | 2 | `SOURCE_TYPE_RECORDER` | Recorder playback |
281
- | 3 | `SOURCE_TYPE_BROWSER` | CEF browser |
282
- | 4 | `SOURCE_TYPE_RTT` | Render-to-texture |
283
- | 5 | `SOURCE_TYPE_DECKLINK` | Blackmagic Decklink capture |
284
- | 6 | `SOURCE_TYPE_SIGNAL_GENERATOR` | Test signal generator |
285
- | 7 | `SOURCE_TYPE_SYSTEM_AUDIO` | System audio input |
286
- | 8 | `SOURCE_TYPE_SRT_STREAM` | SRT stream |
287
- | 9 | `SOURCE_TYPE_WEBSOCKET` | WebSocket stream |
288
- | 10 | `SOURCE_TYPE_MOQ` | Media over QUIC |
531
+ | `compositor_id` | string | |
532
+ | `parent_address` | string | |
533
+ | `node_id` | string | |
534
+ | `node_type` | NodeType | |
289
535
 
290
- ### SourceTransportState
291
536
 
292
- | Value | Name | Description |
537
+ ### NodeRemoveRequest
538
+
539
+ Request to remove a node from the scene graph.
540
+
541
+
542
+ | Field | Type | Description |
293
543
  |-------|------|-------------|
294
- | 0 | `SOURCE_TRANSPORT_STATE_STOPPED` | Stopped |
295
- | 1 | `SOURCE_TRANSPORT_STATE_PLAYING` | Playing |
296
- | 2 | `SOURCE_TRANSPORT_STATE_CUEING` | Cueing to position |
297
- | 3 | `SOURCE_TRANSPORT_STATE_ERROR` | Error state |
298
- | 4 | `SOURCE_TRANSPORT_STATE_PLAYING_LIVE` | Playing live (no seeking) |
544
+ | `compositor_id` | string | |
545
+ | `address` | string | |
299
546
 
300
- ### SourceTransportCommandType
301
547
 
302
- | Value | Name | Description |
548
+ ### PropertyAnimateRequest
549
+
550
+ Request to animate a property.
551
+
552
+
553
+ | Field | Type | Description |
303
554
  |-------|------|-------------|
304
- | 0 | `SOURCE_TRANSPORT_CMD_UNSPECIFIED` | Invalid |
305
- | 1 | `SOURCE_TRANSPORT_CMD_STOP` | Stop playback |
306
- | 2 | `SOURCE_TRANSPORT_CMD_PLAY` | Start playback |
555
+ | `domain` | sesame.v1.common.PropertyDomain | |
556
+ | `address` | string | |
557
+ | `property` | string | |
558
+ | `keyframes` | repeated KeyFrame | |
559
+ | `before` | AnimationChannelEvaluationMode | |
560
+ | `after` | AnimationChannelEvaluationMode | |
561
+
562
+
563
+ ### PropertySetRequest
564
+
565
+ Request to set a property value.
566
+
567
+
568
+ | Field | Type | Description |
569
+ |-------|------|-------------|
570
+ | `domain` | sesame.v1.common.PropertyDomain | |
571
+ | `address` | string | |
572
+ | `property` | string | |
573
+ | `value` | sesame.v1.common.PropValue | |
574
+
575
+
576
+ ---
577
+
578
+
579
+ ## sesame/v1/jobs/jobs.proto
580
+
581
+ `sesame.v1.jobs`
582
+
583
+
584
+
585
+
586
+ ### ContainerFormat
587
+
588
+ Container format for exported files.
589
+
590
+ | Value | Name | Description |
591
+ |-------|------|-------------|
592
+ | 0 | `CONTAINER_FORMAT_UNSPECIFIED` | Unspecified (invalid) |
593
+ | 1 | `CONTAINER_FORMAT_MP4` | MP4 container |
594
+ | 2 | `CONTAINER_FORMAT_MOV` | QuickTime MOV container |
595
+ | 3 | `CONTAINER_FORMAT_MKV` | Matroska container |
596
+ | 4 | `CONTAINER_FORMAT_MXF` | Material eXchange Format |
597
+
598
+
599
+ ### JobStatus
600
+
601
+ Job status.
602
+
603
+ | Value | Name | Description |
604
+ |-------|------|-------------|
605
+ | 0 | `JOB_STATUS_UNSPECIFIED` | Unspecified (invalid) |
606
+ | 1 | `JOB_STATUS_PENDING` | Pending (not started) |
607
+ | 2 | `JOB_STATUS_IN_PROGRESS` | In progress |
608
+ | 3 | `JOB_STATUS_COMPLETE` | Complete |
609
+ | 4 | `JOB_STATUS_ABORTED` | Aborted by user |
610
+ | 5 | `JOB_STATUS_ERROR` | Error occurred |
611
+
612
+
613
+ ### JobType
614
+
615
+ Job type.
616
+
617
+ | Value | Name | Description |
618
+ |-------|------|-------------|
619
+ | 0 | `JOB_TYPE_UNSPECIFIED` | Unspecified (invalid) |
620
+ | 1 | `JOB_TYPE_EXPORT` | Playlist export |
621
+ | 2 | `JOB_TYPE_IMPORT` | Clip import |
622
+
623
+
624
+ ### RateControlMode
625
+
626
+ Rate control mode for video encoding.
627
+
628
+ | Value | Name | Description |
629
+ |-------|------|-------------|
630
+ | 0 | `RATE_CONTROL_MODE_UNSPECIFIED` | Unspecified (invalid) |
631
+ | 1 | `RATE_CONTROL_MODE_CBR` | Constant bitrate |
632
+ | 2 | `RATE_CONTROL_MODE_VBR` | Variable bitrate |
633
+ | 3 | `RATE_CONTROL_MODE_CQ` | Constant quality |
634
+
635
+
636
+ ### ExportConfiguration
637
+
638
+ Playlist export configuration.
639
+
640
+
641
+ | Field | Type | Description |
642
+ |-------|------|-------------|
643
+ | `filename` | string | |
644
+ | `container` | ContainerFormat | |
645
+ | `video_codec` | sesame.v1.common.CodecType | |
646
+ | `width` | uint32 | |
647
+ | `height` | uint32 | |
648
+ | `fps_num` | uint32 | |
649
+ | `fps_den` | uint32 | |
650
+ | `rate_control` | RateControlMode | |
651
+ | `video_bitrate_kbps` | uint32 | |
652
+ | `max_video_bitrate_kbps` | uint32 | |
653
+ | `gop_size` | uint32 | |
654
+ | `max_b_frames` | uint32 | |
655
+ | `profile` | string | |
656
+ | `level` | string | |
657
+ | `pixel_format` | string | |
658
+ | `color_primaries` | string | |
659
+ | `color_transfer` | string | |
660
+ | `color_matrix` | string | |
661
+ | `full_range` | bool | |
662
+ | `audio_codec` | sesame.v1.common.CodecType | |
663
+ | `audio_bitrate_kbps` | uint32 | |
664
+ | `audio_sample_rate_hz` | uint32 | |
665
+ | `audio_channels` | uint32 | |
666
+ | `audio_routing` | repeated uint32 | |
667
+
668
+
669
+ ### ExportStartRequest
670
+
671
+ Request to start playlist export.
672
+
673
+
674
+ | Field | Type | Description |
675
+ |-------|------|-------------|
676
+ | `config` | ExportConfiguration | |
677
+ | `items` | repeated sesame.v1.recorder.PlaylistItem | |
678
+
679
+
680
+ ### ImportConfiguration
681
+
682
+ Clip import configuration.
683
+
684
+
685
+ | Field | Type | Description |
686
+ |-------|------|-------------|
687
+ | `src_filename` | string | |
688
+ | `audio_routing` | repeated uint32 | |
689
+ | `dst_recorder_id` | string | |
690
+ | `dst_clip_id` | uint64 | |
691
+ | `dst_clip_name` | string | |
692
+ | `dst_clip_user_data` | string | |
693
+
694
+
695
+ ### ImportStartRequest
696
+
697
+ Request to start clip import.
698
+
699
+
700
+ | Field | Type | Description |
701
+ |-------|------|-------------|
702
+ | `config` | ImportConfiguration | |
703
+
704
+
705
+ ### Job
706
+
707
+ A job. Used as RPC response, list item, and event payload.
708
+
709
+
710
+ | Field | Type | Description |
711
+ |-------|------|-------------|
712
+ | `id` | uint32 | |
713
+ | `type` | JobType | |
714
+ | `status` | JobStatus | |
715
+ | `name` | string | |
716
+ | `description` | string | |
717
+ | `error` | optional string | |
718
+ | `progress` | int64 | |
719
+ | `total` | int64 | |
720
+ | `timing_info` | optional TimingInfo | |
721
+
722
+
723
+ ### JobAbortRequest
724
+
725
+ Request to abort a job.
726
+
727
+
728
+ | Field | Type | Description |
729
+ |-------|------|-------------|
730
+ | `job_id` | uint32 | |
731
+
732
+
733
+ ### JobList
734
+
735
+ List of jobs.
736
+
737
+
738
+ | Field | Type | Description |
739
+ |-------|------|-------------|
740
+ | `jobs` | repeated Job | |
741
+
742
+
743
+ ### JobListRequest
744
+
745
+ Request to list all jobs.
746
+
747
+
748
+ ### JobStartRequest
749
+
750
+ Request to start a job.
751
+
752
+
753
+ | Field | Type | Description |
754
+ |-------|------|-------------|
755
+ | `export_request` | ExportStartRequest | |
756
+ | `import_request` | ImportStartRequest | |
757
+
758
+
759
+ ### JobStatusRequest
760
+
761
+ Request to get job status.
762
+
763
+
764
+ | Field | Type | Description |
765
+ |-------|------|-------------|
766
+ | `job_id` | uint32 | |
767
+
768
+
769
+ ### TimingInfo
770
+
771
+ Timing information for clips.
772
+
773
+
774
+ | Field | Type | Description |
775
+ |-------|------|-------------|
776
+ | `tc_in` | int64 | |
777
+ | `tc_out` | int64 | |
778
+
779
+
780
+ ---
781
+
782
+
783
+ ## sesame/v1/outputs/output.proto
784
+
785
+ `sesame.v1.outputs`
786
+
787
+
788
+
789
+
790
+ ### EncoderPreset
791
+
792
+ Encoder preset.
793
+
794
+ | Value | Name | Description |
795
+ |-------|------|-------------|
796
+ | 0 | `ENCODER_PRESET_UNSPECIFIED` | Unspecified (invalid) |
797
+ | 1 | `ENCODER_PRESET_LOW_LATENCY` | Low-latency tune |
798
+ | 2 | `ENCODER_PRESET_LOW_LATENCY_IDR_ONLY` | Low-latency with IDR-only GOP |
799
+ | 3 | `ENCODER_PRESET_HIGH_QUALITY` | High-quality tune |
800
+
801
+
802
+ ### OutputType
803
+
804
+ Type of output.
805
+
806
+ | Value | Name | Description |
807
+ |-------|------|-------------|
808
+ | 0 | `OUTPUT_TYPE_UNSPECIFIED` | Unspecified (invalid) |
809
+ | 1 | `OUTPUT_TYPE_ENCODED_WEBSOCKET` | Encoded WebSocket stream |
810
+ | 2 | `OUTPUT_TYPE_ENCODED_RECORDER` | Encoded recorder |
811
+ | 3 | `OUTPUT_TYPE_DECKLINK` | Blackmagic Decklink output |
812
+ | 4 | `OUTPUT_TYPE_SYSTEM_AUDIO` | System audio output |
813
+ | 5 | `OUTPUT_TYPE_ENCODED_SRT` | Encoded SRT stream |
814
+ | 6 | `OUTPUT_TYPE_ENCODED_MOQ` | Encoded MoQ stream |
815
+ | 7 | `OUTPUT_TYPE_ENCODED_SUPER_SLOWMO_RECORDER` | Super slow-mo recorder |
816
+
817
+
818
+ ### RecorderType
819
+
820
+ Recorder type.
821
+
822
+ | Value | Name | Description |
823
+ |-------|------|-------------|
824
+ | 0 | `RECORDER_TYPE_UNSPECIFIED` | Unspecified (invalid) |
825
+ | 1 | `RECORDER_TYPE_LIVE` | Live recorder (circular buffer) |
826
+ | 2 | `RECORDER_TYPE_CLIPS` | Clip recorder; not continuously recording, only ingested frames are persisted |
827
+
828
+
829
+ ### DecklinkOutputConfig
830
+
831
+ Decklink output configuration.
832
+
833
+
834
+ | Field | Type | Description |
835
+ |-------|------|-------------|
836
+ | `device_index` | uint32 | |
837
+ | `video_format` | sesame.v1.common.VideoFormat | |
838
+ | `key_and_fill` | bool | |
839
+
840
+
841
+ ### EncodedMoqOutputConfig
842
+
843
+
844
+
845
+
846
+ | Field | Type | Description |
847
+ |-------|------|-------------|
848
+ | `encoder` | EncoderConfig | |
849
+ | `url` | string | |
850
+ | `broadcast` | string | |
851
+ | `key` | string | |
852
+
853
+
854
+ ### EncodedRecorderOutputConfig
855
+
856
+
857
+
858
+
859
+ | Field | Type | Description |
860
+ |-------|------|-------------|
861
+ | `encoder` | EncoderConfig | |
862
+ | `filename` | string | |
863
+ | `size_gb` | uint32 | |
864
+ | `group_id` | string | |
865
+ | `recorder_type` | RecorderType | |
866
+
867
+
868
+ ### EncodedSrtOutputConfig
869
+
870
+
871
+
872
+
873
+ | Field | Type | Description |
874
+ |-------|------|-------------|
875
+ | `url` | string | |
876
+ | `encoder` | EncoderConfig | |
877
+
878
+
879
+ ### EncodedSuperSlowMoRecorderOutputConfig
880
+
881
+
882
+
883
+
884
+ | Field | Type | Description |
885
+ |-------|------|-------------|
886
+ | `encoder` | EncoderConfig | |
887
+ | `filename` | string | |
888
+ | `size_gb` | uint32 | |
889
+ | `group_id` | string | |
890
+ | `recorder_type` | RecorderType | |
891
+ | `composition_ids` | repeated string | |
892
+ | `source_ids` | repeated string | |
893
+
894
+
895
+ ### EncodedWebSocketOutputConfig
896
+
897
+ -----------------------------------------------------------------------------
898
+ Type-specific output payloads
899
+ -----------------------------------------------------------------------------
900
+
901
+
902
+ | Field | Type | Description |
903
+ |-------|------|-------------|
904
+ | `channel` | string | |
905
+ | `encoder` | EncoderConfig | |
906
+
907
+
908
+ ### EncoderConfig
909
+
910
+ Encoded output configuration (WebSocket, SRT, MoQ).
911
+
912
+
913
+ | Field | Type | Description |
914
+ |-------|------|-------------|
915
+ | `codec` | sesame.v1.common.CodecType | |
916
+ | `preset` | EncoderPreset | |
917
+ | `bitrate_kbps` | uint32 | |
918
+ | `keyframe_interval` | uint32 | |
919
+ | `width` | uint32 | |
920
+ | `height` | uint32 | |
921
+ | `fps` | float | |
922
+
923
+
924
+ ### KeyframeRequest
925
+
926
+ Keyframe request for encoder.
927
+ Requests an immediate keyframe (IDR frame) from an encoder output.
928
+
929
+
930
+ | Field | Type | Description |
931
+ |-------|------|-------------|
932
+ | `id` | string | |
933
+
934
+
935
+ ### OutputAddRequest
936
+
937
+ Request to add a new output.
938
+
939
+
940
+ | Field | Type | Description |
941
+ |-------|------|-------------|
942
+ | `id` | string | |
943
+ | `composition_id` | string | |
944
+ | `audio_mix_ids` | repeated string | |
945
+ | `use_as_clock` | bool | |
946
+ | `websocket` | EncodedWebSocketOutputConfig | |
947
+ | `recorder` | EncodedRecorderOutputConfig | |
948
+ | `super_slowmo_recorder` | EncodedSuperSlowMoRecorderOutputConfig | |
949
+ | `srt` | EncodedSrtOutputConfig | |
950
+ | `moq` | EncodedMoqOutputConfig | |
951
+ | `decklink` | DecklinkOutputConfig | |
952
+ | `system_audio` | SystemAudioOutputConfig | |
953
+
954
+
955
+ ### OutputRemoveRequest
956
+
957
+ Request to remove an output.
958
+
959
+
960
+ | Field | Type | Description |
961
+ |-------|------|-------------|
962
+ | `id` | string | |
963
+
964
+
965
+ ### OutputStatus
966
+
967
+ Output status information.
968
+
969
+
970
+ | Field | Type | Description |
971
+ |-------|------|-------------|
972
+ | `id` | string | |
973
+ | `type` | OutputType | |
974
+ | `state` | sesame.v1.common.ConnectionState | |
975
+ | `msg` | optional string | |
976
+ | `url` | string | |
977
+ | `buffer_size` | uint32 | |
978
+ | `srt_stats` | optional sesame.v1.status.SRTSendStatistics | |
979
+
980
+
981
+ ### OutputUpdateRequest
982
+
983
+ Request to update an existing output.
984
+
985
+
986
+ | Field | Type | Description |
987
+ |-------|------|-------------|
988
+ | `id` | string | |
989
+ | `composition_id` | string | |
990
+ | `audio_mix_ids` | repeated string | |
991
+ | `use_as_clock` | bool | |
992
+ | `websocket` | EncodedWebSocketOutputConfig | |
993
+ | `recorder` | EncodedRecorderOutputConfig | |
994
+ | `super_slowmo_recorder` | EncodedSuperSlowMoRecorderOutputConfig | |
995
+ | `srt` | EncodedSrtOutputConfig | |
996
+ | `moq` | EncodedMoqOutputConfig | |
997
+ | `decklink` | DecklinkOutputConfig | |
998
+ | `system_audio` | SystemAudioOutputConfig | |
999
+
1000
+
1001
+ ### SystemAudioOutputConfig
1002
+
1003
+
1004
+
1005
+
1006
+ | Field | Type | Description |
1007
+ |-------|------|-------------|
1008
+ | `device_name` | string | |
1009
+
1010
+
1011
+ ---
1012
+
1013
+
1014
+ ## sesame/v1/recorder/recorder.proto
1015
+
1016
+ `sesame.v1.recorder`
1017
+
1018
+
1019
+
1020
+
1021
+ ### TransitionType
1022
+
1023
+ Transition type for playlist items.
1024
+
1025
+ | Value | Name | Description |
1026
+ |-------|------|-------------|
1027
+ | 0 | `TRANSITION_TYPE_MIX` | Mix/dissolve transition |
1028
+ | 1 | `TRANSITION_TYPE_FADE_TO_COLOR` | Fade to color |
1029
+ | 2 | `TRANSITION_TYPE_FADE_FROM_COLOR` | Fade from color |
1030
+ | 3 | `TRANSITION_TYPE_FADE_TO_FROM_COLOR` | Fade to and from color |
1031
+
1032
+
1033
+ ### PlaylistItem
1034
+
1035
+ Playlist item for recorder source playback.
1036
+
1037
+
1038
+ | Field | Type | Description |
1039
+ |-------|------|-------------|
1040
+ | `recorder_id` | string | |
1041
+ | `id` | uint64 | |
1042
+ | `transition_time_us` | int64 | |
1043
+ | `transition_type` | TransitionType | |
1044
+ | `transition_fade_color` | sesame.v1.common.Vec4 | |
1045
+ | `speed` | float | |
1046
+ | `audio_routing` | repeated uint32 | |
1047
+ | `start_time_us` | optional int64 | |
1048
+ | `end_time_us` | optional int64 | |
1049
+ | `audio_levels` | repeated float | |
1050
+
1051
+
1052
+ ### RecorderClip
1053
+
1054
+ Recorder clip information.
1055
+
1056
+
1057
+ | Field | Type | Description |
1058
+ |-------|------|-------------|
1059
+ | `id` | uint64 | |
1060
+ | `name` | string | |
1061
+ | `user_data` | string | |
1062
+ | `flags` | uint64 | |
1063
+ | `start_time_us` | int64 | |
1064
+ | `end_time_us` | int64 | |
1065
+ | `locked_start_us` | int64 | |
1066
+ | `locked_end_us` | int64 | |
1067
+ | `user_time_us` | int64 | |
1068
+
1069
+
1070
+ ### RecorderClipAddRequest
1071
+
1072
+ Request to add a clip to a recorder.
1073
+
1074
+
1075
+ | Field | Type | Description |
1076
+ |-------|------|-------------|
1077
+ | `clip` | RecorderClip | |
1078
+
1079
+
1080
+ ### RecorderClipCopyRequest
1081
+
1082
+ Request to copy a clip.
1083
+
1084
+
1085
+ | Field | Type | Description |
1086
+ |-------|------|-------------|
1087
+ | `clip_id` | uint64 | |
1088
+ | `new_clip_id` | uint64 | |
1089
+
1090
+
1091
+ ### RecorderClipFlagSetRequest
1092
+
1093
+ Request to set a clip flag.
1094
+
1095
+
1096
+ | Field | Type | Description |
1097
+ |-------|------|-------------|
1098
+ | `clip_id` | uint64 | |
1099
+ | `flag` | uint64 | |
1100
+ | `value` | bool | |
1101
+
1102
+
1103
+ ### RecorderClipRange
1104
+
1105
+ Clip id range.
1106
+
1107
+
1108
+ | Field | Type | Description |
1109
+ |-------|------|-------------|
1110
+ | `low` | uint64 | |
1111
+ | `high` | uint64 | |
1112
+
1113
+
1114
+ ### RecorderClipRemoveRequest
1115
+
1116
+ Request to remove a clip.
1117
+
1118
+
1119
+ | Field | Type | Description |
1120
+ |-------|------|-------------|
1121
+ | `clip_id` | uint64 | |
1122
+
1123
+
1124
+ ### RecorderClipsClearRequest
1125
+
1126
+ Request to clear clips with filters.
1127
+
1128
+
1129
+ | Field | Type | Description |
1130
+ |-------|------|-------------|
1131
+ | `protected_ranges` | repeated RecorderClipRange | |
1132
+ | `must_have_flags` | uint64 | |
1133
+ | `must_not_have_flags` | uint64 | |
1134
+
1135
+
1136
+ ### RecorderClipsGetRequest
1137
+
1138
+ Request to get all clips from a recorder.
1139
+
1140
+ Empty - returns all clips
1141
+
1142
+
1143
+ ### RecorderClipsGetResponse
1144
+
1145
+ Response with recorder clips.
1146
+
1147
+
1148
+ | Field | Type | Description |
1149
+ |-------|------|-------------|
1150
+ | `clips` | repeated RecorderClip | |
1151
+
1152
+
1153
+ ### RecorderClipsVerifyRequest
1154
+
1155
+ Request to verify clip integrity.
1156
+
1157
+ Empty - verifies all clips
1158
+
1159
+
1160
+ ### RecorderClipsVerifyResponse
1161
+
1162
+ Response with verification errors.
1163
+
1164
+
1165
+ | Field | Type | Description |
1166
+ |-------|------|-------------|
1167
+ | `errors` | repeated string | |
1168
+
1169
+
1170
+ ### RecorderEvent
1171
+
1172
+ Recorder event notification.
1173
+
1174
+
1175
+ | Field | Type | Description |
1176
+ |-------|------|-------------|
1177
+ | `id` | string | |
1178
+ | `online` | bool | |
1179
+ | `message` | optional string | |
1180
+
1181
+
1182
+ ### RecorderLockedDurationSetRequest
1183
+
1184
+ Request to set locked duration.
1185
+
1186
+
1187
+ | Field | Type | Description |
1188
+ |-------|------|-------------|
1189
+ | `frames` | uint32 | |
1190
+
1191
+
1192
+ ### RecorderMetadataSetRequest
1193
+
1194
+ Request to set recorder metadata.
1195
+
1196
+
1197
+ | Field | Type | Description |
1198
+ |-------|------|-------------|
1199
+ | `metadata` | sesame.v1.common.TransportMetadata | |
1200
+
1201
+
1202
+ ### RecorderOkResponse
1203
+
1204
+ Generic OK response.
1205
+
1206
+ Empty - indicates success
1207
+
1208
+
1209
+ ### RecorderRequest
1210
+
1211
+ Recorder request wrapper.
1212
+
1213
+
1214
+ | Field | Type | Description |
1215
+ |-------|------|-------------|
1216
+ | `recorder_id` | string | |
1217
+ | `get_clips` | RecorderClipsGetRequest | |
1218
+ | `add_clip` | RecorderClipAddRequest | |
1219
+ | `remove_clip` | RecorderClipRemoveRequest | |
1220
+ | `clear_clips` | RecorderClipsClearRequest | |
1221
+ | `set_metadata` | RecorderMetadataSetRequest | |
1222
+ | `verify_clips` | RecorderClipsVerifyRequest | |
1223
+ | `set_clip_flag` | RecorderClipFlagSetRequest | |
1224
+ | `copy_clip` | RecorderClipCopyRequest | |
1225
+ | `set_locked_duration` | RecorderLockedDurationSetRequest | |
1226
+
1227
+
1228
+ ### RecorderResponse
1229
+
1230
+ Recorder response wrapper.
1231
+
1232
+
1233
+ | Field | Type | Description |
1234
+ |-------|------|-------------|
1235
+ | `get_clips_response` | RecorderClipsGetResponse | |
1236
+ | `ok_response` | RecorderOkResponse | |
1237
+ | `verify_clips_response` | RecorderClipsVerifyResponse | |
1238
+
1239
+
1240
+ ### RecorderStatus
1241
+
1242
+ Recorder status.
1243
+
1244
+
1245
+ | Field | Type | Description |
1246
+ |-------|------|-------------|
1247
+ | `id` | string | |
1248
+
1249
+
1250
+ ---
1251
+
1252
+
1253
+ ## sesame/v1/rpc/rpc.proto
1254
+
1255
+ `sesame.v1.rpc`
1256
+
1257
+
1258
+
1259
+
1260
+ ### Event
1261
+
1262
+ Server event notification.
1263
+
1264
+
1265
+ | Field | Type | Description |
1266
+ |-------|------|-------------|
1267
+ | `topic` | sesame.v1.common.EventTopic | |
1268
+ | `payload` | bytes | |
1269
+
1270
+
1271
+ ### Message
1272
+
1273
+ Top-level message wrapper.
1274
+ All RPC communication uses this message type.
1275
+ Exactly one payload field will be set, determining the message type.
1276
+
1277
+
1278
+ | Field | Type | Description |
1279
+ |-------|------|-------------|
1280
+ | `request` | Request | |
1281
+ | `response` | Response | |
1282
+ | `event` | Event | |
1283
+
1284
+
1285
+ ### Request
1286
+
1287
+ RPC request from client to server.
1288
+
1289
+
1290
+ | Field | Type | Description |
1291
+ |-------|------|-------------|
1292
+ | `method` | string | |
1293
+ | `seq` | uint32 | |
1294
+ | `payload` | bytes | |
1295
+
1296
+
1297
+ ### Response
1298
+
1299
+ RPC response from server to client.
1300
+ Error handling:
1301
+ - If `ok` is true, `payload` contains the serialized success response and
1302
+ `error` should be empty.
1303
+ - If `ok` is false, `error` contains a human-readable message and `payload`
1304
+ may be empty or contain a partial diagnostic payload.
1305
+ - Transport-level failures (disconnect/timeouts) are not represented here and
1306
+ must be handled by the framing/transport layer.
1307
+
1308
+
1309
+ | Field | Type | Description |
1310
+ |-------|------|-------------|
1311
+ | `seq` | uint32 | |
1312
+ | `ok` | bool | |
1313
+ | `payload` | bytes | |
1314
+ | `error` | string | |
1315
+
1316
+
1317
+ ---
1318
+
1319
+
1320
+ ## sesame/v1/rpc/service.proto
1321
+
1322
+ `sesame.v1.rpc`
1323
+
1324
+
1325
+
1326
+
1327
+ ### SesameAPIService
1328
+
1329
+ Main Sesame API service.
1330
+
1331
+ | Method | Request | Response | Description |
1332
+ |--------|---------|----------|-------------|
1333
+ | `ExecuteCommandList` | .sesame.v1.commands.CommandList | .sesame.v1.commands.CommandExecutionResponse | Execute a list of commands. |
1334
+ | `UpdateSubscriptions` | .sesame.v1.status.SubscriptionRequest | .sesame.v1.common.Empty | Update event subscriptions. |
1335
+ | `NotImplemented` | .sesame.v1.common.Empty | .sesame.v1.common.Empty | Not implemented (placeholder). |
1336
+ | `RequestEvents` | .sesame.v1.common.Empty | stream .sesame.v1.status.Event | Subscribe to events (server streaming). |
1337
+ | `RequestStatus` | .sesame.v1.common.Empty | .sesame.v1.status.Status | Get current system status. |
1338
+ | `RequestRecorderOperation` | .sesame.v1.recorder.RecorderRequest | .sesame.v1.recorder.RecorderResponse | Recorder operations. |
1339
+ | `StartJob` | .sesame.v1.jobs.JobStartRequest | .sesame.v1.jobs.Job | Job operations. |
1340
+ | `AbortJob` | .sesame.v1.jobs.JobAbortRequest | .sesame.v1.jobs.Job | Abort a running job. |
1341
+ | `GetJobStatus` | .sesame.v1.jobs.JobStatusRequest | .sesame.v1.jobs.Job | Fetch status for a job. |
1342
+ | `ListJobs` | .sesame.v1.jobs.JobListRequest | .sesame.v1.jobs.JobList | List jobs. |
1343
+ | `RequestKeyframe` | .sesame.v1.outputs.KeyframeRequest | .sesame.v1.common.Empty | Request keyframe from encoder. |
1344
+ | `RequestIODeviceList` | .sesame.v1.common.Empty | .sesame.v1.status.IODeviceListResponse | Get list of I/O devices. |
1345
+
1346
+
1347
+ ---
1348
+
1349
+
1350
+ ## sesame/v1/sources/source.proto
1351
+
1352
+ `sesame.v1.sources`
1353
+
1354
+
1355
+
1356
+
1357
+ ### DeinterlaceType
1358
+
1359
+ Deinterlacing mode for interlaced sources.
1360
+
1361
+ | Value | Name | Description |
1362
+ |-------|------|-------------|
1363
+ | 0 | `DEINTERLACE_TYPE_PROGRESSIVE` | Progressive (no deinterlacing) |
1364
+ | 1 | `DEINTERLACE_TYPE_UPPER_FIELD_FIRST` | Upper field first |
1365
+ | 2 | `DEINTERLACE_TYPE_LOWER_FIELD_FIRST` | Lower field first |
1366
+ | 3 | `DEINTERLACE_TYPE_AUTO` | Auto-detect field order |
1367
+
1368
+
1369
+ ### PreprocessStep
1370
+
1371
+ Video preprocessing step type.
1372
+
1373
+ | Value | Name | Description |
1374
+ |-------|------|-------------|
1375
+ | 0 | `PREPROCESS_STEP_UNSPECIFIED` | Unspecified (invalid) |
1376
+ | 1 | `PREPROCESS_STEP_VIDEO_SCOPES` | Video scopes/waveform |
1377
+ | 2 | `PREPROCESS_STEP_CHROMA_KEY` | Chroma key |
1378
+ | 3 | `PREPROCESS_STEP_BLUR` | Blur effect |
1379
+
1380
+
1381
+ ### SourceTextureSize
1382
+
1383
+ Source texture size for GPU upload.
1384
+
1385
+ | Value | Name | Description |
1386
+ |-------|------|-------------|
1387
+ | 0 | `SOURCE_TEXTURE_SIZE_UNSPECIFIED` | Unspecified (invalid) |
1388
+ | 1 | `SOURCE_TEXTURE_SIZE_HD` | HD resolution (1920x1080) |
1389
+ | 2 | `SOURCE_TEXTURE_SIZE_4K` | 4K resolution (3840x2160) |
1390
+
1391
+
1392
+ ### SourceTransportCommandType
1393
+
1394
+ Source transport command type.
1395
+
1396
+ | Value | Name | Description |
1397
+ |-------|------|-------------|
1398
+ | 0 | `SOURCE_TRANSPORT_CMD_UNSPECIFIED` | Unspecified (invalid) |
1399
+ | 1 | `SOURCE_TRANSPORT_CMD_STOP` | Stop playback |
1400
+ | 2 | `SOURCE_TRANSPORT_CMD_PLAY` | Start playback |
307
1401
  | 3 | `SOURCE_TRANSPORT_CMD_SEEK` | Seek to position |
308
1402
  | 4 | `SOURCE_TRANSPORT_CMD_LOOP` | Set loop mode |
309
- | 5 | `SOURCE_TRANSPORT_CMD_LIVE` | Switch to live |
1403
+ | 5 | `SOURCE_TRANSPORT_CMD_LIVE` | Switch to live mode |
310
1404
  | 6 | `SOURCE_TRANSPORT_CMD_JOG` | Jog forward/backward |
311
1405
  | 7 | `SOURCE_TRANSPORT_CMD_MONITOR` | Monitor mode |
312
1406
  | 8 | `SOURCE_TRANSPORT_CMD_SEEK_USER_TIME` | Seek to user timecode |
313
- | 9 | `SOURCE_TRANSPORT_CMD_TAKE` | Take (cut to next) |
1407
+ | 9 | `SOURCE_TRANSPORT_CMD_TAKE` | Take/cut to next |
314
1408
  | 10 | `SOURCE_TRANSPORT_CMD_POST_ROLL` | Post-roll |
315
1409
  | 11 | `SOURCE_TRANSPORT_CMD_PRE_ROLL` | Pre-roll |
316
1410
  | 12 | `SOURCE_TRANSPORT_CMD_NEXT` | Next item |
@@ -318,786 +1412,643 @@ Oneof `item` — exactly one per command:
318
1412
  | 14 | `SOURCE_TRANSPORT_CMD_TRANSITIONS_DISABLED` | Disable transitions |
319
1413
  | 15 | `SOURCE_TRANSPORT_CMD_SET_SCRUBBING` | Set scrubbing mode |
320
1414
 
321
- ### DecoderType
322
1415
 
323
- | Value | Name |
324
- |-------|------|
325
- | 0 | `DECODER_TYPE_UNSPECIFIED` |
326
- | 1 | `DECODER_TYPE_H264` |
327
- | 2 | `DECODER_TYPE_HEVC` |
328
- | 3 | `DECODER_TYPE_AV1` |
1416
+ ### SourceTransportState
1417
+
1418
+ Source transport/playback state.
1419
+
1420
+ | Value | Name | Description |
1421
+ |-------|------|-------------|
1422
+ | 0 | `SOURCE_TRANSPORT_STATE_STOPPED` | Stopped |
1423
+ | 1 | `SOURCE_TRANSPORT_STATE_PLAYING` | Playing |
1424
+ | 2 | `SOURCE_TRANSPORT_STATE_CUEING` | Cueing to position |
1425
+ | 3 | `SOURCE_TRANSPORT_STATE_ERROR` | Error state |
1426
+ | 4 | `SOURCE_TRANSPORT_STATE_PLAYING_LIVE` | Playing live (no seeking) |
1427
+
1428
+
1429
+ ### SourceType
1430
+
1431
+ Type of video/audio source.
1432
+
1433
+ | Value | Name | Description |
1434
+ |-------|------|-------------|
1435
+ | 0 | `SOURCE_TYPE_UNSPECIFIED` | Unspecified (invalid) |
1436
+ | 1 | `SOURCE_TYPE_FILE` | File source (video/audio file) |
1437
+ | 2 | `SOURCE_TYPE_RECORDER` | Recorder playback source |
1438
+ | 3 | `SOURCE_TYPE_BROWSER` | Browser/CEF source |
1439
+ | 4 | `SOURCE_TYPE_RTT` | Render-to-texture source |
1440
+ | 5 | `SOURCE_TYPE_DECKLINK` | Blackmagic Decklink capture |
1441
+ | 6 | `SOURCE_TYPE_SIGNAL_GENERATOR` | Test signal generator |
1442
+ | 7 | `SOURCE_TYPE_SYSTEM_AUDIO` | System audio input |
1443
+ | 8 | `SOURCE_TYPE_SRT_STREAM` | SRT stream |
1444
+ | 9 | `SOURCE_TYPE_WEBSOCKET` | WebSocket stream |
1445
+ | 10 | `SOURCE_TYPE_MOQ` | Media over QUIC stream |
1446
+
1447
+
1448
+ ### BrowserSourceConfig
1449
+
1450
+
1451
+
1452
+
1453
+ | Field | Type | Description |
1454
+ |-------|------|-------------|
1455
+ | `url` | string | |
1456
+ | `width` | uint32 | |
1457
+ | `height` | uint32 | |
1458
+
1459
+
1460
+ ### DecklinkSourceConfig
1461
+
1462
+ Decklink source configuration.
1463
+
1464
+
1465
+ | Field | Type | Description |
1466
+ |-------|------|-------------|
1467
+ | `device_index` | uint32 | |
1468
+ | `video_format` | sesame.v1.common.VideoFormat | |
1469
+ | `sync_group` | optional uint32 | |
1470
+
1471
+
1472
+ ### EjectPlaylistRequest
1473
+
1474
+ Request to eject playlist from recorder source.
1475
+
1476
+
1477
+ | Field | Type | Description |
1478
+ |-------|------|-------------|
1479
+ | `source_id` | string | |
1480
+
1481
+
1482
+ ### FileSourceConfig
1483
+
1484
+ Type-specific source payloads.
1485
+
1486
+
1487
+ | Field | Type | Description |
1488
+ |-------|------|-------------|
1489
+ | `url` | string | |
1490
+
1491
+
1492
+ ### LoadPlaylistRequest
1493
+
1494
+ Request to load a playlist into a recorder source.
1495
+
1496
+
1497
+ | Field | Type | Description |
1498
+ |-------|------|-------------|
1499
+ | `source_id` | string | |
1500
+ | `user_playlist_id` | string | |
1501
+ | `items` | repeated sesame.v1.recorder.PlaylistItem | |
1502
+ | `start_time_us` | optional int64 | |
1503
+ | `start_index` | optional int64 | |
1504
+ | `material_pos_us` | optional int64 | |
1505
+
1506
+
1507
+ ### MoqSourceConfig
1508
+
1509
+
1510
+
1511
+
1512
+ | Field | Type | Description |
1513
+ |-------|------|-------------|
1514
+ | `url` | string | |
1515
+ | `broadcast` | string | |
1516
+ | `key` | string | |
1517
+ | `decode_buffer_frames` | uint32 | |
1518
+
1519
+
1520
+ ### RTTSourceConfig
1521
+
1522
+ RTT (Render-to-Texture) source configuration.
1523
+
1524
+
1525
+ | Field | Type | Description |
1526
+ |-------|------|-------------|
1527
+ | `rtt_id` | string | |
1528
+ | `audio_mixes` | repeated string | |
1529
+ | `delay_frames` | uint32 | |
1530
+
1531
+
1532
+ ### RecorderSourceConfig
1533
+
1534
+
1535
+
329
1536
 
330
- ### DeinterlaceType
1537
+ | Field | Type | Description |
1538
+ |-------|------|-------------|
1539
+ | `recorder_id` | string | |
1540
+ | `codec` | sesame.v1.common.CodecType | |
331
1541
 
332
- | Value | Name |
333
- |-------|------|
334
- | 0 | `DEINTERLACE_TYPE_PROGRESSIVE` |
335
- | 1 | `DEINTERLACE_TYPE_UPPER_FIELD_FIRST` |
336
- | 2 | `DEINTERLACE_TYPE_LOWER_FIELD_FIRST` |
337
- | 3 | `DEINTERLACE_TYPE_AUTO` |
338
1542
 
339
- ### SourceTextureSize
1543
+ ### SignalGeneratorSourceConfig
340
1544
 
341
- | Value | Name | Description |
342
- |-------|------|-------------|
343
- | 0 | `SOURCE_TEXTURE_SIZE_UNSPECIFIED` | Default |
344
- | 1 | `SOURCE_TEXTURE_SIZE_HD` | 1920×1080 |
345
- | 2 | `SOURCE_TEXTURE_SIZE_4K` | 3840×2160 |
346
1545
 
347
- ### PreprocessStep
348
1546
 
349
- | Value | Name | Description |
350
- |-------|------|-------------|
351
- | 0 | `PREPROCESS_STEP_UNSPECIFIED` | Invalid |
352
- | 1 | `PREPROCESS_STEP_VIDEO_SCOPES` | Video scopes/waveform |
353
- | 2 | `PREPROCESS_STEP_CHROMA_KEY` | Chroma key |
354
- | 3 | `PREPROCESS_STEP_BLUR` | Blur effect |
355
1547
 
356
- ### SourceCommonConfig
1548
+ ### SourceAddRequest
1549
+
1550
+ Request to add a new source.
357
1551
 
358
- Shared settings for all source types.
359
1552
 
360
1553
  | Field | Type | Description |
361
1554
  |-------|------|-------------|
362
- | `user_id` | string | User-defined ID |
363
- | `use_as_clock` | bool | Use as master clock source |
364
- | `audio_only` | bool | Audio-only mode |
365
- | `audio_channels` | uint32 | Expected audio channel count |
366
- | `loop` | bool | Loop playback |
367
- | `play_state` | SourceTransportState | Initial playback state |
368
- | `mip_map` | bool | Generate mipmaps |
369
- | `texture_size` | SourceTextureSize | GPU texture size |
370
- | `deinterlace` | DeinterlaceType | Deinterlace mode |
371
- | `video_processors` | VideoProcessor[] | Video preprocessors |
1555
+ | `id` | string | |
1556
+ | `config` | SourceConfig | |
1557
+
1558
+
1559
+ ### SourceCommonConfig
1560
+
1561
+ Shared fields for all source kinds.
372
1562
 
373
- ### SourceConfig
374
1563
 
375
1564
  | Field | Type | Description |
376
1565
  |-------|------|-------------|
377
- | `common` | SourceCommonConfig | Shared settings |
1566
+ | `user_id` | string | |
1567
+ | `use_as_clock` | bool | |
1568
+ | `audio_only` | bool | |
1569
+ | `audio_channels` | uint32 | |
1570
+ | `loop` | bool | |
1571
+ | `play_state` | SourceTransportState | |
1572
+ | `mip_map` | bool | |
1573
+ | `texture_size` | SourceTextureSize | |
1574
+ | `deinterlace` | DeinterlaceType | |
1575
+ | `video_processors` | repeated VideoProcessor | |
378
1576
 
379
- Oneof `details` — exactly one required:
380
1577
 
381
- | Field | Type | Source type |
382
- |-------|------|------------|
383
- | `file` | FileSourceConfig | `SOURCE_TYPE_FILE` |
384
- | `recorder` | RecorderSourceConfig | `SOURCE_TYPE_RECORDER` |
385
- | `browser` | BrowserSourceConfig | `SOURCE_TYPE_BROWSER` |
386
- | `rtt` | RTTSourceConfig | `SOURCE_TYPE_RTT` |
387
- | `decklink` | DecklinkSourceConfig | `SOURCE_TYPE_DECKLINK` |
388
- | `signal_generator` | SignalGeneratorSourceConfig | `SOURCE_TYPE_SIGNAL_GENERATOR` |
389
- | `system_audio` | SystemAudioSourceConfig | `SOURCE_TYPE_SYSTEM_AUDIO` |
390
- | `srt_stream` | SrtSourceConfig | `SOURCE_TYPE_SRT_STREAM` |
391
- | `websocket` | WebsocketSourceConfig | `SOURCE_TYPE_WEBSOCKET` |
392
- | `moq` | MoqSourceConfig | `SOURCE_TYPE_MOQ` |
1578
+ ### SourceConfig
393
1579
 
394
- ### Source Type Configs
1580
+ Source configuration.
1581
+ Defines how a source is created and configured.
395
1582
 
396
- **FileSourceConfig** — `{ url: string }`
397
1583
 
398
- **RecorderSourceConfig** `{ recorder_id: string, decoder_type: DecoderType }`
1584
+ | Field | Type | Description |
1585
+ |-------|------|-------------|
1586
+ | `common` | SourceCommonConfig | |
1587
+ | `file` | FileSourceConfig | |
1588
+ | `recorder` | RecorderSourceConfig | |
1589
+ | `browser` | BrowserSourceConfig | |
1590
+ | `rtt` | RTTSourceConfig | |
1591
+ | `decklink` | DecklinkSourceConfig | |
1592
+ | `signal_generator` | SignalGeneratorSourceConfig | |
1593
+ | `system_audio` | SystemAudioSourceConfig | |
1594
+ | `srt_stream` | SrtSourceConfig | |
1595
+ | `websocket` | WebsocketSourceConfig | |
1596
+ | `moq` | MoqSourceConfig | |
399
1597
 
400
- **BrowserSourceConfig** — `{ url: string, width?: uint32, height?: uint32 }`
401
1598
 
402
- **RTTSourceConfig** — `{ rtt_id: string, audio_mixes: string[], delay_frames: uint32 }`
1599
+ ### SourceMetadataEvent
403
1600
 
404
- **DecklinkSourceConfig** `{ device_index: uint32, video_format: VideoFormat, sync_group?: uint32 }`
1601
+ Source metadata transport event notification.
405
1602
 
406
- **SignalGeneratorSourceConfig** — `{}` (no fields)
407
1603
 
408
- **SystemAudioSourceConfig** `{ device_name: string }` (empty = default device)
1604
+ | Field | Type | Description |
1605
+ |-------|------|-------------|
1606
+ | `source_id` | string | |
1607
+ | `metadata` | sesame.v1.common.TransportMetadata | |
409
1608
 
410
- **SrtSourceConfig** — `{ url: string, decode_buffer_frames: uint32 }`
411
1609
 
412
- **WebsocketSourceConfig** — `{ channel: string, decode_buffer_frames: uint32 }`
1610
+ ### SourceMetadataSetRequest
413
1611
 
414
- **MoqSourceConfig** `{ url: string, broadcast: string, key: string, decode_buffer_frames: uint32 }`
1612
+ Request to set source metadata.
415
1613
 
416
- ### SourceTransportCommand
417
1614
 
418
1615
  | Field | Type | Description |
419
1616
  |-------|------|-------------|
420
- | `source_id` | string | Source ID |
421
- | `cmd_type` | SourceTransportCommandType | Command type |
422
- | `value` | PropValue | Command value |
1617
+ | `source_id` | string | |
1618
+ | `metadata` | sesame.v1.common.TransportMetadata | |
423
1619
 
424
- ### LoadPlaylistRequest
425
1620
 
426
- | Field | Type | Description |
427
- |-------|------|-------------|
428
- | `source_id` | string | Recorder source ID |
429
- | `user_playlist_id` | string | User playlist ID |
430
- | `items` | PlaylistItem[] | Playlist items |
431
- | `start_time_us` | int64? | Start time (μs) |
432
- | `start_index` | int64? | Start item index |
433
- | `material_pos_us` | int64? | Material position (μs) |
1621
+ ### SourceRemoveRequest
1622
+
1623
+ Request to remove a source.
434
1624
 
435
- ### SourceStatus
436
1625
 
437
1626
  | Field | Type | Description |
438
1627
  |-------|------|-------------|
439
- | `id` | string | Source ID |
440
- | `type` | SourceType | Source type |
441
- | `user_id` | string | User-defined ID |
442
- | `state` | ConnectionState | Connection state |
443
- | `transport_state` | SourceTransportState | Transport state |
444
- | `msg` | string? | Error message |
445
- | `url` | string | Current URL |
446
- | `width` | uint32 | Video width |
447
- | `height` | uint32 | Video height |
448
- | `fps` | float | Video framerate |
449
- | `duration_us` | int64 | Duration (μs) |
450
- | `play_position_us` | int64 | Playback position (μs) |
451
- | `video_buf` | int32 | Video buffer (frames) |
452
- | `audio_buf` | int32 | Audio buffer (frames) |
453
- | `gpu_buf` | int32 | GPU buffer (frames) |
454
- | `audio_channels` | uint32 | Active audio channels |
455
- | `audio_level` | float | Audio level (0–1) |
456
- | `lip_sync_offset_us` | int64 | Lip sync offset (μs) |
457
- | `decode_timing` | FrameTiming | Decode timing stats |
458
- | `video_buf_avg` | double | Average video buffer level |
459
- | `srt_stats` | SRTReceiveStatistics? | SRT stats (if SRT source) |
1628
+ | `id` | string | |
460
1629
 
461
- ---
462
1630
 
463
- ## Outputs
1631
+ ### SourceStatus
464
1632
 
465
- `sesame.v1.outputs`
1633
+ Source status information.
466
1634
 
467
- ### OutputType
468
1635
 
469
- | Value | Name | Description |
1636
+ | Field | Type | Description |
470
1637
  |-------|------|-------------|
471
- | 0 | `OUTPUT_TYPE_UNSPECIFIED` | Invalid |
472
- | 1 | `OUTPUT_TYPE_ENCODED_WEBSOCKET` | Encoded WebSocket stream |
473
- | 2 | `OUTPUT_TYPE_ENCODED_RECORDER` | Encoded recorder |
474
- | 3 | `OUTPUT_TYPE_DECKLINK` | Blackmagic Decklink output |
475
- | 4 | `OUTPUT_TYPE_SYSTEM_AUDIO` | System audio output |
476
- | 5 | `OUTPUT_TYPE_ENCODED_SRT` | Encoded SRT stream |
477
- | 6 | `OUTPUT_TYPE_ENCODED_MOQ` | Encoded MoQ stream |
478
- | 7 | `OUTPUT_TYPE_ENCODED_SUPER_SLOWMO_RECORDER` | Super slow-mo recorder |
1638
+ | `id` | string | |
1639
+ | `type` | SourceType | |
1640
+ | `user_id` | string | |
1641
+ | `state` | sesame.v1.common.ConnectionState | |
1642
+ | `transport_state` | SourceTransportState | |
1643
+ | `msg` | optional string | |
1644
+ | `url` | string | |
1645
+ | `width` | uint32 | |
1646
+ | `height` | uint32 | |
1647
+ | `fps` | float | |
1648
+ | `duration_us` | int64 | |
1649
+ | `play_position_us` | int64 | |
1650
+ | `video_buf` | int32 | |
1651
+ | `audio_buf` | int32 | |
1652
+ | `gpu_buf` | int32 | |
1653
+ | `audio_channels` | uint32 | |
1654
+ | `audio_level` | float | |
1655
+ | `lip_sync_offset_us` | int64 | |
1656
+ | `decode_timing` | sesame.v1.status.FrameTiming | |
1657
+ | `video_buf_avg` | double | |
1658
+ | `srt_stats` | optional sesame.v1.status.SRTReceiveStatistics | |
479
1659
 
480
- ### RecorderType
481
-
482
- | Value | Name | Description |
483
- |-------|------|-------------|
484
- | 0 | `RECORDER_TYPE_UNSPECIFIED` | Invalid |
485
- | 1 | `RECORDER_TYPE_LIVE` | Live recorder (circular buffer) |
486
- | 2 | `RECORDER_TYPE_CLIPS` | Clip recorder (ingested frames only) |
487
1660
 
488
- ### EncoderPreset
1661
+ ### SourceTransportCommand
489
1662
 
490
- | Value | Name | Description |
491
- |-------|------|-------------|
492
- | 0 | `ENCODER_PRESET_UNSPECIFIED` | Invalid |
493
- | 1 | `ENCODER_PRESET_LOW_LATENCY` | Low-latency tune |
494
- | 2 | `ENCODER_PRESET_LOW_LATENCY_IDR_ONLY` | Low-latency, IDR-only GOP |
495
- | 3 | `ENCODER_PRESET_HIGH_QUALITY` | High-quality tune |
1663
+ Source transport command.
496
1664
 
497
- ### EncoderConfig
498
1665
 
499
1666
  | Field | Type | Description |
500
1667
  |-------|------|-------------|
501
- | `codec_id` | CodecId | Encoder codec |
502
- | `preset` | EncoderPreset | Encoder preset |
503
- | `bitrate_kbps` | uint32 | Bitrate (kbps) |
504
- | `keyframe_interval` | uint32 | GOP size in frames (0 = default) |
505
- | `width` | uint32 | Video width |
506
- | `height` | uint32 | Video height |
507
- | `fps` | float | Video framerate |
1668
+ | `source_id` | string | |
1669
+ | `cmd_type` | SourceTransportCommandType | |
1670
+ | `value` | sesame.v1.common.PropValue | |
1671
+
1672
+
1673
+ ### SourceUpdateRequest
1674
+
1675
+ Request to update an existing source.
508
1676
 
509
- ### OutputAddRequest
510
1677
 
511
1678
  | Field | Type | Description |
512
1679
  |-------|------|-------------|
513
- | `id` | string | Unique output ID |
514
- | `composition_id` | string | Compositor to output |
515
- | `audio_mix_ids` | string[] | Audio mixer IDs |
516
- | `use_as_clock` | bool | Use as master clock |
1680
+ | `id` | string | |
1681
+ | `config` | SourceConfig | |
517
1682
 
518
- Oneof `output` — exactly one required:
519
1683
 
520
- | Field | Type |
521
- |-------|------|
522
- | `websocket` | EncodedWebSocketOutputConfig |
523
- | `recorder` | EncodedRecorderOutputConfig |
524
- | `super_slowmo_recorder` | EncodedSuperSlowMoRecorderOutputConfig |
525
- | `srt` | EncodedSrtOutputConfig |
526
- | `moq` | EncodedMoqOutputConfig |
527
- | `decklink` | DecklinkOutputConfig |
528
- | `system_audio` | SystemAudioOutputConfig |
1684
+ ### SrtSourceConfig
529
1685
 
530
- ### Output Type Configs
531
1686
 
532
- **EncodedWebSocketOutputConfig** — `{ channel: string, encoder: EncoderConfig }`
533
1687
 
534
- **EncodedRecorderOutputConfig** — `{ encoder: EncoderConfig, filename: string, size_gb: uint32, group_id: string, recorder_type: RecorderType }`
535
1688
 
536
- **EncodedSuperSlowMoRecorderOutputConfig** Same as recorder + `{ composition_ids: string[], source_ids: string[] }`
1689
+ | Field | Type | Description |
1690
+ |-------|------|-------------|
1691
+ | `url` | string | |
1692
+ | `decode_buffer_frames` | uint32 | |
537
1693
 
538
- **EncodedSrtOutputConfig** — `{ url: string, encoder: EncoderConfig }`
539
1694
 
540
- **EncodedMoqOutputConfig** — `{ encoder: EncoderConfig, url: string, broadcast: string, key: string }`
1695
+ ### SystemAudioSourceConfig
541
1696
 
542
- **DecklinkOutputConfig** — `{ device_index: uint32, video_format: VideoFormat, key_and_fill: bool }`
543
1697
 
544
- **SystemAudioOutputConfig** — `{ device_name: string }`
545
1698
 
546
- ### OutputStatus
547
1699
 
548
1700
  | Field | Type | Description |
549
1701
  |-------|------|-------------|
550
- | `id` | string | Output ID |
551
- | `type` | OutputType | Output type |
552
- | `state` | ConnectionState | Connection state |
553
- | `msg` | string? | Error message |
554
- | `url` | string | Output URL |
555
- | `buffer_size` | uint32 | Buffer size (frames) |
556
- | `srt_stats` | SRTSendStatistics? | SRT stats (if SRT output) |
1702
+ | `device_name` | string | |
557
1703
 
558
- ---
559
1704
 
560
- ## Compositor & Scene Graph
1705
+ ### VideoProcessor
561
1706
 
562
- `sesame.v1.compositor`
1707
+ Video processor instance configuration.
563
1708
 
564
- ### NodeType
565
1709
 
566
- | Value | Name | Description |
1710
+ | Field | Type | Description |
567
1711
  |-------|------|-------------|
568
- | 0 | `NODE_TYPE_UNSPECIFIED` | Invalid |
569
- | 1 | `NODE_TYPE_GROUP` | Group container node |
570
- | 2 | `NODE_TYPE_TEXT` | Text overlay |
571
- | 3 | `NODE_TYPE_VIDEO_BOX` | Video source display |
572
- | 4 | `NODE_TYPE_IMAGE` | Image/texture |
573
- | 5 | `NODE_TYPE_EFFECT_RTT` | Render-to-texture effect |
574
- | 6 | `NODE_TYPE_EFFECT_TIMECODE` | Timecode display effect |
575
- | 7 | `NODE_TYPE_EFFECT_CLIP_PLANE` | Clip plane effect |
576
-
577
- ### AnimationChannelEvaluationMode
1712
+ | `id` | string | |
1713
+ | `type` | PreprocessStep | |
1714
+ | `params` | repeated VideoProcessorParam | |
578
1715
 
579
- | Value | Name | Description |
580
- |-------|------|-------------|
581
- | 0 | `ANIM_MODE_CONSTANT` | Hold last value |
582
- | 1 | `ANIM_MODE_STATE_FROM` | Use initial value |
583
- | 2 | `ANIM_MODE_LOOP` | Loop animation |
584
- | 3 | `ANIM_MODE_BOUNCE` | Ping-pong |
585
1716
 
586
- ### CompositorAddRequest
1717
+ ### VideoProcessorParam
587
1718
 
588
- | Field | Type | Description |
589
- |-------|------|-------------|
590
- | `id` | string | Unique compositor ID |
591
- | `multisample` | bool | Enable MSAA |
592
- | `width` | uint32 | Width |
593
- | `height` | uint32 | Height |
1719
+ Video processor parameter (mirrors AudioPluginParam).
594
1720
 
595
- ### NodeAddRequest
596
1721
 
597
1722
  | Field | Type | Description |
598
1723
  |-------|------|-------------|
599
- | `compositor_id` | string | Compositor ID |
600
- | `parent_address` | string | Parent node address |
601
- | `node_id` | string | New node ID |
602
- | `node_type` | NodeType | Node type |
1724
+ | `id` | uint32 | |
1725
+ | `float_value` | float | |
603
1726
 
604
- ### PropertySetRequest
605
1727
 
606
- | Field | Type | Description |
607
- |-------|------|-------------|
608
- | `domain` | PropertyDomain | Property domain (compositor, audio mixer, source) |
609
- | `address` | string | Node/effect/channel address |
610
- | `property` | string | Property name |
611
- | `value` | PropValue | Value to set |
1728
+ ### WebsocketSourceConfig
612
1729
 
613
- ### PropertyAnimateRequest
614
1730
 
615
- | Field | Type | Description |
616
- |-------|------|-------------|
617
- | `domain` | PropertyDomain | Property domain |
618
- | `address` | string | Node/effect address |
619
- | `property` | string | Property name |
620
- | `keyframes` | KeyFrame[] | Animation keyframes |
621
- | `before` | AnimationChannelEvaluationMode | Mode before first keyframe |
622
- | `after` | AnimationChannelEvaluationMode | Mode after last keyframe |
623
1731
 
624
- ### KeyFrame
625
1732
 
626
1733
  | Field | Type | Description |
627
1734
  |-------|------|-------------|
628
- | `time_us` | int64 | Keyframe time (μs) |
629
- | `value` | PropValue | Keyframe value |
630
- | `easing_in` | string | Easing function in |
631
- | `easing_out` | string | Easing function out |
1735
+ | `channel` | string | |
1736
+ | `decode_buffer_frames` | uint32 | |
1737
+
632
1738
 
633
1739
  ---
634
1740
 
635
- ## Audio Mixer
636
1741
 
637
- `sesame.v1.audio`
1742
+ ## sesame/v1/status/statistics.proto
638
1743
 
639
- ### AudioMixerChannelType
1744
+ `sesame.v1.status`
640
1745
 
641
- | Value | Name |
642
- |-------|------|
643
- | 0 | `AUDIO_MIXER_CHANNEL_TYPE_UNSPECIFIED` |
644
- | 1 | `AUDIO_MIXER_CHANNEL_TYPE_MONO` |
645
- | 2 | `AUDIO_MIXER_CHANNEL_TYPE_STEREO` |
646
1746
 
647
- ### AudioMixerChannel
648
1747
 
649
- | Field | Type | Description |
650
- |-------|------|-------------|
651
- | `id` | string | Channel ID |
652
- | `source_id` | string | Source ID |
653
- | `channel_type` | AudioMixerChannelType | Channel type |
654
- | `source_channels` | uint32[] | Source channel indices |
655
- | `level` | float | Level (0–1) |
656
- | `pan` | float | Pan (−1 to 1) |
657
- | `plugins` | AudioPlugin[] | Audio plugins |
658
1748
 
659
- ### AudioPlugin
1749
+ ### FrameTiming
660
1750
 
661
- | Field | Type | Description |
662
- |-------|------|-------------|
663
- | `id` | string | Plugin instance ID |
664
- | `type` | string | Plugin type (CLAP plugin ID) |
665
- | `params` | AudioPluginParam[] | Plugin parameters |
666
- | `aux_input_mix_ids` | string[] | Auxiliary input mixer IDs |
1751
+ Frame timing statistics.
1752
+ Used to monitor decode/encode/render performance.
1753
+ All times are in microseconds (us).
667
1754
 
668
- ### AudioMixerConfig
669
1755
 
670
1756
  | Field | Type | Description |
671
1757
  |-------|------|-------------|
672
- | `channels` | AudioMixerChannel[] | Mixer channels |
673
- | `output_type` | AudioMixerChannelType | Output channel type |
674
- | `order` | uint32 | Processing order |
1758
+ | `frame_time` | int32 | |
1759
+ | `frame_time_avg` | int32 | |
1760
+ | `frame_time_min` | int32 | |
1761
+ | `frame_time_max` | int32 | |
675
1762
 
676
- ### AudioMixerStatus
677
1763
 
678
- | Field | Type | Description |
679
- |-------|------|-------------|
680
- | `id` | string | Mixer ID |
681
- | `output_type` | AudioMixerChannelType | Output type |
682
- | `vu` | float[] | Master VU meter values |
683
- | `channels` | AudioChannelStatus[] | Channel status |
1764
+ ### MemoryDomainStats
1765
+
1766
+ Memory domain statistics.
1767
+ Tracks memory usage for different allocation domains.
684
1768
 
685
- ### AudioChannelStatus
686
1769
 
687
1770
  | Field | Type | Description |
688
1771
  |-------|------|-------------|
689
- | `id` | string | Channel ID |
690
- | `output_type` | AudioMixerChannelType | Output type |
691
- | `level` | float | Level |
692
- | `pan` | float | Pan |
693
- | `vu` | float[] | VU meter values |
694
- | `has_data` | bool | Has audio data |
695
- | `read_errors` | uint32 | Read error count |
696
- | `plugins` | AudioChannelPluginStatus[] | Plugin status |
697
-
698
- ---
1772
+ | `current_bytes` | uint64 | |
1773
+ | `peak_bytes` | uint64 | |
1774
+ | `budget_bytes` | uint64 | |
699
1775
 
700
- ## Recorder
701
1776
 
702
- `sesame.v1.recorder`
703
-
704
- ### TransitionType
1777
+ ### SRTReceiveStatistics
705
1778
 
706
- | Value | Name | Description |
707
- |-------|------|-------------|
708
- | 0 | `TRANSITION_TYPE_MIX` | Mix/dissolve |
709
- | 1 | `TRANSITION_TYPE_FADE_TO_COLOR` | Fade to color |
710
- | 2 | `TRANSITION_TYPE_FADE_FROM_COLOR` | Fade from color |
711
- | 3 | `TRANSITION_TYPE_FADE_TO_FROM_COLOR` | Fade to and from color |
1779
+ SRT receive statistics.
1780
+ Provides detailed metrics for SRT stream reception.
1781
+ Used for monitoring stream health and diagnosing issues.
712
1782
 
713
- ### RecorderClip
714
1783
 
715
1784
  | Field | Type | Description |
716
1785
  |-------|------|-------------|
717
- | `id` | uint64 | Clip ID |
718
- | `name` | string | Clip name |
719
- | `user_data` | string | User-defined data |
720
- | `flags` | uint64 | Clip flags (bitfield) |
721
- | `start_time_us` | int64 | Start time (μs) |
722
- | `end_time_us` | int64 | End time (μs) |
723
- | `locked_start_us` | int64 | Locked start (μs) |
724
- | `locked_end_us` | int64 | Locked end (μs) |
725
- | `user_time_us` | int64 | User timecode (μs) |
1786
+ | `packets_received` | int64 | |
1787
+ | `packets_received_lost` | int32 | |
1788
+ | `packet_ack_sent` | int32 | |
1789
+ | `packet_nack_sent` | int32 | |
1790
+ | `bytes_received` | int64 | |
1791
+ | `bytes_received_lost` | int64 | |
1792
+ | `receive_rate_mbps` | double | |
1793
+ | `tsbpd_delay` | int32 | |
1794
+ | `bandwidth_mbps` | double | |
1795
+ | `rtt_ms` | double | |
726
1796
 
727
- ### PlaylistItem
728
1797
 
729
- | Field | Type | Description |
730
- |-------|------|-------------|
731
- | `recorder_id` | string | Recorder ID |
732
- | `id` | uint64 | Clip ID |
733
- | `transition_time_us` | int64 | Transition duration (μs) |
734
- | `transition_type` | TransitionType | Transition type |
735
- | `transition_fade_color` | Vec4 | Fade color |
736
- | `speed` | float | Playback speed |
737
- | `audio_routing` | uint32[] | Audio channel routing |
738
- | `start_time_us` | int64? | Start time (μs) |
739
- | `end_time_us` | int64? | End time (μs) |
740
- | `audio_levels` | float[] | Audio levels per channel (0–1) |
1798
+ ### SRTSendStatistics
1799
+
1800
+ SRT send statistics.
1801
+ Provides detailed metrics for SRT stream transmission.
741
1802
 
742
- ### RecorderRequest
743
1803
 
744
1804
  | Field | Type | Description |
745
1805
  |-------|------|-------------|
746
- | `recorder_id` | string | Recorder ID |
1806
+ | `packets_sent` | int64 | |
1807
+ | `packets_sent_lost` | int32 | |
1808
+ | `packets_sent_dropped` | int32 | |
1809
+ | `packets_retransmitted` | int32 | |
1810
+ | `packet_ack_received` | int32 | |
1811
+ | `packet_nack_received` | int32 | |
1812
+ | `bytes_sent` | int64 | |
1813
+ | `bytes_sent_dropped` | int64 | |
1814
+ | `send_rate_mbps` | double | |
1815
+ | `bandwidth_mbps` | double | |
1816
+ | `rtt_ms` | double | |
747
1817
 
748
- Oneof `request`:
749
1818
 
750
- | Field | Type |
751
- |-------|------|
752
- | `get_clips` | RecorderClipsGetRequest |
753
- | `add_clip` | RecorderClipAddRequest |
754
- | `remove_clip` | RecorderClipRemoveRequest |
755
- | `clear_clips` | RecorderClipsClearRequest |
756
- | `set_metadata` | RecorderMetadataSetRequest |
757
- | `verify_clips` | RecorderClipsVerifyRequest |
758
- | `set_clip_flag` | RecorderClipFlagSetRequest |
759
- | `copy_clip` | RecorderClipCopyRequest |
760
- | `set_locked_duration` | RecorderLockedDurationSetRequest |
1819
+ ### SystemStatus
1820
+
1821
+ System status information.
1822
+ Provides overall system health and performance metrics.
761
1823
 
762
- ### RecorderEvent
763
1824
 
764
1825
  | Field | Type | Description |
765
1826
  |-------|------|-------------|
766
- | `id` | string | Recorder ID |
767
- | `online` | bool | Is recorder online |
768
- | `message` | string? | Event message |
1827
+ | `uptime` | uint64 | |
1828
+ | `framedrops` | uint32 | |
1829
+ | `framerate` | float | |
1830
+ | `gpu_mem` | uint64 | |
1831
+ | `cpu_mem` | uint64 | |
1832
+ | `mem_gpu_pool` | MemoryDomainStats | |
1833
+ | `mem_cpu_pool` | MemoryDomainStats | |
1834
+ | `mem_gpu_adhoc` | MemoryDomainStats | |
1835
+ | `mem_gpu_pinned` | MemoryDomainStats | |
1836
+ | `gpu_mem_total` | uint64 | |
1837
+ | `gpu_mem_used` | uint64 | |
1838
+ | `gpu_utilization` | uint32 | |
1839
+ | `gpu_mem_utilization` | uint32 | |
1840
+ | `gpu_encoder_utilization` | uint32 | |
1841
+ | `gpu_decoder_utilization` | uint32 | |
1842
+ | `gpu_name` | string | |
1843
+ | `vma_bytes` | uint64 | |
1844
+
769
1845
 
770
1846
  ---
771
1847
 
772
- ## Jobs
773
1848
 
774
- `sesame.v1.jobs`
1849
+ ## sesame/v1/status/status.proto
775
1850
 
776
- ### JobType
1851
+ `sesame.v1.status`
777
1852
 
778
- | Value | Name | Description |
779
- |-------|------|-------------|
780
- | 0 | `JOB_TYPE_UNSPECIFIED` | Invalid |
781
- | 1 | `JOB_TYPE_EXPORT` | Playlist export |
782
- | 2 | `JOB_TYPE_IMPORT` | Clip import |
783
1853
 
784
- ### JobStatus
785
1854
 
786
- | Value | Name | Description |
787
- |-------|------|-------------|
788
- | 0 | `JOB_STATUS_UNSPECIFIED` | Invalid |
789
- | 1 | `JOB_STATUS_PENDING` | Queued, not started |
790
- | 2 | `JOB_STATUS_IN_PROGRESS` | Running (includes progress events) |
791
- | 3 | `JOB_STATUS_COMPLETE` | Finished successfully |
792
- | 4 | `JOB_STATUS_ABORTED` | Aborted by user |
793
- | 5 | `JOB_STATUS_ERROR` | Failed with error |
794
1855
 
795
- ### Job
1856
+ ### IODeviceType
796
1857
 
797
- | Field | Type | Description |
1858
+ I/O device type.
1859
+
1860
+ | Value | Name | Description |
798
1861
  |-------|------|-------------|
799
- | `id` | uint32 | Job ID |
800
- | `type` | JobType | Job type |
801
- | `status` | JobStatus | Current status |
802
- | `name` | string | Job name |
803
- | `description` | string | Job description (e.g. filename) |
804
- | `error` | string? | Error message (when status = ERROR) |
805
- | `progress` | int64 | Current progress (μs) |
806
- | `total` | int64 | Total duration (μs) |
807
- | `timing_info` | TimingInfo? | Timing info (set on import completion) |
1862
+ | 0 | `IO_DEVICE_TYPE_UNSPECIFIED` | Unspecified (invalid) |
1863
+ | 1 | `IO_DEVICE_TYPE_VIDEO_INPUT` | Video input device |
1864
+ | 2 | `IO_DEVICE_TYPE_VIDEO_OUTPUT` | Video output device |
1865
+ | 3 | `IO_DEVICE_TYPE_AUDIO_INPUT` | Audio input device |
1866
+ | 4 | `IO_DEVICE_TYPE_AUDIO_OUTPUT` | Audio output device |
808
1867
 
809
- ### JobStartRequest
810
1868
 
811
- Oneof `config`:
1869
+ ### CompositorStatus
812
1870
 
813
- | Field | Type |
814
- |-------|------|
815
- | `export_request` | ExportStartRequest |
816
- | `import_request` | ImportStartRequest |
1871
+ Compositor status.
817
1872
 
818
- ### JobAbortRequest
819
1873
 
820
1874
  | Field | Type | Description |
821
1875
  |-------|------|-------------|
822
- | `job_id` | uint32 | Job ID to abort |
823
-
824
- ### JobStatusRequest
1876
+ | `id` | string | |
825
1877
 
826
- | Field | Type | Description |
827
- |-------|------|-------------|
828
- | `job_id` | uint32 | Job ID |
829
1878
 
830
- ### JobListRequest
1879
+ ### ErrorEvent
831
1880
 
832
- Empty message — returns all jobs.
1881
+ Error event.
833
1882
 
834
- ### ExportConfiguration
835
1883
 
836
1884
  | Field | Type | Description |
837
1885
  |-------|------|-------------|
838
- | `filename` | string | Output filename |
839
- | `container` | ContainerFormat | Container format |
840
- | `video_codec` | CodecId | Video codec |
841
- | `width` | uint32 | Width |
842
- | `height` | uint32 | Height |
843
- | `fps_num` | uint32 | Frame rate numerator |
844
- | `fps_den` | uint32 | Frame rate denominator |
845
- | `rate_control` | RateControlMode | Rate control mode |
846
- | `video_bitrate_kbps` | uint32 | Video bitrate (kbps) |
847
- | `max_video_bitrate_kbps` | uint32 | Peak bitrate cap (kbps) |
848
- | `gop_size` | uint32 | GOP size (frames) |
849
- | `max_b_frames` | uint32 | Max B-frames |
850
- | `profile` | string | Codec profile (e.g. main, high) |
851
- | `level` | string | Codec level (e.g. 4.1) |
852
- | `pixel_format` | string | Pixel format (e.g. yuv420p) |
853
- | `color_primaries` | string | Color primaries (e.g. bt709) |
854
- | `color_transfer` | string | Transfer characteristics |
855
- | `color_matrix` | string | Matrix coefficients |
856
- | `full_range` | bool | Full range vs limited |
857
- | `audio_codec` | AudioCodecId | Audio codec |
858
- | `audio_bitrate_kbps` | uint32 | Audio bitrate (kbps) |
859
- | `audio_sample_rate_hz` | uint32 | Audio sample rate (Hz) |
860
- | `audio_channels` | uint32 | Audio channels |
861
- | `audio_routing` | uint32[] | Audio channel routing |
1886
+ | `msg` | string | |
862
1887
 
863
- ### ContainerFormat
864
1888
 
865
- | Value | Name |
866
- |-------|------|
867
- | 0 | `CONTAINER_FORMAT_UNSPECIFIED` |
868
- | 1 | `CONTAINER_FORMAT_MP4` |
869
- | 2 | `CONTAINER_FORMAT_MOV` |
870
- | 3 | `CONTAINER_FORMAT_MKV` |
871
- | 4 | `CONTAINER_FORMAT_MXF` |
1889
+ ### Event
872
1890
 
873
- ### AudioCodecId
1891
+ Event message wrapper.
874
1892
 
875
- | Value | Name |
876
- |-------|------|
877
- | 0 | `AUDIO_CODEC_ID_UNSPECIFIED` |
878
- | 1 | `AUDIO_CODEC_ID_AAC` |
879
- | 2 | `AUDIO_CODEC_ID_OPUS` |
880
- | 3 | `AUDIO_CODEC_ID_PCM_S16LE` |
881
- | 4 | `AUDIO_CODEC_ID_PCM_S24LE` |
882
1893
 
883
- ### RateControlMode
1894
+ | Field | Type | Description |
1895
+ |-------|------|-------------|
1896
+ | `error_event` | ErrorEvent | |
1897
+ | `transport_event` | TransportEvent | |
1898
+ | `callback_event` | sesame.v1.common.Callback | |
1899
+ | `job_event` | sesame.v1.jobs.Job | |
1900
+ | `recorder_event` | sesame.v1.recorder.RecorderEvent | |
884
1901
 
885
- | Value | Name |
886
- |-------|------|
887
- | 0 | `RATE_CONTROL_MODE_UNSPECIFIED` |
888
- | 1 | `RATE_CONTROL_MODE_CBR` |
889
- | 2 | `RATE_CONTROL_MODE_VBR` |
890
- | 3 | `RATE_CONTROL_MODE_CQ` |
891
1902
 
892
- ### ImportConfiguration
1903
+ ### IODeviceItem
1904
+
1905
+ I/O device item.
1906
+
893
1907
 
894
1908
  | Field | Type | Description |
895
1909
  |-------|------|-------------|
896
- | `src_filename` | string | Source filename |
897
- | `audio_routing` | uint32[] | Audio channel routing |
898
- | `dst_recorder_id` | string | Destination recorder ID |
899
- | `dst_clip_id` | uint64 | Destination clip ID |
900
- | `dst_clip_name` | string | Destination clip name |
901
- | `dst_clip_user_data` | string | Destination clip user data |
902
-
903
- ---
1910
+ | `id` | string | |
1911
+ | `name` | string | |
1912
+ | `type` | IODeviceType | |
904
1913
 
905
- ## Status & Events
906
1914
 
907
- `sesame.v1.status`
1915
+ ### IODeviceListResponse
908
1916
 
909
- ### Status
1917
+ I/O device list response.
910
1918
 
911
- Full system status returned by `RequestStatus`.
912
1919
 
913
1920
  | Field | Type | Description |
914
1921
  |-------|------|-------------|
915
- | `system_status` | SystemStatus | System stats |
916
- | `render_status_gpu` | FrameTiming | GPU render timing |
917
- | `render_status_cpu` | FrameTiming | CPU render timing |
918
- | `sources` | SourceStatus[] | All source status |
919
- | `compositions` | CompositorStatus[] | All compositor status |
920
- | `audio_mixes` | AudioMixerStatus[] | All audio mixer status |
921
- | `outputs` | OutputStatus[] | All output status |
922
- | `recorders` | RecorderStatus[] | All recorder status |
1922
+ | `devices` | repeated IODeviceItem | |
923
1923
 
924
- ### Event
925
1924
 
926
- Push event wrapper. Oneof `event`:
1925
+ ### Status
927
1926
 
928
- | Field | Type | Topic |
929
- |-------|------|-------|
930
- | `error_event` | ErrorEvent | `EVENT_TOPIC_ERROR` |
931
- | `transport_event` | TransportEvent | `EVENT_TOPIC_TRANSPORT` |
932
- | `callback_event` | Callback | `EVENT_TOPIC_CALLBACK` |
933
- | `job_event` | Job | `EVENT_TOPIC_JOB` |
934
- | `recorder_event` | RecorderEvent | `EVENT_TOPIC_RECORDER` |
1927
+ Overall system status.
935
1928
 
936
- ### TransportEvent
937
1929
 
938
1930
  | Field | Type | Description |
939
1931
  |-------|------|-------------|
940
- | `source_id` | string | Source ID |
941
- | `user_id` | string | User ID |
942
- | `uri` | string | Source URI |
943
- | `state` | SourceTransportState | Transport state |
944
- | `duration_us` | int64 | Duration (μs) |
945
- | `position_us` | int64 | Playback position (μs) |
946
- | `material_position_us` | int64 | Material position (μs) |
947
- | `user_time_us` | int64 | User time (μs) |
948
- | `speed` | float | Playback speed |
949
- | `user_playlist_id` | string | User playlist ID |
950
- | `playlist_index` | uint32 | Playlist item index |
951
- | `playlist_length` | uint32 | Playlist length |
952
- | `clip_id` | uint64 | Clip ID |
953
- | `clip_position_us` | int64 | Position within clip (μs) |
954
- | `clip_duration_us` | int64 | Clip duration (μs) |
955
- | `preroll` | uint32 | Pre-roll frames |
956
- | `postroll` | uint32 | Post-roll frames |
957
- | `metadata` | string | Transport metadata |
1932
+ | `system_status` | SystemStatus | |
1933
+ | `render_status_gpu` | FrameTiming | |
1934
+ | `render_status_cpu` | FrameTiming | |
1935
+ | `sources` | repeated sesame.v1.sources.SourceStatus | |
1936
+ | `compositions` | repeated CompositorStatus | |
1937
+ | `audio_mixes` | repeated sesame.v1.audio.AudioMixerStatus | |
1938
+ | `outputs` | repeated sesame.v1.outputs.OutputStatus | |
1939
+ | `recorders` | repeated sesame.v1.recorder.RecorderStatus | |
1940
+
958
1941
 
959
1942
  ### SubscriptionRequest
960
1943
 
1944
+ Subscription request.
1945
+
1946
+
961
1947
  | Field | Type | Description |
962
1948
  |-------|------|-------------|
963
- | `event_topics` | EventTopic[] | Topics to subscribe to |
964
- | `channels` | string[] | Dynamic channels (e.g. `media-stream/<id>`) |
1949
+ | `event_topics` | repeated sesame.v1.common.EventTopic | |
1950
+ | `channels` | repeated string | |
1951
+
1952
+
1953
+ ### TransportEvent
1954
+
1955
+ Transport event (source playback state change).
965
1956
 
966
- ### IODeviceItem
967
1957
 
968
1958
  | Field | Type | Description |
969
1959
  |-------|------|-------------|
970
- | `id` | string | Device ID |
971
- | `name` | string | Device name |
972
- | `type` | IODeviceType | Device type |
973
-
974
- ### IODeviceType
1960
+ | `source_id` | string | |
1961
+ | `user_id` | string | |
1962
+ | `uri` | string | |
1963
+ | `state` | sesame.v1.sources.SourceTransportState | |
1964
+ | `duration_us` | int64 | |
1965
+ | `position_us` | int64 | |
1966
+ | `material_position_us` | int64 | |
1967
+ | `user_time_us` | int64 | |
1968
+ | `speed` | float | |
1969
+ | `user_playlist_id` | string | |
1970
+ | `playlist_index` | uint32 | |
1971
+ | `playlist_length` | uint32 | |
1972
+ | `clip_id` | uint64 | |
1973
+ | `clip_position_us` | int64 | |
1974
+ | `clip_duration_us` | int64 | |
1975
+ | `preroll` | uint32 | |
1976
+ | `postroll` | uint32 | |
1977
+ | `metadata` | sesame.v1.common.TransportMetadata | |
975
1978
 
976
- | Value | Name |
977
- |-------|------|
978
- | 0 | `IO_DEVICE_TYPE_UNSPECIFIED` |
979
- | 1 | `IO_DEVICE_TYPE_VIDEO_INPUT` |
980
- | 2 | `IO_DEVICE_TYPE_VIDEO_OUTPUT` |
981
- | 3 | `IO_DEVICE_TYPE_AUDIO_INPUT` |
982
- | 4 | `IO_DEVICE_TYPE_AUDIO_OUTPUT` |
983
1979
 
984
1980
  ---
985
1981
 
986
- ## Statistics
987
1982
 
988
- `sesame.v1.status`
1983
+ ## sesame/v1/wire/wire.proto
989
1984
 
990
- ### FrameTiming
1985
+ `sesame.v1.wire`
991
1986
 
992
- | Field | Type | Description |
993
- |-------|------|-------------|
994
- | `frame_time` | int32 | Current frame time (μs) |
995
- | `frame_time_avg` | int32 | Average frame time (μs) |
996
- | `frame_time_min` | int32 | Minimum frame time (μs) |
997
- | `frame_time_max` | int32 | Maximum frame time (μs) |
998
1987
 
999
- ### SystemStatus
1000
1988
 
1001
- | Field | Type | Description |
1002
- |-------|------|-------------|
1003
- | `uptime` | uint64 | Uptime (seconds) |
1004
- | `framedrops` | uint32 | Total frames dropped |
1005
- | `framerate` | float | Current framerate |
1006
- | `gpu_mem` | uint64 | GPU memory used (deprecated) |
1007
- | `cpu_mem` | uint64 | CPU memory used (bytes) |
1008
- | `mem_gpu_pool` | MemoryDomainStats | GPU pool memory |
1009
- | `mem_cpu_pool` | MemoryDomainStats | CPU pool memory |
1010
- | `mem_gpu_adhoc` | MemoryDomainStats | GPU ad-hoc allocations |
1011
- | `mem_gpu_pinned` | MemoryDomainStats | GPU pinned memory |
1012
- | `gpu_mem_total` | uint64 | Total GPU memory (bytes) |
1013
- | `gpu_mem_used` | uint64 | Used GPU memory (bytes) |
1014
- | `gpu_utilization` | uint32 | SM compute utilization (0–100) |
1015
- | `gpu_mem_utilization` | uint32 | Memory controller (0–100) |
1016
- | `gpu_encoder_utilization` | uint32 | NVENC utilization (0–100) |
1017
- | `gpu_decoder_utilization` | uint32 | NVDEC utilization (0–100) |
1018
- | `gpu_name` | string | GPU model name |
1019
- | `vma_bytes` | uint64 | Vulkan Memory Allocator bytes |
1020
1989
 
1021
- ### MemoryDomainStats
1990
+ ### FrameType
1022
1991
 
1023
- | Field | Type | Description |
1992
+ Type of frame carried on the wire.
1993
+
1994
+ | Value | Name | Description |
1024
1995
  |-------|------|-------------|
1025
- | `current_bytes` | uint64 | Current allocated |
1026
- | `peak_bytes` | uint64 | Peak allocated |
1027
- | `budget_bytes` | uint64 | Budget limit |
1996
+ | 0 | `FRAME_TYPE_UNSPECIFIED` | |
1997
+ | 1 | `FRAME_TYPE_RPC` | |
1998
+ | 2 | `FRAME_TYPE_VIDEO` | |
1999
+ | 3 | `FRAME_TYPE_AUDIO` | |
2000
+ | 4 | `FRAME_TYPE_MUXED` | |
2001
+ | 5 | `FRAME_TYPE_DECODER_DATA` | |
2002
+ | 6 | `FRAME_TYPE_DATA` | |
1028
2003
 
1029
- ### SRTReceiveStatistics
1030
2004
 
1031
- | Field | Type | Description |
1032
- |-------|------|-------------|
1033
- | `packets_received` | int64 | Total packets received |
1034
- | `packets_received_lost` | int32 | Packets lost |
1035
- | `packet_ack_sent` | int32 | ACK packets sent |
1036
- | `packet_nack_sent` | int32 | NACK packets sent |
1037
- | `bytes_received` | int64 | Total bytes received |
1038
- | `bytes_received_lost` | int64 | Bytes lost |
1039
- | `receive_rate_mbps` | double | Receive rate (Mbps) |
1040
- | `tsbpd_delay` | int32 | TSBPD delay (ms) |
1041
- | `bandwidth_mbps` | double | Available bandwidth (Mbps) |
1042
- | `rtt_ms` | double | Round-trip time (ms) |
2005
+ ### FrameHeader
2006
+
2007
+ Header for every websocket / MoQ frame.
2008
+ Serialized with a 4-byte little-endian size prefix on the wire.
1043
2009
 
1044
- ### SRTSendStatistics
1045
2010
 
1046
2011
  | Field | Type | Description |
1047
2012
  |-------|------|-------------|
1048
- | `packets_sent` | int64 | Total packets sent |
1049
- | `packets_sent_lost` | int32 | Packets lost |
1050
- | `packets_sent_dropped` | int32 | Packets dropped |
1051
- | `packets_retransmitted` | int32 | Packets retransmitted |
1052
- | `packet_ack_received` | int32 | ACK packets received |
1053
- | `packet_nack_received` | int32 | NACK packets received |
1054
- | `bytes_sent` | int64 | Total bytes sent |
1055
- | `bytes_sent_dropped` | int64 | Bytes dropped |
1056
- | `send_rate_mbps` | double | Send rate (Mbps) |
1057
- | `bandwidth_mbps` | double | Available bandwidth (Mbps) |
1058
- | `rtt_ms` | double | Round-trip time (ms) |
2013
+ | `type` | FrameType | |
2014
+ | `routing_metadata` | string | |
2015
+ | `media` | MediaFrameData | |
1059
2016
 
1060
- ---
1061
2017
 
1062
- ## Service Methods
2018
+ ### MediaCodecData
1063
2019
 
1064
- `sesame.v1.rpc.SesameAPIService`
2020
+ Codec parameters for a media stream.
1065
2021
 
1066
- | Method | Request | Response | Description |
1067
- |--------|---------|----------|-------------|
1068
- | `ExecuteCommandList` | CommandList | CommandExecutionResponse | Execute batched commands |
1069
- | `UpdateSubscriptions` | SubscriptionRequest | Empty | Update event subscriptions |
1070
- | `RequestStatus` | Empty | Status | Get full system status |
1071
- | `RequestEvents` | Empty | stream Event | Subscribe to events (server streaming) |
1072
- | `StartJob` | JobStartRequest | Job | Start export/import job |
1073
- | `AbortJob` | JobAbortRequest | Job | Abort a running job |
1074
- | `GetJobStatus` | JobStatusRequest | Job | Get job status by ID |
1075
- | `ListJobs` | JobListRequest | JobList | List all jobs |
1076
- | `RequestRecorderOperation` | RecorderRequest | RecorderResponse | Recorder operations |
1077
- | `RequestKeyframe` | KeyframeRequest | Empty | Request keyframe from encoder |
1078
- | `RequestIODeviceList` | Empty | IODeviceListResponse | List I/O devices |
1079
2022
 
1080
- ---
2023
+ | Field | Type | Description |
2024
+ |-------|------|-------------|
2025
+ | `codec_type` | sesame.v1.common.CodecType | |
2026
+ | `sample_rate` | uint32 | |
2027
+ | `timebase_num` | uint32 | |
2028
+ | `timebase_den` | uint32 | |
2029
+ | `codec_profile` | uint32 | |
2030
+ | `codec_level` | uint32 | |
2031
+ | `width` | uint32 | |
2032
+ | `height` | uint32 | |
2033
+ | `channels` | uint32 | |
2034
+ | `bit_depth` | uint32 | |
1081
2035
 
1082
- ## Event Subscriptions
1083
2036
 
1084
- Clients must subscribe to receive push events. Call `UpdateSubscriptions` with desired `EventTopic` values:
2037
+ ### MediaFrameData
1085
2038
 
1086
- ```typescript
1087
- client.addSubscription(sesame.v1.common.EventTopic.EVENT_TOPIC_TRANSPORT, callback);
1088
- client.addSubscription(sesame.v1.common.EventTopic.EVENT_TOPIC_JOB, callback);
1089
- ```
2039
+ Media-specific fields for VIDEO, AUDIO, MUXED, and DECODER_DATA frames.
2040
+
2041
+
2042
+ | Field | Type | Description |
2043
+ |-------|------|-------------|
2044
+ | `pts` | uint64 | |
2045
+ | `keyframe` | bool | |
2046
+ | `codec_data` | MediaCodecData | |
1090
2047
 
1091
- | Topic | Event type | When fired |
1092
- |-------|-----------|------------|
1093
- | `EVENT_TOPIC_ERROR` | ErrorEvent | Engine error |
1094
- | `EVENT_TOPIC_TRANSPORT` | TransportEvent | Source playback state change |
1095
- | `EVENT_TOPIC_CALLBACK` | Callback | Client callback command echoed |
1096
- | `EVENT_TOPIC_JOB` | Job | Job lifecycle change + progress (~2 Hz) |
1097
- | `EVENT_TOPIC_RECORDER` | RecorderEvent | Recorder online/offline |
1098
2048
 
1099
2049
  ---
1100
2050
 
2051
+
1101
2052
  ## Scene Graph Properties
1102
2053
 
1103
2054
  Properties are set via `PropertySetRequest` or animated via `PropertyAnimateRequest`. The `domain` field identifies the owning engine object.
@@ -1108,19 +2059,19 @@ Properties are set via `PropertySetRequest` or animated via `PropertyAnimateRequ
1108
2059
 
1109
2060
  | Property | Type | Description |
1110
2061
  |----------|------|-------------|
2062
+ | `position` | vec4 | XYZ position |
1111
2063
  | `position.x` | float | X position |
1112
2064
  | `position.y` | float | Y position |
1113
- | `position.z` | float | Z position |
1114
- | `position` | vec4 | XYZ position |
2065
+ | `position.z` | float | Z position / depth |
2066
+ | `scale` | vec4 | XYZ scale |
1115
2067
  | `scale.x` | float | X scale |
1116
2068
  | `scale.y` | float | Y scale |
1117
2069
  | `scale.z` | float | Z scale |
1118
- | `scale` | vec4 | XYZ scale |
1119
- | `rotation.x` | float | X rotation |
1120
- | `rotation.y` | float | Y rotation |
1121
- | `rotation.z` | float | Z rotation |
1122
- | `rotation` | vec4 | XYZ rotation |
1123
- | `opacity` | float | Opacity (0–1) |
2070
+ | `rotation` | vec4 | XYZ rotation (degrees) |
2071
+ | `rotation.x` | float | X rotation (degrees) |
2072
+ | `rotation.y` | float | Y rotation (degrees) |
2073
+ | `rotation.z` | float | Z rotation (degrees) |
2074
+ | `opacity` | float | Opacity (0-1) |
1124
2075
  | `priority` | float | Render priority (z-order) |
1125
2076
  | `visible` | bool | Visibility |
1126
2077
  | `alpha_map` | string | Alpha map source ID |
@@ -1129,7 +2080,7 @@ Properties are set via `PropertySetRequest` or animated via `PropertyAnimateRequ
1129
2080
 
1130
2081
  | Property | Type | Description |
1131
2082
  |----------|------|-------------|
1132
- | `size` | vec4 | Width/height |
2083
+ | `size` | vec4 | Width and height |
1133
2084
  | `size.x` | float | Width |
1134
2085
  | `size.y` | float | Height |
1135
2086
  | `origin` | vec4 | Origin point |
@@ -1173,14 +2124,22 @@ Properties are set via `PropertySetRequest` or animated via `PropertyAnimateRequ
1173
2124
 
1174
2125
  #### Effects
1175
2126
 
1176
- **All effects:** `enabled` (bool)
2127
+ **All effects:**
2128
+
2129
+ | Property | Type | Description |
2130
+ |----------|------|-------------|
2131
+ | `enabled` | bool | Enable/disable the effect |
1177
2132
 
1178
- **RTT Effect:** `rtt-id` (string)
2133
+ **RTT Effect:**
2134
+
2135
+ | Property | Type | Description |
2136
+ |----------|------|-------------|
2137
+ | `rtt-id` | string | Render-to-texture target ID |
1179
2138
 
1180
2139
  **Timecode Effect:**
1181
2140
 
1182
- | Property | Type | Values |
1183
- |----------|------|--------|
2141
+ | Property | Type | Description |
2142
+ |----------|------|-------------|
1184
2143
  | `timecode_type` | string | `internal`, `time_of_day`, `recorder`, `recorder_internal`, `recorder_clip_countdown`, `recorder_playlist_countdown`, `recorder_internal_offset`, `recorder_free_space`, `recorder_playback_speed` |
1185
2144
  | `timecode_src` | string | Source ID for timecode |
1186
2145
 
@@ -1189,10 +2148,10 @@ Properties are set via `PropertySetRequest` or animated via `PropertyAnimateRequ
1189
2148
  | Property | Type | Description |
1190
2149
  |----------|------|-------------|
1191
2150
  | `clip-plane` | vec4 | Clip plane XYZW |
1192
- | `clip-plane.r` / `.x` | float | Clip plane X |
1193
- | `clip-plane.g` / `.y` | float | Clip plane Y |
1194
- | `clip-plane.b` / `.z` | float | Clip plane Z |
1195
- | `clip-plane.a` / `.w` | float | Clip plane W |
2151
+ | `clip-plane.x` | float | Clip plane X |
2152
+ | `clip-plane.y` | float | Clip plane Y |
2153
+ | `clip-plane.z` | float | Clip plane Z |
2154
+ | `clip-plane.w` | float | Clip plane W |
1196
2155
  | `feather` | float | Feather amount |
1197
2156
 
1198
2157
  ### Audio Mixer Domain (`domain.audio_mixer_id`)
@@ -1201,8 +2160,8 @@ Address format: `channel_id` for channel properties, `channel_id/plugin_id` for
1201
2160
 
1202
2161
  | Property | Type | Description |
1203
2162
  |----------|------|-------------|
1204
- | `level` | float | Channel level (01) |
1205
- | `pan` | float | Pan position (1 to 1) |
2163
+ | `level` | float | Channel level (0-1) |
2164
+ | `pan` | float | Pan position (-1 to 1) |
1206
2165
  | `mute` | bool | Mute channel |
1207
2166
  | `source_channels` | vec4 | Source channel routing |
1208
2167
  | `source_id` | string | Source ID |
@@ -1216,3 +2175,26 @@ Address format: `processor_id` for preprocessor parameters.
1216
2175
  |----------|------|-------------|
1217
2176
  | `audio_level` | float | Source audio level |
1218
2177
  | `<param_id>` | float | Preprocessor parameter (numeric ID as string) |
2178
+
2179
+
2180
+ <!-- Hand-maintained sections — appended to generated protocol-reference.md -->
2181
+ <!-- Scene Graph Properties are now auto-generated from property-registry.h -->
2182
+
2183
+ ## Event Subscriptions
2184
+
2185
+ Clients must subscribe to receive push events. Call `UpdateSubscriptions` with desired `EventTopic` values:
2186
+
2187
+ ```typescript
2188
+ client.addSubscription(sesame.v1.common.EventTopic.EVENT_TOPIC_TRANSPORT, callback);
2189
+ client.addSubscription(sesame.v1.common.EventTopic.EVENT_TOPIC_JOB, callback);
2190
+ ```
2191
+
2192
+ | Topic | Event type | When fired |
2193
+ |-------|-----------|------------|
2194
+ | `EVENT_TOPIC_ERROR` | ErrorEvent | Engine error |
2195
+ | `EVENT_TOPIC_TRANSPORT` | TransportEvent | Source playback state change |
2196
+ | `EVENT_TOPIC_CALLBACK` | Callback | Client callback command echoed |
2197
+ | `EVENT_TOPIC_JOB` | Job | Job lifecycle change + progress (~2 Hz) |
2198
+ | `EVENT_TOPIC_RECORDER` | RecorderEvent | Recorder online/offline |
2199
+
2200
+