11syntax = "proto3" ;
22
33package stream.video.sfu.models ;
4+
45import "google/protobuf/struct.proto" ;
56import "google/protobuf/timestamp.proto" ;
67
8+ option csharp_namespace = "Stream.Video.v1.Sfu.Models" ;
79option go_package = "github.com/GetStream/protocol/protobuf/video/sfu/models" ;
810option java_multiple_files = true ;
911option java_outer_classname = "SfuModelsV1" ;
10- option csharp_namespace = "Stream.Video.v1.Sfu.Models" ;
1112
1213enum PeerType {
1314 // todo fix me (marcelo)
@@ -267,6 +268,7 @@ message ClientDetails {
267268 OS os = 2 ;
268269 Browser browser = 3 ;
269270 Device device = 4 ;
271+ string webrtc_version = 5 ;
270272}
271273
272274enum SdkType {
@@ -309,9 +311,9 @@ message RTMPIngress {
309311 double frame_rate = 3 ;
310312
311313 // Client info
312- string software = 4 ; // e.g. "obs-studio"
313- string version = 5 ; // e.g. "29.1.3"
314- string encoder = 6 ; // e.g. "x264" or "NVIDIA NVENC"
314+ string software = 4 ; // e.g. "obs-studio"
315+ string version = 5 ; // e.g. "29.1.3"
316+ string encoder = 6 ; // e.g. "x264" or "NVIDIA NVENC"
315317
316318 // Connection info
317319 string remote_addr = 7 ;
@@ -391,7 +393,7 @@ enum WebsocketReconnectStrategy {
391393 WEBSOCKET_RECONNECT_STRATEGY_REJOIN = 3 ;
392394 // SDK should migrate to a new SFU instance
393395 WEBSOCKET_RECONNECT_STRATEGY_MIGRATE = 4 ;
394- };
396+ }
395397
396398message InputDevices {
397399 repeated string available_devices = 1 ;
@@ -457,14 +459,14 @@ enum ClientCapability {
457459 CLIENT_CAPABILITY_SUBSCRIBER_VIDEO_PAUSE = 1 ;
458460 // Instructs SFU that stats will be sent to the coordinator
459461 CLIENT_CAPABILITY_COORDINATOR_STATS = 2 ;
460- };
462+ }
461463
462464// ===================================================================
463465// BASE (shared by all RTP directions)
464466// ===================================================================
465467message RtpBase {
466- uint32 ssrc = 1 ; // raw stat["ssrc"]
467- string kind = 2 ; // stat["kind"] ("audio","video")
468+ uint32 ssrc = 1 ; // raw stat["ssrc"]
469+ string kind = 2 ; // stat["kind"] ("audio","video")
468470 double timestamp_ms = 3 ; // stat["timestamp"] in milliseconds
469471}
470472
@@ -474,20 +476,20 @@ message RtpBase {
474476message InboundRtp {
475477 RtpBase base = 1 ;
476478
477- double jitter_seconds = 2 ; // stat["jitter"]
478- uint64 packets_received = 3 ; // stat["packetsReceived"]
479- uint64 packets_lost = 4 ; // stat["packetsLost"]
479+ double jitter_seconds = 2 ; // stat["jitter"]
480+ uint64 packets_received = 3 ; // stat["packetsReceived"]
481+ uint64 packets_lost = 4 ; // stat["packetsLost"]
480482 double packet_loss_percent = 5 ; // (packets_lost / (packets_received + packets_lost)) * 100;skip if denominator <= 0 or counters decreased
481483
482484 // -------- AUDIO METRICS --------
483- uint32 concealment_events = 10 ; // stat["concealmentEvents"]
485+ uint32 concealment_events = 10 ; // stat["concealmentEvents"]
484486 double concealment_percent = 11 ; // (concealedSamples / totalSamplesReceived) * 100 when totalSamplesReceived >= 96_000 (≈2 s @ 48 kHz)
485487
486488 // -------- VIDEO METRICS --------
487- double fps = 20 ; // use delta(framesDecoded)/delta(time) with prev sample
489+ double fps = 20 ; // use delta(framesDecoded)/delta(time) with prev sample
488490 double freeze_duration_seconds = 21 ; // stat["totalFreezesDuration"]
489491 double avg_decode_time_seconds = 22 ; // stat["totalDecodeTime"] / max(1, stat["framesDecoded"])
490- uint32 min_dimension_px = 23 ; // min(stat["frameWidth"], stat["frameHeight"]) for video-like tracks
492+ uint32 min_dimension_px = 23 ; // min(stat["frameWidth"], stat["frameHeight"]) for video-like tracks
491493}
492494
493495// ===================================================================
@@ -496,10 +498,10 @@ message InboundRtp {
496498message OutboundRtp {
497499 RtpBase base = 1 ;
498500
499- double fps = 10 ; // delta(framesEncoded)/delta(time) if missing
501+ double fps = 10 ; // delta(framesEncoded)/delta(time) if missing
500502 double avg_encode_time_seconds = 11 ; // stat["totalEncodeTime"] / max(1, stat["framesEncoded"])
501- double bitrate_bps = 12 ; // delta(bytesSent)*8 / delta(timeSeconds); requires prev bytes/timestamp; ignore if delta<=0
502- uint32 min_dimension_px = 13 ; // min(stat["frameWidth"], stat["frameHeight"])
503+ double bitrate_bps = 12 ; // delta(bytesSent)*8 / delta(timeSeconds); requires prev bytes/timestamp; ignore if delta<=0
504+ uint32 min_dimension_px = 13 ; // min(stat["frameWidth"], stat["frameHeight"])
503505}
504506
505507// ===================================================================
@@ -508,7 +510,7 @@ message OutboundRtp {
508510message RemoteInboundRtp {
509511 RtpBase base = 1 ;
510512
511- double jitter_seconds = 2 ; // stat["jitter"]
513+ double jitter_seconds = 2 ; // stat["jitter"]
512514 double round_trip_time_s = 3 ; // stat["roundTripTime"]
513515}
514516
@@ -518,6 +520,6 @@ message RemoteInboundRtp {
518520message RemoteOutboundRtp {
519521 RtpBase base = 1 ;
520522
521- double jitter_seconds = 2 ; // stat["jitter"] if provided
523+ double jitter_seconds = 2 ; // stat["jitter"] if provided
522524 double round_trip_time_s = 3 ; // stat["roundTripTime"]
523525}
0 commit comments