@stinkycomputing/sesame-api-client 1.4.1-beta.5 → 1.4.1-beta.7

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.
@@ -0,0 +1,1218 @@
1
+ # Sesame Protocol Reference
2
+
3
+ Complete reference for all protobuf types available through `@stinkycomputing/sesame-api-client`.
4
+
5
+ ```typescript
6
+ import { sesame } from '@stinkycomputing/sesame-api-client';
7
+ // All types under sesame.v1.*
8
+ ```
9
+
10
+ ---
11
+
12
+ ## Table of Contents
13
+
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)
27
+ - [Event Subscriptions](#event-subscriptions)
28
+ - [Scene Graph Properties](#scene-graph-properties)
29
+
30
+ ---
31
+
32
+ ## Wire Protocol
33
+
34
+ `sesame.v1.wire`
35
+
36
+ Every WebSocket message is framed as:
37
+
38
+ ```
39
+ [4-byte LE header_size][FrameHeader protobuf][payload bytes]
40
+ ```
41
+
42
+ ### FrameType
43
+
44
+ | Value | Name | Description |
45
+ |-------|------|-------------|
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 |
53
+
54
+ ### CodecType
55
+
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` |
67
+
68
+ ### MediaCodecData
69
+
70
+ | Field | Type | Description |
71
+ |-------|------|-------------|
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 |
82
+
83
+ ### FrameHeader
84
+
85
+ | Field | Type | Description |
86
+ |-------|------|-------------|
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) |
93
+
94
+ ---
95
+
96
+ ## Common Types
97
+
98
+ `sesame.v1.common`
99
+
100
+ ### ConnectionState
101
+
102
+ | Value | Name | Description |
103
+ |-------|------|-------------|
104
+ | 0 | `CONNECTION_STATE_UNSPECIFIED` | Invalid |
105
+ | 1 | `CONNECTION_STATE_INITIALIZING` | Initializing resources |
106
+ | 2 | `CONNECTION_STATE_CONNECTING` | Connecting/opening |
107
+ | 3 | `CONNECTION_STATE_ONLINE` | Healthy and running |
108
+ | 4 | `CONNECTION_STATE_DEGRADED` | Running with reduced health |
109
+ | 5 | `CONNECTION_STATE_OFFLINE` | Stopped or unavailable |
110
+ | 6 | `CONNECTION_STATE_ERROR` | Failed with error |
111
+
112
+ ### VideoFormat
113
+
114
+ | Value | Name | Description |
115
+ |-------|------|-------------|
116
+ | 0 | `VIDEO_FORMAT_UNSPECIFIED` | Invalid |
117
+ | 1 | `VIDEO_FORMAT_1080_50I` | 1080i50 |
118
+ | 2 | `VIDEO_FORMAT_1080_50P` | 1080p50 |
119
+ | 3 | `VIDEO_FORMAT_1080_60I` | 1080i60 |
120
+ | 4 | `VIDEO_FORMAT_1080_60P` | 1080p60 |
121
+
122
+ ### CodecId
123
+
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 |
133
+
134
+ ### EventTopic
135
+
136
+ | Value | Name | Description |
137
+ |-------|------|-------------|
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 |
144
+
145
+ ### Vec4
146
+
147
+ | Field | Type | Description |
148
+ |-------|------|-------------|
149
+ | `x` | float | Red / X |
150
+ | `y` | float | Green / Y |
151
+ | `z` | float | Blue / Z |
152
+ | `w` | float | Alpha / W |
153
+
154
+ ### PropValue
155
+
156
+ Oneof `value`:
157
+
158
+ | Field | Type | Description |
159
+ |-------|------|-------------|
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 |
165
+
166
+ ### PropertyDomain
167
+
168
+ Identifies which engine object owns the property. Oneof `owner`:
169
+
170
+ | Field | Type | Description |
171
+ |-------|------|-------------|
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) |
176
+
177
+ ### Callback
178
+
179
+ | Field | Type | Description |
180
+ |-------|------|-------------|
181
+ | `event` | string | Event name identifier |
182
+ | `data` | string | Event data (JSON or other) |
183
+
184
+ ---
185
+
186
+ ## RPC Envelope
187
+
188
+ `sesame.v1.rpc`
189
+
190
+ ### Message
191
+
192
+ Oneof `payload`:
193
+
194
+ | Field | Type | Description |
195
+ |-------|------|-------------|
196
+ | `request` | Request | Client → server request |
197
+ | `response` | Response | Server → client response |
198
+ | `event` | Event | Server → client push event |
199
+
200
+ ### Request
201
+
202
+ | Field | Type | Description |
203
+ |-------|------|-------------|
204
+ | `method` | string | RPC method name (e.g. `"ExecuteCommandList"`) |
205
+ | `seq` | uint32 | Sequence number for response matching |
206
+ | `payload` | bytes | Serialized request protobuf |
207
+
208
+ ### Response
209
+
210
+ | Field | Type | Description |
211
+ |-------|------|-------------|
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) |
216
+
217
+ ### Event
218
+
219
+ | Field | Type | Description |
220
+ |-------|------|-------------|
221
+ | `topic` | EventTopic | Event topic |
222
+ | `payload` | bytes | Serialized `status.Event` protobuf |
223
+
224
+ ---
225
+
226
+ ## Commands
227
+
228
+ `sesame.v1.commands`
229
+
230
+ Commands are batched into a `CommandList` and executed atomically via `ExecuteCommandList`.
231
+
232
+ ### CommandListItem
233
+
234
+ | Field | Type | Description |
235
+ |-------|------|-------------|
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 |
267
+
268
+ ---
269
+
270
+ ## Sources
271
+
272
+ `sesame.v1.sources`
273
+
274
+ ### SourceType
275
+
276
+ | Value | Name | Description |
277
+ |-------|------|-------------|
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 |
289
+
290
+ ### SourceTransportState
291
+
292
+ | Value | Name | Description |
293
+ |-------|------|-------------|
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) |
299
+
300
+ ### SourceTransportCommandType
301
+
302
+ | Value | Name | Description |
303
+ |-------|------|-------------|
304
+ | 0 | `SOURCE_TRANSPORT_CMD_UNSPECIFIED` | Invalid |
305
+ | 1 | `SOURCE_TRANSPORT_CMD_STOP` | Stop playback |
306
+ | 2 | `SOURCE_TRANSPORT_CMD_PLAY` | Start playback |
307
+ | 3 | `SOURCE_TRANSPORT_CMD_SEEK` | Seek to position |
308
+ | 4 | `SOURCE_TRANSPORT_CMD_LOOP` | Set loop mode |
309
+ | 5 | `SOURCE_TRANSPORT_CMD_LIVE` | Switch to live |
310
+ | 6 | `SOURCE_TRANSPORT_CMD_JOG` | Jog forward/backward |
311
+ | 7 | `SOURCE_TRANSPORT_CMD_MONITOR` | Monitor mode |
312
+ | 8 | `SOURCE_TRANSPORT_CMD_SEEK_USER_TIME` | Seek to user timecode |
313
+ | 9 | `SOURCE_TRANSPORT_CMD_TAKE` | Take (cut to next) |
314
+ | 10 | `SOURCE_TRANSPORT_CMD_POST_ROLL` | Post-roll |
315
+ | 11 | `SOURCE_TRANSPORT_CMD_PRE_ROLL` | Pre-roll |
316
+ | 12 | `SOURCE_TRANSPORT_CMD_NEXT` | Next item |
317
+ | 13 | `SOURCE_TRANSPORT_CMD_SKIP_NEXT` | Skip to next |
318
+ | 14 | `SOURCE_TRANSPORT_CMD_TRANSITIONS_DISABLED` | Disable transitions |
319
+ | 15 | `SOURCE_TRANSPORT_CMD_SET_SCRUBBING` | Set scrubbing mode |
320
+
321
+ ### DecoderType
322
+
323
+ | Value | Name |
324
+ |-------|------|
325
+ | 0 | `DECODER_TYPE_UNSPECIFIED` |
326
+ | 1 | `DECODER_TYPE_H264` |
327
+ | 2 | `DECODER_TYPE_HEVC` |
328
+ | 3 | `DECODER_TYPE_AV1` |
329
+
330
+ ### DeinterlaceType
331
+
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
+
339
+ ### SourceTextureSize
340
+
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
+
347
+ ### PreprocessStep
348
+
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
+
356
+ ### SourceCommonConfig
357
+
358
+ Shared settings for all source types.
359
+
360
+ | Field | Type | Description |
361
+ |-------|------|-------------|
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 |
372
+
373
+ ### SourceConfig
374
+
375
+ | Field | Type | Description |
376
+ |-------|------|-------------|
377
+ | `common` | SourceCommonConfig | Shared settings |
378
+
379
+ Oneof `details` — exactly one required:
380
+
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` |
393
+
394
+ ### Source Type Configs
395
+
396
+ **FileSourceConfig** — `{ url: string }`
397
+
398
+ **RecorderSourceConfig** — `{ recorder_id: string, decoder_type: DecoderType }`
399
+
400
+ **BrowserSourceConfig** — `{ url: string, width?: uint32, height?: uint32 }`
401
+
402
+ **RTTSourceConfig** — `{ rtt_id: string, audio_mixes: string[], delay_frames: uint32 }`
403
+
404
+ **DecklinkSourceConfig** — `{ device_index: uint32, video_format: VideoFormat, sync_group?: uint32 }`
405
+
406
+ **SignalGeneratorSourceConfig** — `{}` (no fields)
407
+
408
+ **SystemAudioSourceConfig** — `{ device_name: string }` (empty = default device)
409
+
410
+ **SrtSourceConfig** — `{ url: string, decode_buffer_frames: uint32 }`
411
+
412
+ **WebsocketSourceConfig** — `{ channel: string, decode_buffer_frames: uint32 }`
413
+
414
+ **MoqSourceConfig** — `{ url: string, broadcast: string, key: string, decode_buffer_frames: uint32 }`
415
+
416
+ ### SourceTransportCommand
417
+
418
+ | Field | Type | Description |
419
+ |-------|------|-------------|
420
+ | `source_id` | string | Source ID |
421
+ | `cmd_type` | SourceTransportCommandType | Command type |
422
+ | `value` | PropValue | Command value |
423
+
424
+ ### LoadPlaylistRequest
425
+
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) |
434
+
435
+ ### SourceStatus
436
+
437
+ | Field | Type | Description |
438
+ |-------|------|-------------|
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) |
460
+
461
+ ---
462
+
463
+ ## Outputs
464
+
465
+ `sesame.v1.outputs`
466
+
467
+ ### OutputType
468
+
469
+ | Value | Name | Description |
470
+ |-------|------|-------------|
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 |
479
+
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
+
488
+ ### EncoderPreset
489
+
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 |
496
+
497
+ ### EncoderConfig
498
+
499
+ | Field | Type | Description |
500
+ |-------|------|-------------|
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 |
508
+
509
+ ### OutputAddRequest
510
+
511
+ | Field | Type | Description |
512
+ |-------|------|-------------|
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 |
517
+
518
+ Oneof `output` — exactly one required:
519
+
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 |
529
+
530
+ ### Output Type Configs
531
+
532
+ **EncodedWebSocketOutputConfig** — `{ channel: string, encoder: EncoderConfig }`
533
+
534
+ **EncodedRecorderOutputConfig** — `{ encoder: EncoderConfig, filename: string, size_gb: uint32, group_id: string, recorder_type: RecorderType }`
535
+
536
+ **EncodedSuperSlowMoRecorderOutputConfig** — Same as recorder + `{ composition_ids: string[], source_ids: string[] }`
537
+
538
+ **EncodedSrtOutputConfig** — `{ url: string, encoder: EncoderConfig }`
539
+
540
+ **EncodedMoqOutputConfig** — `{ encoder: EncoderConfig, url: string, broadcast: string, key: string }`
541
+
542
+ **DecklinkOutputConfig** — `{ device_index: uint32, video_format: VideoFormat, key_and_fill: bool }`
543
+
544
+ **SystemAudioOutputConfig** — `{ device_name: string }`
545
+
546
+ ### OutputStatus
547
+
548
+ | Field | Type | Description |
549
+ |-------|------|-------------|
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) |
557
+
558
+ ---
559
+
560
+ ## Compositor & Scene Graph
561
+
562
+ `sesame.v1.compositor`
563
+
564
+ ### NodeType
565
+
566
+ | Value | Name | Description |
567
+ |-------|------|-------------|
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
578
+
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
+
586
+ ### CompositorAddRequest
587
+
588
+ | Field | Type | Description |
589
+ |-------|------|-------------|
590
+ | `id` | string | Unique compositor ID |
591
+ | `multisample` | bool | Enable MSAA |
592
+ | `width` | uint32 | Width |
593
+ | `height` | uint32 | Height |
594
+
595
+ ### NodeAddRequest
596
+
597
+ | Field | Type | Description |
598
+ |-------|------|-------------|
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 |
603
+
604
+ ### PropertySetRequest
605
+
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 |
612
+
613
+ ### PropertyAnimateRequest
614
+
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
+
624
+ ### KeyFrame
625
+
626
+ | Field | Type | Description |
627
+ |-------|------|-------------|
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 |
632
+
633
+ ---
634
+
635
+ ## Audio Mixer
636
+
637
+ `sesame.v1.audio`
638
+
639
+ ### AudioMixerChannelType
640
+
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
+
647
+ ### AudioMixerChannel
648
+
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
+
659
+ ### AudioPlugin
660
+
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 |
667
+
668
+ ### AudioMixerConfig
669
+
670
+ | Field | Type | Description |
671
+ |-------|------|-------------|
672
+ | `channels` | AudioMixerChannel[] | Mixer channels |
673
+ | `output_type` | AudioMixerChannelType | Output channel type |
674
+ | `order` | uint32 | Processing order |
675
+
676
+ ### AudioMixerStatus
677
+
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 |
684
+
685
+ ### AudioChannelStatus
686
+
687
+ | Field | Type | Description |
688
+ |-------|------|-------------|
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
+ ---
699
+
700
+ ## Recorder
701
+
702
+ `sesame.v1.recorder`
703
+
704
+ ### TransitionType
705
+
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 |
712
+
713
+ ### RecorderClip
714
+
715
+ | Field | Type | Description |
716
+ |-------|------|-------------|
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) |
726
+
727
+ ### PlaylistItem
728
+
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) |
741
+
742
+ ### RecorderRequest
743
+
744
+ | Field | Type | Description |
745
+ |-------|------|-------------|
746
+ | `recorder_id` | string | Recorder ID |
747
+
748
+ Oneof `request`:
749
+
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 |
761
+
762
+ ### RecorderEvent
763
+
764
+ | Field | Type | Description |
765
+ |-------|------|-------------|
766
+ | `id` | string | Recorder ID |
767
+ | `online` | bool | Is recorder online |
768
+ | `message` | string? | Event message |
769
+
770
+ ---
771
+
772
+ ## Jobs
773
+
774
+ `sesame.v1.jobs`
775
+
776
+ ### JobType
777
+
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
+
784
+ ### JobStatus
785
+
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
+
795
+ ### Job
796
+
797
+ | Field | Type | Description |
798
+ |-------|------|-------------|
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) |
808
+
809
+ ### JobStartRequest
810
+
811
+ Oneof `config`:
812
+
813
+ | Field | Type |
814
+ |-------|------|
815
+ | `export_request` | ExportStartRequest |
816
+ | `import_request` | ImportStartRequest |
817
+
818
+ ### JobAbortRequest
819
+
820
+ | Field | Type | Description |
821
+ |-------|------|-------------|
822
+ | `job_id` | uint32 | Job ID to abort |
823
+
824
+ ### JobStatusRequest
825
+
826
+ | Field | Type | Description |
827
+ |-------|------|-------------|
828
+ | `job_id` | uint32 | Job ID |
829
+
830
+ ### JobListRequest
831
+
832
+ Empty message — returns all jobs.
833
+
834
+ ### ExportConfiguration
835
+
836
+ | Field | Type | Description |
837
+ |-------|------|-------------|
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 |
862
+
863
+ ### ContainerFormat
864
+
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` |
872
+
873
+ ### AudioCodecId
874
+
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
+
883
+ ### RateControlMode
884
+
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
+
892
+ ### ImportConfiguration
893
+
894
+ | Field | Type | Description |
895
+ |-------|------|-------------|
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
+ ---
904
+
905
+ ## Status & Events
906
+
907
+ `sesame.v1.status`
908
+
909
+ ### Status
910
+
911
+ Full system status returned by `RequestStatus`.
912
+
913
+ | Field | Type | Description |
914
+ |-------|------|-------------|
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 |
923
+
924
+ ### Event
925
+
926
+ Push event wrapper. Oneof `event`:
927
+
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` |
935
+
936
+ ### TransportEvent
937
+
938
+ | Field | Type | Description |
939
+ |-------|------|-------------|
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 |
958
+
959
+ ### SubscriptionRequest
960
+
961
+ | Field | Type | Description |
962
+ |-------|------|-------------|
963
+ | `event_topics` | EventTopic[] | Topics to subscribe to |
964
+ | `channels` | string[] | Dynamic channels (e.g. `media-stream/<id>`) |
965
+
966
+ ### IODeviceItem
967
+
968
+ | Field | Type | Description |
969
+ |-------|------|-------------|
970
+ | `id` | string | Device ID |
971
+ | `name` | string | Device name |
972
+ | `type` | IODeviceType | Device type |
973
+
974
+ ### IODeviceType
975
+
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
+
984
+ ---
985
+
986
+ ## Statistics
987
+
988
+ `sesame.v1.status`
989
+
990
+ ### FrameTiming
991
+
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
+
999
+ ### SystemStatus
1000
+
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
+
1021
+ ### MemoryDomainStats
1022
+
1023
+ | Field | Type | Description |
1024
+ |-------|------|-------------|
1025
+ | `current_bytes` | uint64 | Current allocated |
1026
+ | `peak_bytes` | uint64 | Peak allocated |
1027
+ | `budget_bytes` | uint64 | Budget limit |
1028
+
1029
+ ### SRTReceiveStatistics
1030
+
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) |
1043
+
1044
+ ### SRTSendStatistics
1045
+
1046
+ | Field | Type | Description |
1047
+ |-------|------|-------------|
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) |
1059
+
1060
+ ---
1061
+
1062
+ ## Service Methods
1063
+
1064
+ `sesame.v1.rpc.SesameAPIService`
1065
+
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
+
1080
+ ---
1081
+
1082
+ ## Event Subscriptions
1083
+
1084
+ Clients must subscribe to receive push events. Call `UpdateSubscriptions` with desired `EventTopic` values:
1085
+
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
+ ```
1090
+
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
+
1099
+ ---
1100
+
1101
+ ## Scene Graph Properties
1102
+
1103
+ Properties are set via `PropertySetRequest` or animated via `PropertyAnimateRequest`. The `domain` field identifies the owning engine object.
1104
+
1105
+ ### Compositor Domain (`domain.compositor_id`)
1106
+
1107
+ #### Base Node Properties (all node types)
1108
+
1109
+ | Property | Type | Description |
1110
+ |----------|------|-------------|
1111
+ | `position.x` | float | X position |
1112
+ | `position.y` | float | Y position |
1113
+ | `position.z` | float | Z position |
1114
+ | `position` | vec4 | XYZ position |
1115
+ | `scale.x` | float | X scale |
1116
+ | `scale.y` | float | Y scale |
1117
+ | `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) |
1124
+ | `priority` | float | Render priority (z-order) |
1125
+ | `visible` | bool | Visibility |
1126
+ | `alpha_map` | string | Alpha map source ID |
1127
+
1128
+ #### Mesh Node (Video Box, Image, Group)
1129
+
1130
+ | Property | Type | Description |
1131
+ |----------|------|-------------|
1132
+ | `size` | vec4 | Width/height |
1133
+ | `size.x` | float | Width |
1134
+ | `size.y` | float | Height |
1135
+ | `origin` | vec4 | Origin point |
1136
+ | `origin.x` | float | Origin X |
1137
+ | `origin.y` | float | Origin Y |
1138
+ | `color` | vec4 | Color RGBA |
1139
+ | `color.r` | float | Red |
1140
+ | `color.g` | float | Green |
1141
+ | `color.b` | float | Blue |
1142
+ | `color.a` | float | Alpha |
1143
+
1144
+ #### Text Node
1145
+
1146
+ | Property | Type | Description |
1147
+ |----------|------|-------------|
1148
+ | `text` | string | Text content |
1149
+ | `justify` | string | Alignment: `left`, `center`, `right` |
1150
+ | `font_size` | float | Font size |
1151
+ | `outline_color` | vec4 | Outline color |
1152
+ | `outline_size` | float | Outline size |
1153
+ | `spacing` | float | Letter spacing |
1154
+
1155
+ #### Video Box Node
1156
+
1157
+ | Property | Type | Description |
1158
+ |----------|------|-------------|
1159
+ | `source` | string | Source ID to display |
1160
+ | `audio_meter_source` | string | Pipe-delimited mixer IDs for audio meters |
1161
+ | `show_audio_meter` | bool | Show audio meters |
1162
+ | `show_border` | bool | Show border |
1163
+ | `show_label_bg` | bool | Show label background |
1164
+ | `tex_filter` | bool | Texture filtering |
1165
+
1166
+ #### Image Node
1167
+
1168
+ | Property | Type | Description |
1169
+ |----------|------|-------------|
1170
+ | `filename` | string | Image filename (supports `rtt:` prefix) |
1171
+ | `tex_filter` | bool | Texture filtering |
1172
+ | `premultiply` | bool | Premultiply alpha |
1173
+
1174
+ #### Effects
1175
+
1176
+ **All effects:** `enabled` (bool)
1177
+
1178
+ **RTT Effect:** `rtt-id` (string)
1179
+
1180
+ **Timecode Effect:**
1181
+
1182
+ | Property | Type | Values |
1183
+ |----------|------|--------|
1184
+ | `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
+ | `timecode_src` | string | Source ID for timecode |
1186
+
1187
+ **Clip Plane Effect:**
1188
+
1189
+ | Property | Type | Description |
1190
+ |----------|------|-------------|
1191
+ | `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 |
1196
+ | `feather` | float | Feather amount |
1197
+
1198
+ ### Audio Mixer Domain (`domain.audio_mixer_id`)
1199
+
1200
+ Address format: `channel_id` for channel properties, `channel_id/plugin_id` for plugin parameters.
1201
+
1202
+ | Property | Type | Description |
1203
+ |----------|------|-------------|
1204
+ | `level` | float | Channel level (0–1) |
1205
+ | `pan` | float | Pan position (−1 to 1) |
1206
+ | `mute` | bool | Mute channel |
1207
+ | `source_channels` | vec4 | Source channel routing |
1208
+ | `source_id` | string | Source ID |
1209
+ | `<param_id>` | float | Plugin parameter (numeric ID as string) |
1210
+
1211
+ ### Source Domain (`domain.source_id`)
1212
+
1213
+ Address format: `processor_id` for preprocessor parameters.
1214
+
1215
+ | Property | Type | Description |
1216
+ |----------|------|-------------|
1217
+ | `audio_level` | float | Source audio level |
1218
+ | `<param_id>` | float | Preprocessor parameter (numeric ID as string) |