syntax = "proto3"; package livekit;option go_package = "github.com/livekit/protocol/livekit";option csharp_namespace = "LiveKit.Proto";option ruby_package = "LiveKit::Proto"; import "google/protobuf/timestamp.proto";import "livekit_egress.proto"; message Room { string sid = 1; string name = 2; uint32 empty_timeout = 3; uint32 max_participants = 4; int64 creation_time = 5; string turn_password = 6; repeated Codec enabled_codecs = 7; string metadata = 8; uint32 num_participants = 9; bool active_recording = 10;} // room info that should not be returned to clientsmessage RoomInternal { AutoTrackEgress track_egress = 1;} message AutoTrackEgress { string file_prefix = 1; oneof output { S3Upload s3 = 2; GCPUpload gcp = 3; AzureBlobUpload azure = 4; }} message Codec { string mime = 1; string fmtp_line = 2;} message ParticipantPermission { // allow participant to subscribe to other tracks in the room bool can_subscribe = 1; // allow participant to publish new tracks to room bool can_publish = 2; // allow participant to publish data bool can_publish_data = 3; // indicates that it's hidden to others bool hidden = 7; // indicates it's a recorder instance bool recorder = 8;} message ParticipantInfo { enum State { // websocket' connected, but not offered yet JOINING = 0; // server received client offer JOINED = 1; // ICE connectivity established ACTIVE = 2; // WS disconnected DISCONNECTED = 3; } string sid = 1; string identity = 2; State state = 3; repeated TrackInfo tracks = 4; string metadata = 5; // timestamp when participant joined room, in seconds int64 joined_at = 6; string name = 9; uint32 version = 10; ParticipantPermission permission = 11; string region = 12; // indicates the participant has an active publisher connection // and can publish to the server bool is_publisher = 13;} enum TrackType { AUDIO = 0; VIDEO = 1; DATA = 2;} enum TrackSource { UNKNOWN = 0; CAMERA = 1; MICROPHONE = 2; SCREEN_SHARE = 3; SCREEN_SHARE_AUDIO = 4;} message SimulcastCodecInfo { string mime_type = 1; string mid = 2; string cid = 3; repeated VideoLayer layers = 4;} message TrackInfo { string sid = 1; TrackType type = 2; string name = 3; bool muted = 4; // original width of video (unset for audio) // clients may receive a lower resolution version with simulcast uint32 width = 5; // original height of video (unset for audio) uint32 height = 6; // true if track is simulcasted bool simulcast = 7; // true if DTX (Discontinuous Transmission) is disabled for audio bool disable_dtx = 8; // source of media TrackSource source = 9; repeated VideoLayer layers = 10; // mime type of codec string mime_type = 11; string mid = 12; repeated SimulcastCodecInfo codecs = 13;} enum VideoQuality { LOW = 0; MEDIUM = 1; HIGH = 2; OFF = 3;} // provide information about available spatial layersmessage VideoLayer { // for tracks with a single layer, this should be HIGH VideoQuality quality = 1; uint32 width = 2; uint32 height = 3; // target bitrate, server will measure actual uint32 bitrate = 4; uint32 ssrc = 5;} // new DataPacket APImessage DataPacket { enum Kind { RELIABLE = 0; LOSSY = 1; } Kind kind = 1; oneof value { UserPacket user = 2; ActiveSpeakerUpdate speaker = 3; }} message ActiveSpeakerUpdate { repeated SpeakerInfo speakers = 1;} message SpeakerInfo { string sid = 1; // audio level, 0-1.0, 1 is loudest float level = 2; // true if speaker is currently active bool active = 3;} message UserPacket { // participant ID of user that sent the message string participant_sid = 1; // user defined payload bytes payload = 2; // the ID of the participants who will receive the message (the message will be sent to all the people in the room if this variable is empty) repeated string destination_sids = 3;} enum ConnectionQuality { POOR = 0; GOOD = 1; EXCELLENT = 2;} message ParticipantTracks { // participant ID of participant to whom the tracks belong string participant_sid = 1; repeated string track_sids = 2;} // details about the servermessage ServerInfo { enum Edition { Standard = 0; Cloud = 1; } Edition edition = 1; string version = 2; int32 protocol = 3; string region = 4; string node_id = 5; // additional debugging information. sent only if server is in development mode string debug_info = 6;} // details about the clientmessage ClientInfo { enum SDK { UNKNOWN = 0; JS = 1; SWIFT = 2; ANDROID = 3; FLUTTER = 4; GO = 5; UNITY = 6; } SDK sdk = 1; string version = 2; int32 protocol = 3; string os = 4; string os_version = 5; string device_model = 6; string browser = 7; string browser_version = 8; string address = 9; // wifi, wired, cellular, vpn, empty if not known string network = 10;} // server provided client configurationmessage ClientConfiguration { VideoConfiguration video = 1; VideoConfiguration screen = 2; ClientConfigSetting resume_connection = 3; DisabledCodecs disabled_codecs = 4; ClientConfigSetting force_relay = 5;} enum ClientConfigSetting { UNSET = 0; DISABLED = 1; ENABLED = 2;} message VideoConfiguration { ClientConfigSetting hardware_encoder = 1;} message DisabledCodecs { repeated Codec codecs = 1;} enum DisconnectReason { UNKNOWN_REASON = 0; CLIENT_INITIATED = 1; DUPLICATE_IDENTITY = 2; SERVER_SHUTDOWN = 3; PARTICIPANT_REMOVED = 4; ROOM_DELETED = 5; STATE_MISMATCH = 6; JOIN_FAILURE = 7;} message RTPStats { google.protobuf.Timestamp start_time = 1; google.protobuf.Timestamp end_time = 2; double duration = 3; uint32 packets = 4; double packet_rate = 5; uint64 bytes = 6; uint64 header_bytes = 39; double bitrate = 7; uint32 packets_lost = 8; double packet_loss_rate = 9; float packet_loss_percentage = 10; uint32 packets_duplicate = 11; double packet_duplicate_rate = 12; uint64 bytes_duplicate = 13; uint64 header_bytes_duplicate = 40; double bitrate_duplicate = 14; uint32 packets_padding = 15; double packet_padding_rate = 16; uint64 bytes_padding = 17; uint64 header_bytes_padding = 41; double bitrate_padding = 18; uint32 packets_out_of_order = 19; uint32 frames = 20; double frame_rate = 21; double jitter_current = 22; double jitter_max = 23; map<int32, uint32> gap_histogram = 24; uint32 nacks = 25; uint32 nack_acks = 37; uint32 nack_misses = 26; uint32 nack_repeated = 38; uint32 plis = 27; google.protobuf.Timestamp last_pli = 28; uint32 firs = 29; google.protobuf.Timestamp last_fir = 30; uint32 rtt_current = 31; uint32 rtt_max = 32; uint32 key_frames = 33; google.protobuf.Timestamp last_key_frame = 34; uint32 layer_lock_plis = 35; google.protobuf.Timestamp last_layer_lock_pli = 36;} message TimedVersion { int64 unix_micro = 1; int32 ticks = 2;}
syntax = "proto3";
package livekit;
option go_package = "github.com/livekit/protocol/livekit";
option csharp_namespace = "LiveKit.Proto";
option ruby_package = "LiveKit::Proto";
import "google/protobuf/timestamp.proto";
import "livekit_egress.proto";
message Room {
string sid = 1;
string name = 2;
uint32 empty_timeout = 3;
uint32 max_participants = 4;
int64 creation_time = 5;
string turn_password = 6;
repeated Codec enabled_codecs = 7;
string metadata = 8;
uint32 num_participants = 9;
bool active_recording = 10;
}
// room info that should not be returned to clients
message RoomInternal {
AutoTrackEgress track_egress = 1;
}
message AutoTrackEgress {
string file_prefix = 1;
oneof output {
S3Upload s3 = 2;
GCPUpload gcp = 3;
AzureBlobUpload azure = 4;
}
}
message Codec {
string mime = 1;
string fmtp_line = 2;
}
message ParticipantPermission {
// allow participant to subscribe to other tracks in the room
bool can_subscribe = 1;
// allow participant to publish new tracks to room
bool can_publish = 2;
// allow participant to publish data
bool can_publish_data = 3;
// indicates that it's hidden to others
bool hidden = 7;
// indicates it's a recorder instance
bool recorder = 8;
}
message ParticipantInfo {
enum State {
// websocket' connected, but not offered yet
JOINING = 0;
// server received client offer
JOINED = 1;
// ICE connectivity established
ACTIVE = 2;
// WS disconnected
DISCONNECTED = 3;
}
string sid = 1;
string identity = 2;
State state = 3;
repeated TrackInfo tracks = 4;
string metadata = 5;
// timestamp when participant joined room, in seconds
int64 joined_at = 6;
string name = 9;
uint32 version = 10;
ParticipantPermission permission = 11;
string region = 12;
// indicates the participant has an active publisher connection
// and can publish to the server
bool is_publisher = 13;
}
enum TrackType {
AUDIO = 0;
VIDEO = 1;
DATA = 2;
}
enum TrackSource {
UNKNOWN = 0;
CAMERA = 1;
MICROPHONE = 2;
SCREEN_SHARE = 3;
SCREEN_SHARE_AUDIO = 4;
}
message SimulcastCodecInfo {
string mime_type = 1;
string mid = 2;
string cid = 3;
repeated VideoLayer layers = 4;
}
message TrackInfo {
string sid = 1;
TrackType type = 2;
string name = 3;
bool muted = 4;
// original width of video (unset for audio)
// clients may receive a lower resolution version with simulcast
uint32 width = 5;
// original height of video (unset for audio)
uint32 height = 6;
// true if track is simulcasted
bool simulcast = 7;
// true if DTX (Discontinuous Transmission) is disabled for audio
bool disable_dtx = 8;
// source of media
TrackSource source = 9;
repeated VideoLayer layers = 10;
// mime type of codec
string mime_type = 11;
string mid = 12;
repeated SimulcastCodecInfo codecs = 13;
}
enum VideoQuality {
LOW = 0;
MEDIUM = 1;
HIGH = 2;
OFF = 3;
}
// provide information about available spatial layers
message VideoLayer {
// for tracks with a single layer, this should be HIGH
VideoQuality quality = 1;
uint32 width = 2;
uint32 height = 3;
// target bitrate, server will measure actual
uint32 bitrate = 4;
uint32 ssrc = 5;
}
// new DataPacket API
message DataPacket {
enum Kind {
RELIABLE = 0;
LOSSY = 1;
}
Kind kind = 1;
oneof value {
UserPacket user = 2;
ActiveSpeakerUpdate speaker = 3;
}
}
message ActiveSpeakerUpdate {
repeated SpeakerInfo speakers = 1;
}
message SpeakerInfo {
string sid = 1;
// audio level, 0-1.0, 1 is loudest
float level = 2;
// true if speaker is currently active
bool active = 3;
}
message UserPacket {
// participant ID of user that sent the message
string participant_sid = 1;
// user defined payload
bytes payload = 2;
// the ID of the participants who will receive the message (the message will be sent to all the people in the room if this variable is empty)
repeated string destination_sids = 3;
}
enum ConnectionQuality {
POOR = 0;
GOOD = 1;
EXCELLENT = 2;
}
message ParticipantTracks {
// participant ID of participant to whom the tracks belong
string participant_sid = 1;
repeated string track_sids = 2;
}
// details about the server
message ServerInfo {
enum Edition {
Standard = 0;
Cloud = 1;
}
Edition edition = 1;
string version = 2;
int32 protocol = 3;
string region = 4;
string node_id = 5;
// additional debugging information. sent only if server is in development mode
string debug_info = 6;
}
// details about the client
message ClientInfo {
enum SDK {
UNKNOWN = 0;
JS = 1;
SWIFT = 2;
ANDROID = 3;
FLUTTER = 4;
GO = 5;
UNITY = 6;
}
SDK sdk = 1;
string version = 2;
int32 protocol = 3;
string os = 4;
string os_version = 5;
string device_model = 6;
string browser = 7;
string browser_version = 8;
string address = 9;
// wifi, wired, cellular, vpn, empty if not known
string network = 10;
}
// server provided client configuration
message ClientConfiguration {
VideoConfiguration video = 1;
VideoConfiguration screen = 2;
ClientConfigSetting resume_connection = 3;
DisabledCodecs disabled_codecs = 4;
ClientConfigSetting force_relay = 5;
}
enum ClientConfigSetting {
UNSET = 0;
DISABLED = 1;
ENABLED = 2;
}
message VideoConfiguration {
ClientConfigSetting hardware_encoder = 1;
}
message DisabledCodecs {
repeated Codec codecs = 1;
}
enum DisconnectReason {
UNKNOWN_REASON = 0;
CLIENT_INITIATED = 1;
DUPLICATE_IDENTITY = 2;
SERVER_SHUTDOWN = 3;
PARTICIPANT_REMOVED = 4;
ROOM_DELETED = 5;
STATE_MISMATCH = 6;
JOIN_FAILURE = 7;
}
message RTPStats {
google.protobuf.Timestamp start_time = 1;
google.protobuf.Timestamp end_time = 2;
double duration = 3;
uint32 packets = 4;
double packet_rate = 5;
uint64 bytes = 6;
uint64 header_bytes = 39;
double bitrate = 7;
uint32 packets_lost = 8;
double packet_loss_rate = 9;
float packet_loss_percentage = 10;
uint32 packets_duplicate = 11;
double packet_duplicate_rate = 12;
uint64 bytes_duplicate = 13;
uint64 header_bytes_duplicate = 40;
double bitrate_duplicate = 14;
uint32 packets_padding = 15;
double packet_padding_rate = 16;
uint64 bytes_padding = 17;
uint64 header_bytes_padding = 41;
double bitrate_padding = 18;
uint32 packets_out_of_order = 19;
uint32 frames = 20;
double frame_rate = 21;
double jitter_current = 22;
double jitter_max = 23;
map<int32, uint32> gap_histogram = 24;
uint32 nacks = 25;
uint32 nack_acks = 37;
uint32 nack_misses = 26;
uint32 nack_repeated = 38;
uint32 plis = 27;
google.protobuf.Timestamp last_pli = 28;
uint32 firs = 29;
google.protobuf.Timestamp last_fir = 30;
uint32 rtt_current = 31;
uint32 rtt_max = 32;
uint32 key_frames = 33;
google.protobuf.Timestamp last_key_frame = 34;
uint32 layer_lock_plis = 35;
google.protobuf.Timestamp last_layer_lock_pli = 36;
}
message TimedVersion {
int64 unix_micro = 1;
int32 ticks = 2;
}