diff --git a/stream-video-android-core/api/stream-video-android-core.api b/stream-video-android-core/api/stream-video-android-core.api index 3659f4d257b..1c6bfedfa9a 100644 --- a/stream-video-android-core/api/stream-video-android-core.api +++ b/stream-video-android-core/api/stream-video-android-core.api @@ -82,6 +82,8 @@ public final class io/getstream/video/android/core/Call { public final fun update (Ljava/util/Map;Lorg/openapitools/client/models/CallSettingsRequest;Lorg/threeten/bp/OffsetDateTime;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static synthetic fun update$default (Lio/getstream/video/android/core/Call;Ljava/util/Map;Lorg/openapitools/client/models/CallSettingsRequest;Lorg/threeten/bp/OffsetDateTime;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public final fun updateMembers (Ljava/util/List;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun updatePublishOptions (Lio/getstream/video/android/core/model/VideoCodec;Ljava/lang/Integer;)V + public static synthetic fun updatePublishOptions$default (Lio/getstream/video/android/core/Call;Lio/getstream/video/android/core/model/VideoCodec;Ljava/lang/Integer;ILjava/lang/Object;)V } public final class io/getstream/video/android/core/Call$Companion { @@ -1008,7 +1010,8 @@ public final class io/getstream/video/android/core/call/connection/StreamPeerCon public fun (Lkotlinx/coroutines/CoroutineScope;Lio/getstream/video/android/core/model/StreamPeerType;Lorg/webrtc/MediaConstraints;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;I)V public final fun addAudioTransceiver (Lorg/webrtc/MediaStreamTrack;Ljava/util/List;)V public final fun addIceCandidate (Lio/getstream/video/android/core/model/IceCandidate;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun addVideoTransceiver (Lorg/webrtc/MediaStreamTrack;Ljava/util/List;Z)V + public final fun addVideoTransceiver (Lorg/webrtc/MediaStreamTrack;Ljava/util/List;ZZ)V + public static synthetic fun addVideoTransceiver$default (Lio/getstream/video/android/core/call/connection/StreamPeerConnection;Lorg/webrtc/MediaStreamTrack;Ljava/util/List;ZZILjava/lang/Object;)V public final fun createAnswer (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun createOffer (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun getAudioTransceiver ()Lorg/webrtc/RtpTransceiver; @@ -4123,6 +4126,17 @@ public final class io/getstream/video/android/core/model/UpdateUserPermissionsDa public static final fun toRequest (Lio/getstream/video/android/core/model/UpdateUserPermissionsData;)Lorg/openapitools/client/models/UpdateUserPermissionsRequest; } +public final class io/getstream/video/android/core/model/VideoCodec : java/lang/Enum { + public static final field AV1 Lio/getstream/video/android/core/model/VideoCodec; + public static final field H264 Lio/getstream/video/android/core/model/VideoCodec; + public static final field VP8 Lio/getstream/video/android/core/model/VideoCodec; + public static final field VP9 Lio/getstream/video/android/core/model/VideoCodec; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public final fun supportsSvc ()Z + public static fun valueOf (Ljava/lang/String;)Lio/getstream/video/android/core/model/VideoCodec; + public static fun values ()[Lio/getstream/video/android/core/model/VideoCodec; +} + public final class io/getstream/video/android/core/model/VideoModelKt { public static final fun merge (Lio/getstream/video/android/core/model/CallUser;Lio/getstream/video/android/core/model/CallUser;)Lio/getstream/video/android/core/model/CallUser; public static final fun merge (Lio/getstream/video/android/core/model/CallUserState;Lio/getstream/video/android/core/model/CallUserState;)Lio/getstream/video/android/core/model/CallUserState; @@ -4130,6 +4144,21 @@ public final class io/getstream/video/android/core/model/VideoModelKt { public static final fun merge (Ljava/util/Map;Ljava/util/Map;)Ljava/util/Map; } +public final class io/getstream/video/android/core/model/VideoPublishOptions { + public fun ()V + public fun (Lio/getstream/video/android/core/model/VideoCodec;Ljava/lang/Integer;)V + public synthetic fun (Lio/getstream/video/android/core/model/VideoCodec;Ljava/lang/Integer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/getstream/video/android/core/model/VideoCodec; + public final fun component2 ()Ljava/lang/Integer; + public final fun copy (Lio/getstream/video/android/core/model/VideoCodec;Ljava/lang/Integer;)Lio/getstream/video/android/core/model/VideoPublishOptions; + public static synthetic fun copy$default (Lio/getstream/video/android/core/model/VideoPublishOptions;Lio/getstream/video/android/core/model/VideoCodec;Ljava/lang/Integer;ILjava/lang/Object;)Lio/getstream/video/android/core/model/VideoPublishOptions; + public fun equals (Ljava/lang/Object;)Z + public final fun getPreferredCodec ()Lio/getstream/video/android/core/model/VideoCodec; + public final fun getPreferredMaxBitrate ()Ljava/lang/Integer; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + public final class io/getstream/video/android/core/model/VideoTrack : io/getstream/video/android/core/model/MediaTrack { public fun (Ljava/lang/String;Lorg/webrtc/VideoTrack;)V public final fun component1 ()Ljava/lang/String; @@ -10990,36 +11019,16 @@ public final class stream/video/sfu/event/AudioLevelChanged : com/squareup/wire/ public final class stream/video/sfu/event/AudioLevelChanged$Companion { } -public final class stream/video/sfu/event/AudioMediaRequest : com/squareup/wire/Message { - public static final field ADAPTER Lcom/squareup/wire/ProtoAdapter; - public static final field Companion Lstream/video/sfu/event/AudioMediaRequest$Companion; - public fun ()V - public fun (ILokio/ByteString;)V - public synthetic fun (ILokio/ByteString;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun copy (ILokio/ByteString;)Lstream/video/sfu/event/AudioMediaRequest; - public static synthetic fun copy$default (Lstream/video/sfu/event/AudioMediaRequest;ILokio/ByteString;ILjava/lang/Object;)Lstream/video/sfu/event/AudioMediaRequest; - public fun equals (Ljava/lang/Object;)Z - public final fun getChannel_count ()I - public fun hashCode ()I - public synthetic fun newBuilder ()Lcom/squareup/wire/Message$Builder; - public synthetic fun newBuilder ()Ljava/lang/Void; - public fun toString ()Ljava/lang/String; -} - -public final class stream/video/sfu/event/AudioMediaRequest$Companion { -} - public final class stream/video/sfu/event/AudioSender : com/squareup/wire/Message { public static final field ADAPTER Lcom/squareup/wire/ProtoAdapter; public static final field Companion Lstream/video/sfu/event/AudioSender$Companion; public fun ()V - public fun (Lstream/video/sfu/event/AudioMediaRequest;Lstream/video/sfu/models/Codec;Lokio/ByteString;)V - public synthetic fun (Lstream/video/sfu/event/AudioMediaRequest;Lstream/video/sfu/models/Codec;Lokio/ByteString;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun copy (Lstream/video/sfu/event/AudioMediaRequest;Lstream/video/sfu/models/Codec;Lokio/ByteString;)Lstream/video/sfu/event/AudioSender; - public static synthetic fun copy$default (Lstream/video/sfu/event/AudioSender;Lstream/video/sfu/event/AudioMediaRequest;Lstream/video/sfu/models/Codec;Lokio/ByteString;ILjava/lang/Object;)Lstream/video/sfu/event/AudioSender; + public fun (Lstream/video/sfu/models/Codec;Lokio/ByteString;)V + public synthetic fun (Lstream/video/sfu/models/Codec;Lokio/ByteString;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun copy (Lstream/video/sfu/models/Codec;Lokio/ByteString;)Lstream/video/sfu/event/AudioSender; + public static synthetic fun copy$default (Lstream/video/sfu/event/AudioSender;Lstream/video/sfu/models/Codec;Lokio/ByteString;ILjava/lang/Object;)Lstream/video/sfu/event/AudioSender; public fun equals (Ljava/lang/Object;)Z public final fun getCodec ()Lstream/video/sfu/models/Codec; - public final fun getMedia_request ()Lstream/video/sfu/event/AudioMediaRequest; public fun hashCode ()I public synthetic fun newBuilder ()Lcom/squareup/wire/Message$Builder; public synthetic fun newBuilder ()Ljava/lang/Void; @@ -11267,14 +11276,15 @@ public final class stream/video/sfu/event/JoinRequest : com/squareup/wire/Messag public static final field ADAPTER Lcom/squareup/wire/ProtoAdapter; public static final field Companion Lstream/video/sfu/event/JoinRequest$Companion; public fun ()V - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lstream/video/sfu/models/ClientDetails;Lstream/video/sfu/event/Migration;ZLokio/ByteString;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lstream/video/sfu/models/ClientDetails;Lstream/video/sfu/event/Migration;ZLokio/ByteString;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lstream/video/sfu/models/ClientDetails;Lstream/video/sfu/event/Migration;ZLokio/ByteString;)Lstream/video/sfu/event/JoinRequest; - public static synthetic fun copy$default (Lstream/video/sfu/event/JoinRequest;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lstream/video/sfu/models/ClientDetails;Lstream/video/sfu/event/Migration;ZLokio/ByteString;ILjava/lang/Object;)Lstream/video/sfu/event/JoinRequest; + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lstream/video/sfu/models/ClientDetails;Lstream/video/sfu/event/Migration;ZLstream/video/sfu/event/ReconnectDetails;Lokio/ByteString;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lstream/video/sfu/models/ClientDetails;Lstream/video/sfu/event/Migration;ZLstream/video/sfu/event/ReconnectDetails;Lokio/ByteString;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lstream/video/sfu/models/ClientDetails;Lstream/video/sfu/event/Migration;ZLstream/video/sfu/event/ReconnectDetails;Lokio/ByteString;)Lstream/video/sfu/event/JoinRequest; + public static synthetic fun copy$default (Lstream/video/sfu/event/JoinRequest;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lstream/video/sfu/models/ClientDetails;Lstream/video/sfu/event/Migration;ZLstream/video/sfu/event/ReconnectDetails;Lokio/ByteString;ILjava/lang/Object;)Lstream/video/sfu/event/JoinRequest; public fun equals (Ljava/lang/Object;)Z public final fun getClient_details ()Lstream/video/sfu/models/ClientDetails; public final fun getFast_reconnect ()Z public final fun getMigration ()Lstream/video/sfu/event/Migration; + public final fun getReconnect_details ()Lstream/video/sfu/event/ReconnectDetails; public final fun getSession_id ()Ljava/lang/String; public final fun getSubscriber_sdp ()Ljava/lang/String; public final fun getToken ()Ljava/lang/String; @@ -11291,12 +11301,13 @@ public final class stream/video/sfu/event/JoinResponse : com/squareup/wire/Messa public static final field ADAPTER Lcom/squareup/wire/ProtoAdapter; public static final field Companion Lstream/video/sfu/event/JoinResponse$Companion; public fun ()V - public fun (Lstream/video/sfu/models/CallState;ZLokio/ByteString;)V - public synthetic fun (Lstream/video/sfu/models/CallState;ZLokio/ByteString;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun copy (Lstream/video/sfu/models/CallState;ZLokio/ByteString;)Lstream/video/sfu/event/JoinResponse; - public static synthetic fun copy$default (Lstream/video/sfu/event/JoinResponse;Lstream/video/sfu/models/CallState;ZLokio/ByteString;ILjava/lang/Object;)Lstream/video/sfu/event/JoinResponse; + public fun (Lstream/video/sfu/models/CallState;ZILokio/ByteString;)V + public synthetic fun (Lstream/video/sfu/models/CallState;ZILokio/ByteString;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun copy (Lstream/video/sfu/models/CallState;ZILokio/ByteString;)Lstream/video/sfu/event/JoinResponse; + public static synthetic fun copy$default (Lstream/video/sfu/event/JoinResponse;Lstream/video/sfu/models/CallState;ZILokio/ByteString;ILjava/lang/Object;)Lstream/video/sfu/event/JoinResponse; public fun equals (Ljava/lang/Object;)Z public final fun getCall_state ()Lstream/video/sfu/models/CallState; + public final fun getFast_reconnect_deadline_seconds ()I public final fun getReconnected ()Z public fun hashCode ()I public synthetic fun newBuilder ()Lcom/squareup/wire/Message$Builder; @@ -11307,6 +11318,26 @@ public final class stream/video/sfu/event/JoinResponse : com/squareup/wire/Messa public final class stream/video/sfu/event/JoinResponse$Companion { } +public final class stream/video/sfu/event/LeaveCallRequest : com/squareup/wire/Message { + public static final field ADAPTER Lcom/squareup/wire/ProtoAdapter; + public static final field Companion Lstream/video/sfu/event/LeaveCallRequest$Companion; + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Lokio/ByteString;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lokio/ByteString;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun copy (Ljava/lang/String;Ljava/lang/String;Lokio/ByteString;)Lstream/video/sfu/event/LeaveCallRequest; + public static synthetic fun copy$default (Lstream/video/sfu/event/LeaveCallRequest;Ljava/lang/String;Ljava/lang/String;Lokio/ByteString;ILjava/lang/Object;)Lstream/video/sfu/event/LeaveCallRequest; + public fun equals (Ljava/lang/Object;)Z + public final fun getReason ()Ljava/lang/String; + public final fun getSession_id ()Ljava/lang/String; + public fun hashCode ()I + public synthetic fun newBuilder ()Lcom/squareup/wire/Message$Builder; + public synthetic fun newBuilder ()Ljava/lang/Void; + public fun toString ()Ljava/lang/String; +} + +public final class stream/video/sfu/event/LeaveCallRequest$Companion { +} + public final class stream/video/sfu/event/Migration : com/squareup/wire/Message { public static final field ADAPTER Lcom/squareup/wire/ProtoAdapter; public static final field Companion Lstream/video/sfu/event/Migration$Companion; @@ -11368,6 +11399,24 @@ public final class stream/video/sfu/event/ParticipantLeft : com/squareup/wire/Me public final class stream/video/sfu/event/ParticipantLeft$Companion { } +public final class stream/video/sfu/event/ParticipantMigrationComplete : com/squareup/wire/Message { + public static final field ADAPTER Lcom/squareup/wire/ProtoAdapter; + public static final field Companion Lstream/video/sfu/event/ParticipantMigrationComplete$Companion; + public fun ()V + public fun (Lokio/ByteString;)V + public synthetic fun (Lokio/ByteString;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun copy (Lokio/ByteString;)Lstream/video/sfu/event/ParticipantMigrationComplete; + public static synthetic fun copy$default (Lstream/video/sfu/event/ParticipantMigrationComplete;Lokio/ByteString;ILjava/lang/Object;)Lstream/video/sfu/event/ParticipantMigrationComplete; + public fun equals (Ljava/lang/Object;)Z + public fun hashCode ()I + public synthetic fun newBuilder ()Lcom/squareup/wire/Message$Builder; + public synthetic fun newBuilder ()Ljava/lang/Void; + public fun toString ()Ljava/lang/String; +} + +public final class stream/video/sfu/event/ParticipantMigrationComplete$Companion { +} + public final class stream/video/sfu/event/ParticipantUpdated : com/squareup/wire/Message { public static final field ADAPTER Lcom/squareup/wire/ProtoAdapter; public static final field Companion Lstream/video/sfu/event/ParticipantUpdated$Companion; @@ -11426,14 +11475,38 @@ public final class stream/video/sfu/event/PublisherAnswer : com/squareup/wire/Me public final class stream/video/sfu/event/PublisherAnswer$Companion { } +public final class stream/video/sfu/event/ReconnectDetails : com/squareup/wire/Message { + public static final field ADAPTER Lcom/squareup/wire/ProtoAdapter; + public static final field Companion Lstream/video/sfu/event/ReconnectDetails$Companion; + public fun ()V + public fun (Lstream/video/sfu/models/WebsocketReconnectStrategy;Ljava/util/List;Ljava/util/List;ILjava/lang/String;Ljava/lang/String;Lokio/ByteString;)V + public synthetic fun (Lstream/video/sfu/models/WebsocketReconnectStrategy;Ljava/util/List;Ljava/util/List;ILjava/lang/String;Ljava/lang/String;Lokio/ByteString;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun copy (Lstream/video/sfu/models/WebsocketReconnectStrategy;Ljava/util/List;Ljava/util/List;ILjava/lang/String;Ljava/lang/String;Lokio/ByteString;)Lstream/video/sfu/event/ReconnectDetails; + public static synthetic fun copy$default (Lstream/video/sfu/event/ReconnectDetails;Lstream/video/sfu/models/WebsocketReconnectStrategy;Ljava/util/List;Ljava/util/List;ILjava/lang/String;Ljava/lang/String;Lokio/ByteString;ILjava/lang/Object;)Lstream/video/sfu/event/ReconnectDetails; + public fun equals (Ljava/lang/Object;)Z + public final fun getAnnounced_tracks ()Ljava/util/List; + public final fun getFrom_sfu_id ()Ljava/lang/String; + public final fun getPrevious_session_id ()Ljava/lang/String; + public final fun getReconnect_attempt ()I + public final fun getStrategy ()Lstream/video/sfu/models/WebsocketReconnectStrategy; + public final fun getSubscriptions ()Ljava/util/List; + public fun hashCode ()I + public synthetic fun newBuilder ()Lcom/squareup/wire/Message$Builder; + public synthetic fun newBuilder ()Ljava/lang/Void; + public fun toString ()Ljava/lang/String; +} + +public final class stream/video/sfu/event/ReconnectDetails$Companion { +} + public final class stream/video/sfu/event/SfuEvent : com/squareup/wire/Message { public static final field ADAPTER Lcom/squareup/wire/ProtoAdapter; public static final field Companion Lstream/video/sfu/event/SfuEvent$Companion; public fun ()V - public fun (Lstream/video/sfu/event/SubscriberOffer;Lstream/video/sfu/event/PublisherAnswer;Lstream/video/sfu/event/ConnectionQualityChanged;Lstream/video/sfu/event/AudioLevelChanged;Lstream/video/sfu/models/ICETrickle;Lstream/video/sfu/event/ChangePublishQuality;Lstream/video/sfu/event/ParticipantJoined;Lstream/video/sfu/event/ParticipantLeft;Lstream/video/sfu/event/DominantSpeakerChanged;Lstream/video/sfu/event/JoinResponse;Lstream/video/sfu/event/HealthCheckResponse;Lstream/video/sfu/event/TrackPublished;Lstream/video/sfu/event/TrackUnpublished;Lstream/video/sfu/event/Error;Lstream/video/sfu/event/CallGrantsUpdated;Lstream/video/sfu/event/GoAway;Lstream/video/sfu/event/ICERestart;Lstream/video/sfu/event/PinsChanged;Lstream/video/sfu/event/CallEnded;Lstream/video/sfu/event/ParticipantUpdated;Lokio/ByteString;)V - public synthetic fun (Lstream/video/sfu/event/SubscriberOffer;Lstream/video/sfu/event/PublisherAnswer;Lstream/video/sfu/event/ConnectionQualityChanged;Lstream/video/sfu/event/AudioLevelChanged;Lstream/video/sfu/models/ICETrickle;Lstream/video/sfu/event/ChangePublishQuality;Lstream/video/sfu/event/ParticipantJoined;Lstream/video/sfu/event/ParticipantLeft;Lstream/video/sfu/event/DominantSpeakerChanged;Lstream/video/sfu/event/JoinResponse;Lstream/video/sfu/event/HealthCheckResponse;Lstream/video/sfu/event/TrackPublished;Lstream/video/sfu/event/TrackUnpublished;Lstream/video/sfu/event/Error;Lstream/video/sfu/event/CallGrantsUpdated;Lstream/video/sfu/event/GoAway;Lstream/video/sfu/event/ICERestart;Lstream/video/sfu/event/PinsChanged;Lstream/video/sfu/event/CallEnded;Lstream/video/sfu/event/ParticipantUpdated;Lokio/ByteString;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun copy (Lstream/video/sfu/event/SubscriberOffer;Lstream/video/sfu/event/PublisherAnswer;Lstream/video/sfu/event/ConnectionQualityChanged;Lstream/video/sfu/event/AudioLevelChanged;Lstream/video/sfu/models/ICETrickle;Lstream/video/sfu/event/ChangePublishQuality;Lstream/video/sfu/event/ParticipantJoined;Lstream/video/sfu/event/ParticipantLeft;Lstream/video/sfu/event/DominantSpeakerChanged;Lstream/video/sfu/event/JoinResponse;Lstream/video/sfu/event/HealthCheckResponse;Lstream/video/sfu/event/TrackPublished;Lstream/video/sfu/event/TrackUnpublished;Lstream/video/sfu/event/Error;Lstream/video/sfu/event/CallGrantsUpdated;Lstream/video/sfu/event/GoAway;Lstream/video/sfu/event/ICERestart;Lstream/video/sfu/event/PinsChanged;Lstream/video/sfu/event/CallEnded;Lstream/video/sfu/event/ParticipantUpdated;Lokio/ByteString;)Lstream/video/sfu/event/SfuEvent; - public static synthetic fun copy$default (Lstream/video/sfu/event/SfuEvent;Lstream/video/sfu/event/SubscriberOffer;Lstream/video/sfu/event/PublisherAnswer;Lstream/video/sfu/event/ConnectionQualityChanged;Lstream/video/sfu/event/AudioLevelChanged;Lstream/video/sfu/models/ICETrickle;Lstream/video/sfu/event/ChangePublishQuality;Lstream/video/sfu/event/ParticipantJoined;Lstream/video/sfu/event/ParticipantLeft;Lstream/video/sfu/event/DominantSpeakerChanged;Lstream/video/sfu/event/JoinResponse;Lstream/video/sfu/event/HealthCheckResponse;Lstream/video/sfu/event/TrackPublished;Lstream/video/sfu/event/TrackUnpublished;Lstream/video/sfu/event/Error;Lstream/video/sfu/event/CallGrantsUpdated;Lstream/video/sfu/event/GoAway;Lstream/video/sfu/event/ICERestart;Lstream/video/sfu/event/PinsChanged;Lstream/video/sfu/event/CallEnded;Lstream/video/sfu/event/ParticipantUpdated;Lokio/ByteString;ILjava/lang/Object;)Lstream/video/sfu/event/SfuEvent; + public fun (Lstream/video/sfu/event/SubscriberOffer;Lstream/video/sfu/event/PublisherAnswer;Lstream/video/sfu/event/ConnectionQualityChanged;Lstream/video/sfu/event/AudioLevelChanged;Lstream/video/sfu/models/ICETrickle;Lstream/video/sfu/event/ChangePublishQuality;Lstream/video/sfu/event/ParticipantJoined;Lstream/video/sfu/event/ParticipantLeft;Lstream/video/sfu/event/DominantSpeakerChanged;Lstream/video/sfu/event/JoinResponse;Lstream/video/sfu/event/HealthCheckResponse;Lstream/video/sfu/event/TrackPublished;Lstream/video/sfu/event/TrackUnpublished;Lstream/video/sfu/event/Error;Lstream/video/sfu/event/CallGrantsUpdated;Lstream/video/sfu/event/GoAway;Lstream/video/sfu/event/ICERestart;Lstream/video/sfu/event/PinsChanged;Lstream/video/sfu/event/CallEnded;Lstream/video/sfu/event/ParticipantUpdated;Lstream/video/sfu/event/ParticipantMigrationComplete;Lokio/ByteString;)V + public synthetic fun (Lstream/video/sfu/event/SubscriberOffer;Lstream/video/sfu/event/PublisherAnswer;Lstream/video/sfu/event/ConnectionQualityChanged;Lstream/video/sfu/event/AudioLevelChanged;Lstream/video/sfu/models/ICETrickle;Lstream/video/sfu/event/ChangePublishQuality;Lstream/video/sfu/event/ParticipantJoined;Lstream/video/sfu/event/ParticipantLeft;Lstream/video/sfu/event/DominantSpeakerChanged;Lstream/video/sfu/event/JoinResponse;Lstream/video/sfu/event/HealthCheckResponse;Lstream/video/sfu/event/TrackPublished;Lstream/video/sfu/event/TrackUnpublished;Lstream/video/sfu/event/Error;Lstream/video/sfu/event/CallGrantsUpdated;Lstream/video/sfu/event/GoAway;Lstream/video/sfu/event/ICERestart;Lstream/video/sfu/event/PinsChanged;Lstream/video/sfu/event/CallEnded;Lstream/video/sfu/event/ParticipantUpdated;Lstream/video/sfu/event/ParticipantMigrationComplete;Lokio/ByteString;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun copy (Lstream/video/sfu/event/SubscriberOffer;Lstream/video/sfu/event/PublisherAnswer;Lstream/video/sfu/event/ConnectionQualityChanged;Lstream/video/sfu/event/AudioLevelChanged;Lstream/video/sfu/models/ICETrickle;Lstream/video/sfu/event/ChangePublishQuality;Lstream/video/sfu/event/ParticipantJoined;Lstream/video/sfu/event/ParticipantLeft;Lstream/video/sfu/event/DominantSpeakerChanged;Lstream/video/sfu/event/JoinResponse;Lstream/video/sfu/event/HealthCheckResponse;Lstream/video/sfu/event/TrackPublished;Lstream/video/sfu/event/TrackUnpublished;Lstream/video/sfu/event/Error;Lstream/video/sfu/event/CallGrantsUpdated;Lstream/video/sfu/event/GoAway;Lstream/video/sfu/event/ICERestart;Lstream/video/sfu/event/PinsChanged;Lstream/video/sfu/event/CallEnded;Lstream/video/sfu/event/ParticipantUpdated;Lstream/video/sfu/event/ParticipantMigrationComplete;Lokio/ByteString;)Lstream/video/sfu/event/SfuEvent; + public static synthetic fun copy$default (Lstream/video/sfu/event/SfuEvent;Lstream/video/sfu/event/SubscriberOffer;Lstream/video/sfu/event/PublisherAnswer;Lstream/video/sfu/event/ConnectionQualityChanged;Lstream/video/sfu/event/AudioLevelChanged;Lstream/video/sfu/models/ICETrickle;Lstream/video/sfu/event/ChangePublishQuality;Lstream/video/sfu/event/ParticipantJoined;Lstream/video/sfu/event/ParticipantLeft;Lstream/video/sfu/event/DominantSpeakerChanged;Lstream/video/sfu/event/JoinResponse;Lstream/video/sfu/event/HealthCheckResponse;Lstream/video/sfu/event/TrackPublished;Lstream/video/sfu/event/TrackUnpublished;Lstream/video/sfu/event/Error;Lstream/video/sfu/event/CallGrantsUpdated;Lstream/video/sfu/event/GoAway;Lstream/video/sfu/event/ICERestart;Lstream/video/sfu/event/PinsChanged;Lstream/video/sfu/event/CallEnded;Lstream/video/sfu/event/ParticipantUpdated;Lstream/video/sfu/event/ParticipantMigrationComplete;Lokio/ByteString;ILjava/lang/Object;)Lstream/video/sfu/event/SfuEvent; public fun equals (Ljava/lang/Object;)Z public final fun getAudio_level_changed ()Lstream/video/sfu/event/AudioLevelChanged; public final fun getCall_ended ()Lstream/video/sfu/event/CallEnded; @@ -11449,6 +11522,7 @@ public final class stream/video/sfu/event/SfuEvent : com/squareup/wire/Message { public final fun getJoin_response ()Lstream/video/sfu/event/JoinResponse; public final fun getParticipant_joined ()Lstream/video/sfu/event/ParticipantJoined; public final fun getParticipant_left ()Lstream/video/sfu/event/ParticipantLeft; + public final fun getParticipant_migration_complete ()Lstream/video/sfu/event/ParticipantMigrationComplete; public final fun getParticipant_updated ()Lstream/video/sfu/event/ParticipantUpdated; public final fun getPins_updated ()Lstream/video/sfu/event/PinsChanged; public final fun getPublisher_answer ()Lstream/video/sfu/event/PublisherAnswer; @@ -11468,13 +11542,14 @@ public final class stream/video/sfu/event/SfuRequest : com/squareup/wire/Message public static final field ADAPTER Lcom/squareup/wire/ProtoAdapter; public static final field Companion Lstream/video/sfu/event/SfuRequest$Companion; public fun ()V - public fun (Lstream/video/sfu/event/JoinRequest;Lstream/video/sfu/event/HealthCheckRequest;Lokio/ByteString;)V - public synthetic fun (Lstream/video/sfu/event/JoinRequest;Lstream/video/sfu/event/HealthCheckRequest;Lokio/ByteString;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun copy (Lstream/video/sfu/event/JoinRequest;Lstream/video/sfu/event/HealthCheckRequest;Lokio/ByteString;)Lstream/video/sfu/event/SfuRequest; - public static synthetic fun copy$default (Lstream/video/sfu/event/SfuRequest;Lstream/video/sfu/event/JoinRequest;Lstream/video/sfu/event/HealthCheckRequest;Lokio/ByteString;ILjava/lang/Object;)Lstream/video/sfu/event/SfuRequest; + public fun (Lstream/video/sfu/event/JoinRequest;Lstream/video/sfu/event/HealthCheckRequest;Lstream/video/sfu/event/LeaveCallRequest;Lokio/ByteString;)V + public synthetic fun (Lstream/video/sfu/event/JoinRequest;Lstream/video/sfu/event/HealthCheckRequest;Lstream/video/sfu/event/LeaveCallRequest;Lokio/ByteString;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun copy (Lstream/video/sfu/event/JoinRequest;Lstream/video/sfu/event/HealthCheckRequest;Lstream/video/sfu/event/LeaveCallRequest;Lokio/ByteString;)Lstream/video/sfu/event/SfuRequest; + public static synthetic fun copy$default (Lstream/video/sfu/event/SfuRequest;Lstream/video/sfu/event/JoinRequest;Lstream/video/sfu/event/HealthCheckRequest;Lstream/video/sfu/event/LeaveCallRequest;Lokio/ByteString;ILjava/lang/Object;)Lstream/video/sfu/event/SfuRequest; public fun equals (Ljava/lang/Object;)Z public final fun getHealth_check_request ()Lstream/video/sfu/event/HealthCheckRequest; public final fun getJoin_request ()Lstream/video/sfu/event/JoinRequest; + public final fun getLeave_call_request ()Lstream/video/sfu/event/LeaveCallRequest; public fun hashCode ()I public synthetic fun newBuilder ()Lcom/squareup/wire/Message$Builder; public synthetic fun newBuilder ()Ljava/lang/Void; @@ -11553,17 +11628,17 @@ public final class stream/video/sfu/event/VideoLayerSetting : com/squareup/wire/ public static final field ADAPTER Lcom/squareup/wire/ProtoAdapter; public static final field Companion Lstream/video/sfu/event/VideoLayerSetting$Companion; public fun ()V - public fun (Ljava/lang/String;ZIFLstream/video/sfu/event/VideoLayerSetting$Priority;Lstream/video/sfu/models/Codec;ILokio/ByteString;)V - public synthetic fun (Ljava/lang/String;ZIFLstream/video/sfu/event/VideoLayerSetting$Priority;Lstream/video/sfu/models/Codec;ILokio/ByteString;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun copy (Ljava/lang/String;ZIFLstream/video/sfu/event/VideoLayerSetting$Priority;Lstream/video/sfu/models/Codec;ILokio/ByteString;)Lstream/video/sfu/event/VideoLayerSetting; - public static synthetic fun copy$default (Lstream/video/sfu/event/VideoLayerSetting;Ljava/lang/String;ZIFLstream/video/sfu/event/VideoLayerSetting$Priority;Lstream/video/sfu/models/Codec;ILokio/ByteString;ILjava/lang/Object;)Lstream/video/sfu/event/VideoLayerSetting; + public fun (Ljava/lang/String;ZIFLstream/video/sfu/models/Codec;ILjava/lang/String;Lokio/ByteString;)V + public synthetic fun (Ljava/lang/String;ZIFLstream/video/sfu/models/Codec;ILjava/lang/String;Lokio/ByteString;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun copy (Ljava/lang/String;ZIFLstream/video/sfu/models/Codec;ILjava/lang/String;Lokio/ByteString;)Lstream/video/sfu/event/VideoLayerSetting; + public static synthetic fun copy$default (Lstream/video/sfu/event/VideoLayerSetting;Ljava/lang/String;ZIFLstream/video/sfu/models/Codec;ILjava/lang/String;Lokio/ByteString;ILjava/lang/Object;)Lstream/video/sfu/event/VideoLayerSetting; public fun equals (Ljava/lang/Object;)Z public final fun getActive ()Z public final fun getCodec ()Lstream/video/sfu/models/Codec; public final fun getMax_bitrate ()I public final fun getMax_framerate ()I public final fun getName ()Ljava/lang/String; - public final fun getPriority ()Lstream/video/sfu/event/VideoLayerSetting$Priority; + public final fun getScalability_mode ()Ljava/lang/String; public final fun getScale_resolution_down_by ()F public fun hashCode ()I public synthetic fun newBuilder ()Lcom/squareup/wire/Message$Builder; @@ -11574,57 +11649,17 @@ public final class stream/video/sfu/event/VideoLayerSetting : com/squareup/wire/ public final class stream/video/sfu/event/VideoLayerSetting$Companion { } -public final class stream/video/sfu/event/VideoLayerSetting$Priority : java/lang/Enum, com/squareup/wire/WireEnum { - public static final field ADAPTER Lcom/squareup/wire/ProtoAdapter; - public static final field Companion Lstream/video/sfu/event/VideoLayerSetting$Priority$Companion; - public static final field PRIORITY_HIGH_UNSPECIFIED Lstream/video/sfu/event/VideoLayerSetting$Priority; - public static final field PRIORITY_LOW Lstream/video/sfu/event/VideoLayerSetting$Priority; - public static final field PRIORITY_MEDIUM Lstream/video/sfu/event/VideoLayerSetting$Priority; - public static final field PRIORITY_VERY_LOW Lstream/video/sfu/event/VideoLayerSetting$Priority; - public static final fun fromValue (I)Lstream/video/sfu/event/VideoLayerSetting$Priority; - public static fun getEntries ()Lkotlin/enums/EnumEntries; - public fun getValue ()I - public static fun valueOf (Ljava/lang/String;)Lstream/video/sfu/event/VideoLayerSetting$Priority; - public static fun values ()[Lstream/video/sfu/event/VideoLayerSetting$Priority; -} - -public final class stream/video/sfu/event/VideoLayerSetting$Priority$Companion { - public final fun fromValue (I)Lstream/video/sfu/event/VideoLayerSetting$Priority; -} - -public final class stream/video/sfu/event/VideoMediaRequest : com/squareup/wire/Message { - public static final field ADAPTER Lcom/squareup/wire/ProtoAdapter; - public static final field Companion Lstream/video/sfu/event/VideoMediaRequest$Companion; - public fun ()V - public fun (IIILokio/ByteString;)V - public synthetic fun (IIILokio/ByteString;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun copy (IIILokio/ByteString;)Lstream/video/sfu/event/VideoMediaRequest; - public static synthetic fun copy$default (Lstream/video/sfu/event/VideoMediaRequest;IIILokio/ByteString;ILjava/lang/Object;)Lstream/video/sfu/event/VideoMediaRequest; - public fun equals (Ljava/lang/Object;)Z - public final fun getIdeal_frame_rate ()I - public final fun getIdeal_height ()I - public final fun getIdeal_width ()I - public fun hashCode ()I - public synthetic fun newBuilder ()Lcom/squareup/wire/Message$Builder; - public synthetic fun newBuilder ()Ljava/lang/Void; - public fun toString ()Ljava/lang/String; -} - -public final class stream/video/sfu/event/VideoMediaRequest$Companion { -} - public final class stream/video/sfu/event/VideoSender : com/squareup/wire/Message { public static final field ADAPTER Lcom/squareup/wire/ProtoAdapter; public static final field Companion Lstream/video/sfu/event/VideoSender$Companion; public fun ()V - public fun (Lstream/video/sfu/event/VideoMediaRequest;Lstream/video/sfu/models/Codec;Ljava/util/List;Lokio/ByteString;)V - public synthetic fun (Lstream/video/sfu/event/VideoMediaRequest;Lstream/video/sfu/models/Codec;Ljava/util/List;Lokio/ByteString;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun copy (Lstream/video/sfu/event/VideoMediaRequest;Lstream/video/sfu/models/Codec;Ljava/util/List;Lokio/ByteString;)Lstream/video/sfu/event/VideoSender; - public static synthetic fun copy$default (Lstream/video/sfu/event/VideoSender;Lstream/video/sfu/event/VideoMediaRequest;Lstream/video/sfu/models/Codec;Ljava/util/List;Lokio/ByteString;ILjava/lang/Object;)Lstream/video/sfu/event/VideoSender; + public fun (Lstream/video/sfu/models/Codec;Ljava/util/List;Lokio/ByteString;)V + public synthetic fun (Lstream/video/sfu/models/Codec;Ljava/util/List;Lokio/ByteString;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun copy (Lstream/video/sfu/models/Codec;Ljava/util/List;Lokio/ByteString;)Lstream/video/sfu/event/VideoSender; + public static synthetic fun copy$default (Lstream/video/sfu/event/VideoSender;Lstream/video/sfu/models/Codec;Ljava/util/List;Lokio/ByteString;ILjava/lang/Object;)Lstream/video/sfu/event/VideoSender; public fun equals (Ljava/lang/Object;)Z public final fun getCodec ()Lstream/video/sfu/models/Codec; public final fun getLayers ()Ljava/util/List; - public final fun getMedia_request ()Lstream/video/sfu/event/VideoMediaRequest; public fun hashCode ()I public synthetic fun newBuilder ()Lcom/squareup/wire/Message$Builder; public synthetic fun newBuilder ()Ljava/lang/Void; diff --git a/stream-video-android-core/src/androidTest/kotlin/io/getstream/video/android/core/AndroidDeviceTest.kt b/stream-video-android-core/src/androidTest/kotlin/io/getstream/video/android/core/AndroidDeviceTest.kt index c3ddd72332f..85db20b5e23 100644 --- a/stream-video-android-core/src/androidTest/kotlin/io/getstream/video/android/core/AndroidDeviceTest.kt +++ b/stream-video-android-core/src/androidTest/kotlin/io/getstream/video/android/core/AndroidDeviceTest.kt @@ -43,7 +43,6 @@ import retrofit2.Retrofit import retrofit2.converter.wire.WireConverterFactory import stream.video.sfu.event.ChangePublishQuality import stream.video.sfu.event.VideoLayerSetting -import stream.video.sfu.event.VideoMediaRequest import stream.video.sfu.event.VideoSender import stream.video.sfu.models.Participant import stream.video.sfu.models.TrackType @@ -580,7 +579,6 @@ class AndroidDeviceTest : IntegrationTestBase(connectCoordinatorWS = false) { // assertThat(tracks3?.size).isEqualTo(1) // test handling publish quality change - val mediaRequest = VideoMediaRequest() val layers = listOf( VideoLayerSetting(name = "f", active = false), VideoLayerSetting(name = "h", active = true), @@ -589,7 +587,6 @@ class AndroidDeviceTest : IntegrationTestBase(connectCoordinatorWS = false) { val quality = ChangePublishQuality( video_senders = listOf( VideoSender( - media_request = mediaRequest, layers = layers, ), ), diff --git a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/Call.kt b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/Call.kt index 243e18b8a68..0da67813e40 100644 --- a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/Call.kt +++ b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/Call.kt @@ -38,6 +38,7 @@ import io.getstream.video.android.core.model.QueriedMembers import io.getstream.video.android.core.model.RejectReason import io.getstream.video.android.core.model.SortField import io.getstream.video.android.core.model.UpdateUserPermissionsData +import io.getstream.video.android.core.model.VideoCodec import io.getstream.video.android.core.model.VideoTrack import io.getstream.video.android.core.model.toIceServer import io.getstream.video.android.core.socket.SocketState @@ -206,6 +207,7 @@ public class Call( /** Session handles all real time communication for video and audio */ internal var session: RtcSession? = null + internal val mediaManager by lazy { if (testInstanceProvider.mediaManagerCreator != null) { testInstanceProvider.mediaManagerCreator!!.invoke() @@ -1028,6 +1030,10 @@ public class Call( } fun cleanup() { + updatePublishOptions( + preferredVideoCodec = null, + preferredMaxBitrate = null, + ) // preferredMaxBitrate not necessarily needed monitor.stop() session?.cleanup() supervisorJob.cancel() @@ -1119,6 +1125,30 @@ public class Call( return clientImpl.toggleAudioProcessing() } + /** + * Updates publishing options for the call. + * + * @param preferredVideoCodec The preferred codec to use for publishing video. Pass `null` to return to the default codec. + * @param preferredMaxBitrate The preferred maximum bitrate to use for publishing video. + */ + fun updatePublishOptions( + preferredVideoCodec: VideoCodec? = null, + preferredMaxBitrate: Int? = null, + ) { + logger.d { + "[updatePublishOptions] #track #updatePublishOptions; preferredVideoCodec: $preferredVideoCodec, preferredMaxBitrate: $preferredMaxBitrate" + } + + // Note that the preferredVideoCodec won't affect any transceivers that are already created. + + state.videoPublishOptions = state.videoPublishOptions.copy( + preferredCodec = preferredVideoCodec, + preferredMaxBitrate = preferredMaxBitrate, + ) + + clientImpl.peerConnectionFactory.updatePublishOptions(preferredVideoCodec) + } + @InternalStreamVideoApi public val debug = Debug(this) diff --git a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/CallState.kt b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/CallState.kt index cc1f49bbe71..ddde6031df9 100644 --- a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/CallState.kt +++ b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/CallState.kt @@ -42,6 +42,7 @@ import io.getstream.video.android.core.model.RTMP import io.getstream.video.android.core.model.Reaction import io.getstream.video.android.core.model.RejectReason import io.getstream.video.android.core.model.ScreenSharingSession +import io.getstream.video.android.core.model.VideoPublishOptions import io.getstream.video.android.core.model.VisibilityOnScreenState import io.getstream.video.android.core.permission.PermissionRequest import io.getstream.video.android.core.pinning.PinType @@ -565,6 +566,8 @@ public class CallState( internal var acceptedOnThisDevice: Boolean = false + internal var videoPublishOptions: VideoPublishOptions = VideoPublishOptions() + fun handleEvent(event: VideoEvent) { logger.d { "Updating call state with event ${event::class.java}" } when (event) { diff --git a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/RtcSession.kt b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/RtcSession.kt index 1cca79a2cc2..1b881166bdb 100644 --- a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/RtcSession.kt +++ b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/RtcSession.kt @@ -52,6 +52,7 @@ import io.getstream.video.android.core.model.IceCandidate import io.getstream.video.android.core.model.IceServer import io.getstream.video.android.core.model.MediaTrack import io.getstream.video.android.core.model.StreamPeerType +import io.getstream.video.android.core.model.VideoCodec import io.getstream.video.android.core.model.VideoTrack import io.getstream.video.android.core.model.toPeerType import io.getstream.video.android.core.socket.SocketState @@ -100,11 +101,13 @@ import org.webrtc.MediaStreamTrack import org.webrtc.PeerConnection import org.webrtc.PeerConnection.PeerConnectionState import org.webrtc.RTCStatsReport +import org.webrtc.RtpParameters import org.webrtc.RtpParameters.Encoding import org.webrtc.RtpTransceiver import org.webrtc.SessionDescription import retrofit2.HttpException import stream.video.sfu.event.Migration +import stream.video.sfu.event.VideoLayerSetting import stream.video.sfu.models.ICETrickle import stream.video.sfu.models.Participant import stream.video.sfu.models.PeerType @@ -443,6 +446,7 @@ public class RtcSession internal constructor( call.mediaManager.videoTrack, listOf(buildTrackId(TrackType.TRACK_TYPE_VIDEO)), isScreenShare = false, + isUsingSvcCodec = call.state.videoPublishOptions.preferredCodec?.supportsSvc() == true, ) videoTransceiverInitialized = true } @@ -857,8 +861,12 @@ public class RtcSession internal constructor( val settings = call.state.settings.value val red = settings?.audio?.redundantCodingEnabled ?: true val opus = settings?.audio?.opusDtxEnabled ?: true + val preferredCodec = call.state.videoPublishOptions.preferredCodec + val enforceVp8 = preferredCodec == null - return mangleSdpUtil(sdp, red, opus) + logger.v { "[mangleSdp] #updatePublishOptions; Enforcing VP8: $enforceVp8, Using: $preferredCodec" } + + return mangleSdpUtil(sdp, red, opus, enableVp8 = enforceVp8) } @VisibleForTesting @@ -871,7 +879,8 @@ public class RtcSession internal constructor( mediaConstraints = MediaConstraints(), onNegotiationNeeded = ::onNegotiationNeeded, onIceCandidateRequest = ::sendIceCandidate, - maxPublishingBitrate = call.state.settings.value?.video?.targetResolution?.bitrate + maxPublishingBitrate = call.state.videoPublishOptions.preferredMaxBitrate + ?: call.state.settings.value?.video?.targetResolution?.bitrate ?: 1_200_000, ) logger.i { "[createPublisher] #sfu; publisher: $publisher" } @@ -888,45 +897,177 @@ public class RtcSession internal constructor( /** * Change the quality of video we upload when the ChangePublishQualityEvent event is received - * This is used for dynsacle + * This is used for Dynascale */ internal fun updatePublishQuality(event: ChangePublishQualityEvent) = synchronized(this) { + dynascaleLogger.v { "[updatePublishQuality] #sfu; Handling ChangePublishQualityEvent" } + val sender = publisher?.connection?.transceivers?.firstOrNull { it.mediaType == MediaStreamTrack.MediaType.MEDIA_TYPE_VIDEO }?.sender + val eventLayerSettingsList = event.changePublishQuality.video_senders.firstOrNull()?.layers - if (sender == null) { + if (sender == null || sender.parameters == null || sender.parameters.encodings == null || eventLayerSettingsList.isNullOrEmpty()) { dynascaleLogger.w { - "Request to change publishing quality not fulfilled due to missing transceivers or sender." + "[updatePublishQuality] #sfu; Sender properties are null or layer settings list is empty in event." } return@synchronized } - val enabledRids = - event.changePublishQuality.video_senders.firstOrNull()?.layers?.associate { - it.name to it.active + val senderParams = sender.parameters + val senderCodec = senderParams.codecs.firstOrNull() + val isUsingSvcCodec = rtpCodecToVideoCodec(senderCodec)?.supportsSvc() ?: false + val updatedEncodings = mutableSetOf() // Used only for logging + var didChanges = false + + for (senderEncoding in senderParams.encodings) { + dynascaleLogger.v { "[updatePublishQuality] #sfu; Iteration for rid: ${senderEncoding.rid}" } + + // For SVC, we only have one layer (q) and often rid is omitted + // For non-SVC, we need to find the layer by rid (simulcast) + val eventLayerSettings = if (isUsingSvcCodec) { + eventLayerSettingsList.firstOrNull() + } else { + eventLayerSettingsList.firstOrNull { it.name == senderEncoding.rid } + } + + // Enabled/disabled setting + updateActiveFlag(senderEncoding, eventLayerSettings).let { + didChanges = it || didChanges + if (it) updatedEncodings.add(senderEncoding) } - dynascaleLogger.i { "enabled rids: $enabledRids}" } - val params = sender.parameters - val updatedEncodings: MutableList = mutableListOf() + + // Quality settings + updateQualitySettings(senderEncoding, eventLayerSettings).let { + didChanges = it || didChanges + if (it) updatedEncodings.add(senderEncoding) + } + } + + if (didChanges) { + logUpdatedEncodingsRids(updatedEncodings) + + val didSet = sender.setParameters(senderParams) + dynascaleLogger.v { + "[updatePublishQuality] #sfu; Did set new parameters: $didSet" + } + } + + logLayerSettings(eventLayerSettingsList, sender.parameters.encodings) + } + + private fun rtpCodecToVideoCodec(codec: RtpParameters.Codec?): VideoCodec? = + if (codec == null) { + null + } else { + runCatching { VideoCodec.valueOf(codec.name.uppercase()) }.getOrNull().also { + dynascaleLogger.v { + "[updatePublishQuality] #sfu; Codec: ${it?.name}, supports SVC: ${it?.supportsSvc()}" + } + } + } + + private fun updateActiveFlag(senderEncoding: Encoding, eventLayerSettings: VideoLayerSetting?): Boolean { + return if (senderEncoding.active != eventLayerSettings?.active) { + senderEncoding.active = eventLayerSettings?.active ?: false + + dynascaleLogger.v { + "[updatePublishQuality][updateActiveFlag] #sfu; rid: ${senderEncoding.rid}; Changed active flag from ${!senderEncoding.active} to ${senderEncoding.active}" + } + + true + } else { + false + } + } + + private fun updateQualitySettings(senderEncoding: Encoding, eventLayerSettings: VideoLayerSetting?): Boolean { var changed = false - for (encoding in params.encodings) { - val shouldEnable = enabledRids?.get(encoding.rid) ?: false - if (shouldEnable && encoding.active) { - updatedEncodings.add(encoding) - } else if (!shouldEnable && !encoding.active) { - updatedEncodings.add(encoding) - } else { - changed = true - encoding.active = shouldEnable - updatedEncodings.add(encoding) + + eventLayerSettings?.let { settings -> + with(settings) { + if (max_bitrate > 0 && max_bitrate != (senderEncoding.maxBitrateBps ?: 0)) { + dynascaleLogger.v { + "[updatePublishQuality][updateQualitySettings] #sfu; rid: ${senderEncoding.rid}; Changed maxBitrate from ${senderEncoding.maxBitrateBps} to $max_bitrate" + } + senderEncoding.maxBitrateBps = max_bitrate + changed = true + } + + if (max_framerate > 0 && max_framerate != (senderEncoding.maxFramerate ?: 0)) { + dynascaleLogger.v { + "[updatePublishQuality][updateQualitySettings] #sfu; rid: ${senderEncoding.rid}; Changed maxFramerate from ${senderEncoding.maxFramerate} to $max_framerate" + } + senderEncoding.maxFramerate = max_framerate + changed = true + } + + scale_resolution_down_by.toDouble().let { scaleResolutionDownBy -> + if (scaleResolutionDownBy >= 1 && + scaleResolutionDownBy != (senderEncoding.scaleResolutionDownBy ?: 0) + ) { + dynascaleLogger.v { + "[updatePublishQuality][updateQualitySettings] #sfu; rid: ${senderEncoding.rid}; Changed scaleResolutionDownBy from ${senderEncoding.scaleResolutionDownBy} to $scale_resolution_down_by" + } + senderEncoding.scaleResolutionDownBy = scaleResolutionDownBy + changed = true + } + } + + if (scalability_mode.isNotBlank() && scalability_mode != (senderEncoding.scalabilityMode ?: "")) { + dynascaleLogger.v { + "[updatePublishQuality][updateQualitySettings] #sfu; rid: ${senderEncoding.rid}; Changed scalabilityMode from ${senderEncoding.scalabilityMode} to $scalability_mode" + } + senderEncoding.scalabilityMode = scalability_mode + changed = true + } + } + } + + return changed + } + + private fun logUpdatedEncodingsRids(updatedEncodings: Set) { + dynascaleLogger.d { + updatedEncodings.reversed().joinToString { + if (it.rid != null) it.rid.toString() else "" + }.let { + "[updatePublishQuality] #sfu; Updated encodings: $it" } } - if (changed) { - dynascaleLogger.i { "Updated publish quality with encodings $updatedEncodings" } - params.encodings.clear() - params.encodings.addAll(updatedEncodings) - sender.parameters = params + } + + private fun logLayerSettings( + eventLayerSettingsList: List? = null, + senderEncodingList: List, + ) { + val eventLog = eventLayerSettingsList?.joinToString(separator = "") { + "\n-Name: ${it.name}\n" + + "active: ${it.active}\n" + + "maxBitrate: ${it.max_bitrate}\n" + + "maxFramerate: ${it.max_framerate}\n" + + "scaleResolutionDownBy: ${it.scale_resolution_down_by}\n" + + "scalabilityMode: ${it.scalability_mode.ifEmpty { "(empty)" }}" + } + val senderLog = senderEncodingList.reversed().joinToString(separator = "") { + "\n-Name: ${it.rid}\n" + + "active: ${it.active}\n" + + "maxBitrate: ${it.maxBitrateBps}\n" + + "maxFramerate: ${it.maxFramerate}\n" + + "scaleResolutionDownBy: ${it.scaleResolutionDownBy}\n" + + "scalabilityMode: ${it.scalabilityMode}" + } + + dynascaleLogger.v { + "[updatePublishQuality] #sfu;\n" + + if (eventLog == null) { + "" + } else { + "Event layers:" + + "$eventLog\n\n" + } + + "Sender encodings:" + + senderLog } } @@ -1415,7 +1556,7 @@ public class RtcSession internal constructor( "video capture needs to be enabled before adding the local track", ) } - createVideoLayers(transceiver, captureResolution) + createVideoLayers(captureResolution) } else if (trackType == TrackType.TRACK_TYPE_SCREEN_SHARE) { createScreenShareLayers(transceiver) } else { @@ -1498,15 +1639,15 @@ public class RtcSession internal constructor( return media.mid.toString() } - private fun createVideoLayers( - transceiver: RtpTransceiver, - captureResolution: CaptureFormat, - ): List { - // we tell the Sfu which resolutions we're sending - return transceiver.sender.parameters.encodings.map { + private fun createVideoLayers(captureResolution: CaptureFormat): List { + // We tell the SFU which resolutions we're sending. + // Even if we use SVC, we still generate three layers [f, h, q] + // because we need to announce them to the SFU via the SetPublisher request, + // so we use the simulcast encodings here. + return publisher?.simulcastEncodings?.map { val scaleBy = it.scaleResolutionDownBy ?: 1.0 - val width = captureResolution.width.div(scaleBy) ?: 0 - val height = captureResolution.height.div(scaleBy) ?: 0 + val width = captureResolution.width.div(scaleBy) + val height = captureResolution.height.div(scaleBy) val quality = ridToVideoQuality(it.rid) // We need to divide by 1000 because the the FramerateRange is multiplied @@ -1523,7 +1664,7 @@ public class RtcSession internal constructor( fps = fps, quality = quality, ) - } + } ?: emptyList() } private fun createScreenShareLayers(transceiver: RtpTransceiver): List { diff --git a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/connection/LazyFactory.kt b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/connection/LazyFactory.kt new file mode 100644 index 00000000000..e6a7c4683a5 --- /dev/null +++ b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/connection/LazyFactory.kt @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2014-2024 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-video-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.video.android.core.call.connection + +import kotlin.reflect.KProperty + +internal fun lazyFactory(initializer: () -> T) = LazyFactory(initializer) + +internal class LazyFactory(private val initializer: () -> T) { + + private var value: T? = null + + operator fun getValue(thisRef: Any?, property: KProperty<*>): T { + if (value == null) { + value = initializer() + } + return value!! + } + + operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { + this.value = value + } +} diff --git a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/connection/PreferredCodecVideoEncoderFactory.kt b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/connection/PreferredCodecVideoEncoderFactory.kt new file mode 100644 index 00000000000..f3bfb1dc637 --- /dev/null +++ b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/connection/PreferredCodecVideoEncoderFactory.kt @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2014-2024 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-video-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.video.android.core.call.connection + +import io.getstream.log.taggedLogger +import io.getstream.video.android.core.model.VideoCodec +import org.webrtc.VideoCodecInfo +import org.webrtc.VideoEncoder +import org.webrtc.VideoEncoderFactory + +internal class PreferredCodecVideoEncoderFactory( + private val baseFactory: VideoEncoderFactory, + internal var preferredCodec: VideoCodec? = null, +) : VideoEncoderFactory { + + private val logger by taggedLogger("Call:PreferredCodecVideoEncoderFactory") + + override fun createEncoder(info: VideoCodecInfo?): VideoEncoder? { + logger.d { "[createEncoder] #updatePublishOptions; Creating encoder for codec: ${info?.name}" } + return baseFactory.createEncoder(info) + } + + override fun getSupportedCodecs(): Array { + // Search for preferredCodec and make it first in the list if found + return preferredCodec?.let { preferredCodec -> + val supportedCodecs = baseFactory.supportedCodecs.toMutableList() + + logger.d { + "[getSupportedCodecs] #updatePublishOptions; Supported codecs: ${supportedCodecs.joinToString { it.name }}" + } + + val preferredCodecIndex = supportedCodecs.indexOfFirst { + it.name.lowercase() == preferredCodec.name.lowercase() + } + if (preferredCodecIndex == -1) { + logger.w { + "[getSupportedCodecs] #updatePublishOptions; Preferred codec ${preferredCodec.name} not supported. Ignoring." + } + } else { + val preferredCodecInfo = supportedCodecs.removeAt(preferredCodecIndex) + supportedCodecs.add(0, preferredCodecInfo) + } + + logger.d { + "[getSupportedCodecs] #updatePublishOptions; Sorted codecs: ${supportedCodecs.joinToString { it.name }}" + } + + supportedCodecs.toTypedArray() + } ?: baseFactory.supportedCodecs + } +} diff --git a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/connection/StreamPeerConnection.kt b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/connection/StreamPeerConnection.kt index 90c948f752d..2a1eea731f7 100644 --- a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/connection/StreamPeerConnection.kt +++ b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/connection/StreamPeerConnection.kt @@ -87,6 +87,10 @@ public class StreamPeerConnection( internal val state = MutableStateFlow(null) internal val iceState = MutableStateFlow(null) + internal val simulcastEncodings by lazy { createSimulcastEncodings() } + internal val svcEncoding by lazy { createSvcEncoding() } + internal val screenShareEncoding by lazy { createScreenShareEncoding() } + private val logger by taggedLogger("Call:PeerConnection:$typeTag") /** @@ -271,11 +275,12 @@ public class StreamPeerConnection( track: MediaStreamTrack, streamIds: List, isScreenShare: Boolean, + isUsingSvcCodec: Boolean = false, ) { logger.d { "[addVideoTransceiver] #sfu; #$typeTag; track: ${track.stringify()}, streamIds: $streamIds" } - val transceiverInit = buildVideoTransceiverInit(streamIds, isScreenShare) + val transceiverInit = buildVideoTransceiverInit(streamIds, isScreenShare, isUsingSvcCodec) videoTransceiver = connection.addTransceiver(track, transceiverInit) } @@ -288,55 +293,16 @@ public class StreamPeerConnection( private fun buildVideoTransceiverInit( streamIds: List, isScreenShare: Boolean, + isUsingSvcCodec: Boolean = false, ): RtpTransceiverInit { val encodings = if (!isScreenShare) { - /** - * We create different RTP encodings for the transceiver. - * Full quality, represented by "f" ID. - * Half quality, represented by "h" ID. - * Quarter quality, represented by "q" ID. - * - * Their bitrate is also roughly as the name states - maximum for "full", ~half of that - * for "half" and another half, or total quarter of maximum, for "quarter". - */ - val quarterQuality = RtpParameters.Encoding( - "q", - true, - 4.0, - ).apply { - maxBitrateBps = maxBitRate / 4 - } - - val halfQuality = RtpParameters.Encoding( - "h", - true, - 2.0, - ).apply { - maxBitrateBps = maxBitRate / 2 - } - - val fullQuality = RtpParameters.Encoding( - "f", - true, - 1.0, - ).apply { - maxBitrateBps = maxBitRate -// networkPriority = 3 -// bitratePriority = 4.0 + if (!isUsingSvcCodec) { + simulcastEncodings + } else { + svcEncoding } - - listOf(quarterQuality, halfQuality, fullQuality) } else { - // this is aligned with iOS - val screenshareQuality = RtpParameters.Encoding( - "q", - true, - 1.0, - ).apply { - maxBitrateBps = 1_000_000 - } - - listOf(screenshareQuality) + screenShareEncoding } return RtpTransceiverInit( @@ -515,13 +481,79 @@ public class StreamPeerConnection( override fun onDataChannel(channel: DataChannel?): Unit = Unit - override fun toString(): String = - "StreamPeerConnection(type='$typeTag', constraints=$mediaConstraints)" - private fun String.mungeCodecs(): String { return this.replace("vp9", "VP9").replace("vp8", "VP8").replace("h264", "H264") } + private fun createSimulcastEncodings(): List { + /** + * We create different RTP encodings for the transceiver. + * Full quality, represented by "f" ID. + * Half quality, represented by "h" ID. + * Quarter quality, represented by "q" ID. + * + * Their bitrate is also roughly as the name states - maximum for "full", ~half of that + * for "half" and another half, or total quarter of maximum, for "quarter". + */ + + val quarterQuality = RtpParameters.Encoding( + "q", + true, + 4.0, + ).apply { + maxBitrateBps = maxBitRate / 4 + } + + val halfQuality = RtpParameters.Encoding( + "h", + true, + 2.0, + ).apply { + maxBitrateBps = maxBitRate / 2 + } + + val fullQuality = RtpParameters.Encoding( + "f", + true, + 1.0, + ).apply { + maxBitrateBps = maxBitRate +// networkPriority = 3 +// bitratePriority = 4.0 + } + + return listOf(quarterQuality, halfQuality, fullQuality) + } + + private fun createSvcEncoding(): List { + val encoding = RtpParameters.Encoding( + "q", + true, + 1.0, + ).apply { + maxBitrateBps = maxBitRate + scalabilityMode = "L3T2_KEY" + } + + return listOf(encoding) + } + + private fun createScreenShareEncoding(): List { + // This is aligned with iOS + val encoding = RtpParameters.Encoding( + "q", + true, + 1.0, + ).apply { + maxBitrateBps = 1_000_000 + } + + return listOf(encoding) + } + + override fun toString(): String = + "StreamPeerConnection(type='$typeTag', constraints=$mediaConstraints)" + private companion object { private const val DEBUG_STATS = false } diff --git a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/connection/StreamPeerConnectionFactory.kt b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/connection/StreamPeerConnectionFactory.kt index 65b453f831c..bec88058e33 100644 --- a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/connection/StreamPeerConnectionFactory.kt +++ b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/call/connection/StreamPeerConnectionFactory.kt @@ -24,6 +24,7 @@ import io.getstream.video.android.core.call.video.FilterVideoProcessor import io.getstream.video.android.core.defaultAudioUsage import io.getstream.video.android.core.model.IceCandidate import io.getstream.video.android.core.model.StreamPeerType +import io.getstream.video.android.core.model.VideoCodec import kotlinx.coroutines.CoroutineScope import org.webrtc.AudioSource import org.webrtc.AudioTrack @@ -37,6 +38,7 @@ import org.webrtc.PeerConnection import org.webrtc.PeerConnectionFactory import org.webrtc.ResolutionAdjustment import org.webrtc.SimulcastAlignedVideoEncoderFactory +import org.webrtc.VideoEncoderFactory import org.webrtc.VideoSource import org.webrtc.VideoTrack import org.webrtc.audio.JavaAudioDeviceModule @@ -97,30 +99,15 @@ public class StreamPeerConnectionFactory( EglBase.create() } - /** - * Default video decoder factory used to unpack video from the remote tracks. - */ - private val videoDecoderFactory by lazy { - DefaultBlacklistedVideoDecoderFactory(eglBase.eglBaseContext) - } - - /** - * Default encoder factory that supports Simulcast, used to send video tracks to the server. - */ - private val videoEncoderFactory by lazy { - SimulcastAlignedVideoEncoderFactory( - eglBase.eglBaseContext, - true, - true, - ResolutionAdjustment.MULTIPLE_OF_16, - ) - } - /** * Factory that builds all the connections based on the extensive configuration provided under * the hood. */ - private val factory by lazy { + private var peerConnectionFactory by lazyFactory(::createPeerConnectionFactory) + + private fun createPeerConnectionFactory(preferredEncodingCodec: VideoCodec? = null): PeerConnectionFactory { + webRtcLogger.d { "[createPeerConnectionFactory] #updatePublishOptions" } + PeerConnectionFactory.initialize( PeerConnectionFactory.InitializationOptions.builder(context) .setInjectableLogger({ message, severity, label -> @@ -151,12 +138,12 @@ public class StreamPeerConnectionFactory( .createInitializationOptions(), ) - PeerConnectionFactory.builder() + return PeerConnectionFactory.builder() .apply { audioProcessing?.also { setAudioProcessingFactory(it) } } - .setVideoDecoderFactory(videoDecoderFactory) - .setVideoEncoderFactory(videoEncoderFactory) + .setVideoDecoderFactory(defaultVideoDecoderFactory()) + .setVideoEncoderFactory(defaultVideoEncoderFactory(preferredEncodingCodec)) .setAudioDeviceModule( JavaAudioDeviceModule .builder(context) @@ -245,6 +232,26 @@ public class StreamPeerConnectionFactory( .createPeerConnectionFactory() } + private fun defaultVideoDecoderFactory() = DefaultBlacklistedVideoDecoderFactory( + eglBase.eglBaseContext, + ) + + private fun defaultVideoEncoderFactory(preferredCodec: VideoCodec? = null): VideoEncoderFactory { + webRtcLogger.d { + "[defaultVideoEncoderFactory] #updatePublishOptions; preferredCodec: ${preferredCodec?.name}" + } + + return PreferredCodecVideoEncoderFactory( + baseFactory = SimulcastAlignedVideoEncoderFactory( + eglBase.eglBaseContext, + true, + true, + ResolutionAdjustment.MULTIPLE_OF_16, + ), + preferredCodec = preferredCodec, + ) + } + /** * Builds a [StreamPeerConnection] that wraps the WebRTC [PeerConnection] and exposes several * helpful handlers. @@ -301,7 +308,7 @@ public class StreamPeerConnectionFactory( observer: PeerConnection.Observer?, ): PeerConnection { return requireNotNull( - factory.createPeerConnection( + peerConnectionFactory.createPeerConnection( configuration, observer, ), @@ -309,7 +316,7 @@ public class StreamPeerConnectionFactory( } /** - * Builds a [VideoSource] from the [factory] that can be used for regular video share (camera) + * Builds a [VideoSource] from the [peerConnectionFactory] that can be used for regular video share (camera) * or screen sharing. * * @param isScreencast If we're screen sharing using this source. @@ -320,12 +327,12 @@ public class StreamPeerConnectionFactory( isScreencast: Boolean, filterVideoProcessor: FilterVideoProcessor, ): VideoSource = - factory.createVideoSource(isScreencast).apply { + peerConnectionFactory.createVideoSource(isScreencast).apply { setVideoProcessor(filterVideoProcessor) } /** - * Builds a [VideoTrack] from the [factory] that can be used for regular video share (camera) + * Builds a [VideoTrack] from the [peerConnectionFactory] that can be used for regular video share (camera) * or screen sharing. * * @param source The [VideoSource] used for the track. @@ -335,19 +342,19 @@ public class StreamPeerConnectionFactory( public fun makeVideoTrack( source: VideoSource, trackId: String, - ): VideoTrack = factory.createVideoTrack(trackId, source) + ): VideoTrack = peerConnectionFactory.createVideoTrack(trackId, source) /** - * Builds an [AudioSource] from the [factory] that can be used for audio sharing. + * Builds an [AudioSource] from the [peerConnectionFactory] that can be used for audio sharing. * * @param constraints The constraints used to change the way the audio behaves. * @return [AudioSource] that can be used to build tracks. */ public fun makeAudioSource(constraints: MediaConstraints = MediaConstraints()): AudioSource = - factory.createAudioSource(constraints) + peerConnectionFactory.createAudioSource(constraints) /** - * Builds an [AudioTrack] from the [factory] that can be used for regular video share (camera) + * Builds an [AudioTrack] from the [peerConnectionFactory] that can be used for regular video share (camera) * or screen sharing. * * @param source The [AudioSource] used for the track. @@ -357,7 +364,7 @@ public class StreamPeerConnectionFactory( public fun makeAudioTrack( source: AudioSource, trackId: String, - ): AudioTrack = factory.createAudioTrack(trackId, source) + ): AudioTrack = peerConnectionFactory.createAudioTrack(trackId, source) /** * True if the audio processing is enabled, false otherwise. @@ -382,4 +389,15 @@ public class StreamPeerConnectionFactory( it.isEnabled } ?: false } + + internal fun updatePublishOptions(preferredVideoCodec: VideoCodec?) { + webRtcLogger.v { + "[updatePublishOptions] #updatePublishOptions; preferredCodec: $preferredVideoCodec" + } + + // We cannot initialize videoEncoderFactory separately without getting + // java.lang.UnsatisfiedLinkError: No impl found for long org.webrtc.SoftwareVideoEncoderFactory.nativeCreateFactory(). + // So we recreate peerConnectionFactory and let it create videoEncoderFactory internally with the new preferredCodec. + peerConnectionFactory = createPeerConnectionFactory(preferredVideoCodec) + } } diff --git a/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/model/VideoPublishOptions.kt b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/model/VideoPublishOptions.kt new file mode 100644 index 00000000000..805f26c85bf --- /dev/null +++ b/stream-video-android-core/src/main/kotlin/io/getstream/video/android/core/model/VideoPublishOptions.kt @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2014-2024 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-video-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.video.android.core.model + +import io.getstream.video.android.core.Call + +/** + * Options to configure video publishing. + * @param preferredCodec The preferred video codec to use for publishing. + * @param preferredMaxBitrate The preferred maximum bitrate to use for publishing. + * + * @see VideoCodec + * @see [Call.updatePublishOptions] + */ +data class VideoPublishOptions( + val preferredCodec: VideoCodec? = null, + val preferredMaxBitrate: Int? = null, +) + +/** + * Contains the video codecs supported by the SDK. + * + * @see [Call.updatePublishOptions] + */ +enum class VideoCodec { + H264, + VP8, + VP9, + AV1, + ; + + /** + * Checks if the codec supports SVC (Scalable Video Coding). + * Scalable Video Coding allows encoding multiple video layers (e.g., resolution or quality) into a single stream. + * + * @return True if the codec supports SVC, false otherwise. + */ + fun supportsSvc() = this == VP9 || this == AV1 +} diff --git a/stream-video-android-core/src/main/proto/video/sfu/event/events.pb.go b/stream-video-android-core/src/main/proto/video/sfu/event/events.pb.go index 1f5182959e8..3db5f3806f9 100644 --- a/stream-video-android-core/src/main/proto/video/sfu/event/events.pb.go +++ b/stream-video-android-core/src/main/proto/video/sfu/event/events.pb.go @@ -22,58 +22,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -type VideoLayerSetting_Priority int32 - -const ( - VideoLayerSetting_PRIORITY_HIGH_UNSPECIFIED VideoLayerSetting_Priority = 0 - VideoLayerSetting_PRIORITY_LOW VideoLayerSetting_Priority = 1 - VideoLayerSetting_PRIORITY_MEDIUM VideoLayerSetting_Priority = 2 - VideoLayerSetting_PRIORITY_VERY_LOW VideoLayerSetting_Priority = 3 -) - -// Enum value maps for VideoLayerSetting_Priority. -var ( - VideoLayerSetting_Priority_name = map[int32]string{ - 0: "PRIORITY_HIGH_UNSPECIFIED", - 1: "PRIORITY_LOW", - 2: "PRIORITY_MEDIUM", - 3: "PRIORITY_VERY_LOW", - } - VideoLayerSetting_Priority_value = map[string]int32{ - "PRIORITY_HIGH_UNSPECIFIED": 0, - "PRIORITY_LOW": 1, - "PRIORITY_MEDIUM": 2, - "PRIORITY_VERY_LOW": 3, - } -) - -func (x VideoLayerSetting_Priority) Enum() *VideoLayerSetting_Priority { - p := new(VideoLayerSetting_Priority) - *p = x - return p -} - -func (x VideoLayerSetting_Priority) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (VideoLayerSetting_Priority) Descriptor() protoreflect.EnumDescriptor { - return file_video_sfu_event_events_proto_enumTypes[0].Descriptor() -} - -func (VideoLayerSetting_Priority) Type() protoreflect.EnumType { - return &file_video_sfu_event_events_proto_enumTypes[0] -} - -func (x VideoLayerSetting_Priority) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use VideoLayerSetting_Priority.Descriptor instead. -func (VideoLayerSetting_Priority) EnumDescriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{26, 0} -} - // SFUEvent is a message that is sent from the SFU to the client. type SfuEvent struct { state protoimpl.MessageState @@ -102,6 +50,7 @@ type SfuEvent struct { // *SfuEvent_PinsUpdated // *SfuEvent_CallEnded // *SfuEvent_ParticipantUpdated + // *SfuEvent_ParticipantMigrationComplete EventPayload isSfuEvent_EventPayload `protobuf_oneof:"event_payload"` } @@ -284,6 +233,13 @@ func (x *SfuEvent) GetParticipantUpdated() *ParticipantUpdated { return nil } +func (x *SfuEvent) GetParticipantMigrationComplete() *ParticipantMigrationComplete { + if x, ok := x.GetEventPayload().(*SfuEvent_ParticipantMigrationComplete); ok { + return x.ParticipantMigrationComplete + } + return nil +} + type isSfuEvent_EventPayload interface { isSfuEvent_EventPayload() } @@ -410,6 +366,11 @@ type SfuEvent_ParticipantUpdated struct { ParticipantUpdated *ParticipantUpdated `protobuf:"bytes,24,opt,name=participant_updated,json=participantUpdated,proto3,oneof"` } +type SfuEvent_ParticipantMigrationComplete struct { + // ParticipantMigrationComplete is sent when the participant migration is complete + ParticipantMigrationComplete *ParticipantMigrationComplete `protobuf:"bytes,25,opt,name=participant_migration_complete,json=participantMigrationComplete,proto3,oneof"` +} + func (*SfuEvent_SubscriberOffer) isSfuEvent_EventPayload() {} func (*SfuEvent_PublisherAnswer) isSfuEvent_EventPayload() {} @@ -450,6 +411,46 @@ func (*SfuEvent_CallEnded) isSfuEvent_EventPayload() {} func (*SfuEvent_ParticipantUpdated) isSfuEvent_EventPayload() {} +func (*SfuEvent_ParticipantMigrationComplete) isSfuEvent_EventPayload() {} + +type ParticipantMigrationComplete struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *ParticipantMigrationComplete) Reset() { + *x = ParticipantMigrationComplete{} + if protoimpl.UnsafeEnabled { + mi := &file_video_sfu_event_events_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ParticipantMigrationComplete) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ParticipantMigrationComplete) ProtoMessage() {} + +func (x *ParticipantMigrationComplete) ProtoReflect() protoreflect.Message { + mi := &file_video_sfu_event_events_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ParticipantMigrationComplete.ProtoReflect.Descriptor instead. +func (*ParticipantMigrationComplete) Descriptor() ([]byte, []int) { + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{1} +} + type PinsChanged struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -463,7 +464,7 @@ type PinsChanged struct { func (x *PinsChanged) Reset() { *x = PinsChanged{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[1] + mi := &file_video_sfu_event_events_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -476,7 +477,7 @@ func (x *PinsChanged) String() string { func (*PinsChanged) ProtoMessage() {} func (x *PinsChanged) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[1] + mi := &file_video_sfu_event_events_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -489,7 +490,7 @@ func (x *PinsChanged) ProtoReflect() protoreflect.Message { // Deprecated: Use PinsChanged.ProtoReflect.Descriptor instead. func (*PinsChanged) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{1} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{2} } func (x *PinsChanged) GetPins() []*models.Pin { @@ -512,7 +513,7 @@ type Error struct { func (x *Error) Reset() { *x = Error{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[2] + mi := &file_video_sfu_event_events_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -525,7 +526,7 @@ func (x *Error) String() string { func (*Error) ProtoMessage() {} func (x *Error) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[2] + mi := &file_video_sfu_event_events_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -538,7 +539,7 @@ func (x *Error) ProtoReflect() protoreflect.Message { // Deprecated: Use Error.ProtoReflect.Descriptor instead. func (*Error) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{2} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{3} } func (x *Error) GetError() *models.Error { @@ -567,7 +568,7 @@ type ICETrickle struct { func (x *ICETrickle) Reset() { *x = ICETrickle{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[3] + mi := &file_video_sfu_event_events_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -580,7 +581,7 @@ func (x *ICETrickle) String() string { func (*ICETrickle) ProtoMessage() {} func (x *ICETrickle) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[3] + mi := &file_video_sfu_event_events_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -593,7 +594,7 @@ func (x *ICETrickle) ProtoReflect() protoreflect.Message { // Deprecated: Use ICETrickle.ProtoReflect.Descriptor instead. func (*ICETrickle) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{3} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{4} } func (x *ICETrickle) GetPeerType() models.PeerType { @@ -621,7 +622,7 @@ type ICERestart struct { func (x *ICERestart) Reset() { *x = ICERestart{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[4] + mi := &file_video_sfu_event_events_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -634,7 +635,7 @@ func (x *ICERestart) String() string { func (*ICERestart) ProtoMessage() {} func (x *ICERestart) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[4] + mi := &file_video_sfu_event_events_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -647,7 +648,7 @@ func (x *ICERestart) ProtoReflect() protoreflect.Message { // Deprecated: Use ICERestart.ProtoReflect.Descriptor instead. func (*ICERestart) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{4} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{5} } func (x *ICERestart) GetPeerType() models.PeerType { @@ -667,13 +668,14 @@ type SfuRequest struct { // // *SfuRequest_JoinRequest // *SfuRequest_HealthCheckRequest + // *SfuRequest_LeaveCallRequest RequestPayload isSfuRequest_RequestPayload `protobuf_oneof:"request_payload"` } func (x *SfuRequest) Reset() { *x = SfuRequest{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[5] + mi := &file_video_sfu_event_events_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -686,7 +688,7 @@ func (x *SfuRequest) String() string { func (*SfuRequest) ProtoMessage() {} func (x *SfuRequest) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[5] + mi := &file_video_sfu_event_events_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -699,7 +701,7 @@ func (x *SfuRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SfuRequest.ProtoReflect.Descriptor instead. func (*SfuRequest) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{5} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{6} } func (m *SfuRequest) GetRequestPayload() isSfuRequest_RequestPayload { @@ -723,6 +725,13 @@ func (x *SfuRequest) GetHealthCheckRequest() *HealthCheckRequest { return nil } +func (x *SfuRequest) GetLeaveCallRequest() *LeaveCallRequest { + if x, ok := x.GetRequestPayload().(*SfuRequest_LeaveCallRequest); ok { + return x.LeaveCallRequest + } + return nil +} + type isSfuRequest_RequestPayload interface { isSfuRequest_RequestPayload() } @@ -735,10 +744,71 @@ type SfuRequest_HealthCheckRequest struct { HealthCheckRequest *HealthCheckRequest `protobuf:"bytes,2,opt,name=health_check_request,json=healthCheckRequest,proto3,oneof"` } +type SfuRequest_LeaveCallRequest struct { + LeaveCallRequest *LeaveCallRequest `protobuf:"bytes,3,opt,name=leave_call_request,json=leaveCallRequest,proto3,oneof"` +} + func (*SfuRequest_JoinRequest) isSfuRequest_RequestPayload() {} func (*SfuRequest_HealthCheckRequest) isSfuRequest_RequestPayload() {} +func (*SfuRequest_LeaveCallRequest) isSfuRequest_RequestPayload() {} + +type LeaveCallRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SessionId string `protobuf:"bytes,1,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"` + Reason string `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"` +} + +func (x *LeaveCallRequest) Reset() { + *x = LeaveCallRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_video_sfu_event_events_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LeaveCallRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LeaveCallRequest) ProtoMessage() {} + +func (x *LeaveCallRequest) ProtoReflect() protoreflect.Message { + mi := &file_video_sfu_event_events_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LeaveCallRequest.ProtoReflect.Descriptor instead. +func (*LeaveCallRequest) Descriptor() ([]byte, []int) { + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{7} +} + +func (x *LeaveCallRequest) GetSessionId() string { + if x != nil { + return x.SessionId + } + return "" +} + +func (x *LeaveCallRequest) GetReason() string { + if x != nil { + return x.Reason + } + return "" +} + type HealthCheckRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -748,7 +818,7 @@ type HealthCheckRequest struct { func (x *HealthCheckRequest) Reset() { *x = HealthCheckRequest{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[6] + mi := &file_video_sfu_event_events_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -761,7 +831,7 @@ func (x *HealthCheckRequest) String() string { func (*HealthCheckRequest) ProtoMessage() {} func (x *HealthCheckRequest) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[6] + mi := &file_video_sfu_event_events_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -774,7 +844,7 @@ func (x *HealthCheckRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HealthCheckRequest.ProtoReflect.Descriptor instead. func (*HealthCheckRequest) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{6} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{8} } type HealthCheckResponse struct { @@ -788,7 +858,7 @@ type HealthCheckResponse struct { func (x *HealthCheckResponse) Reset() { *x = HealthCheckResponse{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[7] + mi := &file_video_sfu_event_events_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -801,7 +871,7 @@ func (x *HealthCheckResponse) String() string { func (*HealthCheckResponse) ProtoMessage() {} func (x *HealthCheckResponse) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[7] + mi := &file_video_sfu_event_events_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -814,7 +884,7 @@ func (x *HealthCheckResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use HealthCheckResponse.ProtoReflect.Descriptor instead. func (*HealthCheckResponse) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{7} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{9} } func (x *HealthCheckResponse) GetParticipantCount() *models.ParticipantCount { @@ -843,7 +913,7 @@ type TrackPublished struct { func (x *TrackPublished) Reset() { *x = TrackPublished{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[8] + mi := &file_video_sfu_event_events_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -856,7 +926,7 @@ func (x *TrackPublished) String() string { func (*TrackPublished) ProtoMessage() {} func (x *TrackPublished) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[8] + mi := &file_video_sfu_event_events_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -869,7 +939,7 @@ func (x *TrackPublished) ProtoReflect() protoreflect.Message { // Deprecated: Use TrackPublished.ProtoReflect.Descriptor instead. func (*TrackPublished) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{8} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{10} } func (x *TrackPublished) GetUserId() string { @@ -920,7 +990,7 @@ type TrackUnpublished struct { func (x *TrackUnpublished) Reset() { *x = TrackUnpublished{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[9] + mi := &file_video_sfu_event_events_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -933,7 +1003,7 @@ func (x *TrackUnpublished) String() string { func (*TrackUnpublished) ProtoMessage() {} func (x *TrackUnpublished) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[9] + mi := &file_video_sfu_event_events_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -946,7 +1016,7 @@ func (x *TrackUnpublished) ProtoReflect() protoreflect.Message { // Deprecated: Use TrackUnpublished.ProtoReflect.Descriptor instead. func (*TrackUnpublished) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{9} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{11} } func (x *TrackUnpublished) GetUserId() string { @@ -994,8 +1064,9 @@ type JoinRequest struct { // dumb SDP that allow us to extract subscriber's decode codecs SubscriberSdp string `protobuf:"bytes,3,opt,name=subscriber_sdp,json=subscriberSdp,proto3" json:"subscriber_sdp,omitempty"` ClientDetails *models.ClientDetails `protobuf:"bytes,4,opt,name=client_details,json=clientDetails,proto3" json:"client_details,omitempty"` - // TODO: we should know if this is going to be - // - publishing and subscribing, or just subscribing for future routing + // Deprecated: use ReconnectDetails instead + // + // Deprecated: Do not use. Migration *Migration `protobuf:"bytes,5,opt,name=migration,proto3" json:"migration,omitempty"` // Fast reconnect flag explicitly indicates that if the participant session // and the associated state is still present in the SFU, the client is ready @@ -1006,13 +1077,16 @@ type JoinRequest struct { // For the SFU, fast_reconnect:false indicates that even if it has the state // cached, the client state is not in sync and hence it must be cleaned up before // proceeding further. - FastReconnect bool `protobuf:"varint,6,opt,name=fast_reconnect,json=fastReconnect,proto3" json:"fast_reconnect,omitempty"` + // + // Deprecated: Do not use. + FastReconnect bool `protobuf:"varint,6,opt,name=fast_reconnect,json=fastReconnect,proto3" json:"fast_reconnect,omitempty"` + ReconnectDetails *ReconnectDetails `protobuf:"bytes,7,opt,name=reconnect_details,json=reconnectDetails,proto3" json:"reconnect_details,omitempty"` } func (x *JoinRequest) Reset() { *x = JoinRequest{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[10] + mi := &file_video_sfu_event_events_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1025,7 +1099,7 @@ func (x *JoinRequest) String() string { func (*JoinRequest) ProtoMessage() {} func (x *JoinRequest) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[10] + mi := &file_video_sfu_event_events_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1038,7 +1112,7 @@ func (x *JoinRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use JoinRequest.ProtoReflect.Descriptor instead. func (*JoinRequest) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{10} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{12} } func (x *JoinRequest) GetToken() string { @@ -1069,6 +1143,7 @@ func (x *JoinRequest) GetClientDetails() *models.ClientDetails { return nil } +// Deprecated: Do not use. func (x *JoinRequest) GetMigration() *Migration { if x != nil { return x.Migration @@ -1076,6 +1151,7 @@ func (x *JoinRequest) GetMigration() *Migration { return nil } +// Deprecated: Do not use. func (x *JoinRequest) GetFastReconnect() bool { if x != nil { return x.FastReconnect @@ -1083,6 +1159,101 @@ func (x *JoinRequest) GetFastReconnect() bool { return false } +func (x *JoinRequest) GetReconnectDetails() *ReconnectDetails { + if x != nil { + return x.ReconnectDetails + } + return nil +} + +type ReconnectDetails struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Strategy models.WebsocketReconnectStrategy `protobuf:"varint,1,opt,name=strategy,proto3,enum=stream.video.sfu.models.WebsocketReconnectStrategy" json:"strategy,omitempty"` + AnnouncedTracks []*models.TrackInfo `protobuf:"bytes,3,rep,name=announced_tracks,json=announcedTracks,proto3" json:"announced_tracks,omitempty"` + Subscriptions []*signal_rpc.TrackSubscriptionDetails `protobuf:"bytes,4,rep,name=subscriptions,proto3" json:"subscriptions,omitempty"` + ReconnectAttempt uint32 `protobuf:"varint,5,opt,name=reconnect_attempt,json=reconnectAttempt,proto3" json:"reconnect_attempt,omitempty"` + FromSfuId string `protobuf:"bytes,6,opt,name=from_sfu_id,json=fromSfuId,proto3" json:"from_sfu_id,omitempty"` + // only set in case of rejoin + PreviousSessionId string `protobuf:"bytes,7,opt,name=previous_session_id,json=previousSessionId,proto3" json:"previous_session_id,omitempty"` +} + +func (x *ReconnectDetails) Reset() { + *x = ReconnectDetails{} + if protoimpl.UnsafeEnabled { + mi := &file_video_sfu_event_events_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReconnectDetails) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReconnectDetails) ProtoMessage() {} + +func (x *ReconnectDetails) ProtoReflect() protoreflect.Message { + mi := &file_video_sfu_event_events_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReconnectDetails.ProtoReflect.Descriptor instead. +func (*ReconnectDetails) Descriptor() ([]byte, []int) { + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{13} +} + +func (x *ReconnectDetails) GetStrategy() models.WebsocketReconnectStrategy { + if x != nil { + return x.Strategy + } + return models.WebsocketReconnectStrategy(0) +} + +func (x *ReconnectDetails) GetAnnouncedTracks() []*models.TrackInfo { + if x != nil { + return x.AnnouncedTracks + } + return nil +} + +func (x *ReconnectDetails) GetSubscriptions() []*signal_rpc.TrackSubscriptionDetails { + if x != nil { + return x.Subscriptions + } + return nil +} + +func (x *ReconnectDetails) GetReconnectAttempt() uint32 { + if x != nil { + return x.ReconnectAttempt + } + return 0 +} + +func (x *ReconnectDetails) GetFromSfuId() string { + if x != nil { + return x.FromSfuId + } + return "" +} + +func (x *ReconnectDetails) GetPreviousSessionId() string { + if x != nil { + return x.PreviousSessionId + } + return "" +} + type Migration struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1096,7 +1267,7 @@ type Migration struct { func (x *Migration) Reset() { *x = Migration{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[11] + mi := &file_video_sfu_event_events_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1109,7 +1280,7 @@ func (x *Migration) String() string { func (*Migration) ProtoMessage() {} func (x *Migration) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[11] + mi := &file_video_sfu_event_events_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1122,7 +1293,7 @@ func (x *Migration) ProtoReflect() protoreflect.Message { // Deprecated: Use Migration.ProtoReflect.Descriptor instead. func (*Migration) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{11} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{14} } func (x *Migration) GetFromSfuId() string { @@ -1151,14 +1322,15 @@ type JoinResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CallState *models.CallState `protobuf:"bytes,1,opt,name=call_state,json=callState,proto3" json:"call_state,omitempty"` - Reconnected bool `protobuf:"varint,2,opt,name=reconnected,proto3" json:"reconnected,omitempty"` + CallState *models.CallState `protobuf:"bytes,1,opt,name=call_state,json=callState,proto3" json:"call_state,omitempty"` + Reconnected bool `protobuf:"varint,2,opt,name=reconnected,proto3" json:"reconnected,omitempty"` + FastReconnectDeadlineSeconds int32 `protobuf:"varint,3,opt,name=fast_reconnect_deadline_seconds,json=fastReconnectDeadlineSeconds,proto3" json:"fast_reconnect_deadline_seconds,omitempty"` } func (x *JoinResponse) Reset() { *x = JoinResponse{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[12] + mi := &file_video_sfu_event_events_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1171,7 +1343,7 @@ func (x *JoinResponse) String() string { func (*JoinResponse) ProtoMessage() {} func (x *JoinResponse) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[12] + mi := &file_video_sfu_event_events_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1184,7 +1356,7 @@ func (x *JoinResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use JoinResponse.ProtoReflect.Descriptor instead. func (*JoinResponse) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{12} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{15} } func (x *JoinResponse) GetCallState() *models.CallState { @@ -1201,6 +1373,13 @@ func (x *JoinResponse) GetReconnected() bool { return false } +func (x *JoinResponse) GetFastReconnectDeadlineSeconds() int32 { + if x != nil { + return x.FastReconnectDeadlineSeconds + } + return 0 +} + // ParticipantJoined is fired when a user joins a call type ParticipantJoined struct { state protoimpl.MessageState @@ -1214,7 +1393,7 @@ type ParticipantJoined struct { func (x *ParticipantJoined) Reset() { *x = ParticipantJoined{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[13] + mi := &file_video_sfu_event_events_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1227,7 +1406,7 @@ func (x *ParticipantJoined) String() string { func (*ParticipantJoined) ProtoMessage() {} func (x *ParticipantJoined) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[13] + mi := &file_video_sfu_event_events_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1240,7 +1419,7 @@ func (x *ParticipantJoined) ProtoReflect() protoreflect.Message { // Deprecated: Use ParticipantJoined.ProtoReflect.Descriptor instead. func (*ParticipantJoined) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{13} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{16} } func (x *ParticipantJoined) GetCallCid() string { @@ -1270,7 +1449,7 @@ type ParticipantLeft struct { func (x *ParticipantLeft) Reset() { *x = ParticipantLeft{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[14] + mi := &file_video_sfu_event_events_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1283,7 +1462,7 @@ func (x *ParticipantLeft) String() string { func (*ParticipantLeft) ProtoMessage() {} func (x *ParticipantLeft) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[14] + mi := &file_video_sfu_event_events_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1296,7 +1475,7 @@ func (x *ParticipantLeft) ProtoReflect() protoreflect.Message { // Deprecated: Use ParticipantLeft.ProtoReflect.Descriptor instead. func (*ParticipantLeft) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{14} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{17} } func (x *ParticipantLeft) GetCallCid() string { @@ -1326,7 +1505,7 @@ type ParticipantUpdated struct { func (x *ParticipantUpdated) Reset() { *x = ParticipantUpdated{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[15] + mi := &file_video_sfu_event_events_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1339,7 +1518,7 @@ func (x *ParticipantUpdated) String() string { func (*ParticipantUpdated) ProtoMessage() {} func (x *ParticipantUpdated) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[15] + mi := &file_video_sfu_event_events_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1352,7 +1531,7 @@ func (x *ParticipantUpdated) ProtoReflect() protoreflect.Message { // Deprecated: Use ParticipantUpdated.ProtoReflect.Descriptor instead. func (*ParticipantUpdated) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{15} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{18} } func (x *ParticipantUpdated) GetCallCid() string { @@ -1382,7 +1561,7 @@ type SubscriberOffer struct { func (x *SubscriberOffer) Reset() { *x = SubscriberOffer{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[16] + mi := &file_video_sfu_event_events_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1395,7 +1574,7 @@ func (x *SubscriberOffer) String() string { func (*SubscriberOffer) ProtoMessage() {} func (x *SubscriberOffer) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[16] + mi := &file_video_sfu_event_events_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1408,7 +1587,7 @@ func (x *SubscriberOffer) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriberOffer.ProtoReflect.Descriptor instead. func (*SubscriberOffer) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{16} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{19} } func (x *SubscriberOffer) GetIceRestart() bool { @@ -1436,7 +1615,7 @@ type PublisherAnswer struct { func (x *PublisherAnswer) Reset() { *x = PublisherAnswer{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[17] + mi := &file_video_sfu_event_events_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1449,7 +1628,7 @@ func (x *PublisherAnswer) String() string { func (*PublisherAnswer) ProtoMessage() {} func (x *PublisherAnswer) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[17] + mi := &file_video_sfu_event_events_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1462,7 +1641,7 @@ func (x *PublisherAnswer) ProtoReflect() protoreflect.Message { // Deprecated: Use PublisherAnswer.ProtoReflect.Descriptor instead. func (*PublisherAnswer) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{17} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{20} } func (x *PublisherAnswer) GetSdp() string { @@ -1485,7 +1664,7 @@ type ConnectionQualityChanged struct { func (x *ConnectionQualityChanged) Reset() { *x = ConnectionQualityChanged{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[18] + mi := &file_video_sfu_event_events_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1498,7 +1677,7 @@ func (x *ConnectionQualityChanged) String() string { func (*ConnectionQualityChanged) ProtoMessage() {} func (x *ConnectionQualityChanged) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[18] + mi := &file_video_sfu_event_events_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1511,7 +1690,7 @@ func (x *ConnectionQualityChanged) ProtoReflect() protoreflect.Message { // Deprecated: Use ConnectionQualityChanged.ProtoReflect.Descriptor instead. func (*ConnectionQualityChanged) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{18} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{21} } func (x *ConnectionQualityChanged) GetConnectionQualityUpdates() []*ConnectionQualityInfo { @@ -1534,7 +1713,7 @@ type ConnectionQualityInfo struct { func (x *ConnectionQualityInfo) Reset() { *x = ConnectionQualityInfo{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[19] + mi := &file_video_sfu_event_events_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1547,7 +1726,7 @@ func (x *ConnectionQualityInfo) String() string { func (*ConnectionQualityInfo) ProtoMessage() {} func (x *ConnectionQualityInfo) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[19] + mi := &file_video_sfu_event_events_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1560,7 +1739,7 @@ func (x *ConnectionQualityInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ConnectionQualityInfo.ProtoReflect.Descriptor instead. func (*ConnectionQualityInfo) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{19} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{22} } func (x *ConnectionQualityInfo) GetUserId() string { @@ -1597,7 +1776,7 @@ type DominantSpeakerChanged struct { func (x *DominantSpeakerChanged) Reset() { *x = DominantSpeakerChanged{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[20] + mi := &file_video_sfu_event_events_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1610,7 +1789,7 @@ func (x *DominantSpeakerChanged) String() string { func (*DominantSpeakerChanged) ProtoMessage() {} func (x *DominantSpeakerChanged) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[20] + mi := &file_video_sfu_event_events_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1623,7 +1802,7 @@ func (x *DominantSpeakerChanged) ProtoReflect() protoreflect.Message { // Deprecated: Use DominantSpeakerChanged.ProtoReflect.Descriptor instead. func (*DominantSpeakerChanged) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{20} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{23} } func (x *DominantSpeakerChanged) GetUserId() string { @@ -1655,7 +1834,7 @@ type AudioLevel struct { func (x *AudioLevel) Reset() { *x = AudioLevel{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[21] + mi := &file_video_sfu_event_events_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1668,7 +1847,7 @@ func (x *AudioLevel) String() string { func (*AudioLevel) ProtoMessage() {} func (x *AudioLevel) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[21] + mi := &file_video_sfu_event_events_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1681,7 +1860,7 @@ func (x *AudioLevel) ProtoReflect() protoreflect.Message { // Deprecated: Use AudioLevel.ProtoReflect.Descriptor instead. func (*AudioLevel) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{21} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{24} } func (x *AudioLevel) GetUserId() string { @@ -1724,7 +1903,7 @@ type AudioLevelChanged struct { func (x *AudioLevelChanged) Reset() { *x = AudioLevelChanged{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[22] + mi := &file_video_sfu_event_events_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1737,7 +1916,7 @@ func (x *AudioLevelChanged) String() string { func (*AudioLevelChanged) ProtoMessage() {} func (x *AudioLevelChanged) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[22] + mi := &file_video_sfu_event_events_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1750,7 +1929,7 @@ func (x *AudioLevelChanged) ProtoReflect() protoreflect.Message { // Deprecated: Use AudioLevelChanged.ProtoReflect.Descriptor instead. func (*AudioLevelChanged) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{22} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{25} } func (x *AudioLevelChanged) GetAudioLevels() []*AudioLevel { @@ -1760,66 +1939,18 @@ func (x *AudioLevelChanged) GetAudioLevels() []*AudioLevel { return nil } -type AudioMediaRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ChannelCount int32 `protobuf:"varint,1,opt,name=channel_count,json=channelCount,proto3" json:"channel_count,omitempty"` -} - -func (x *AudioMediaRequest) Reset() { - *x = AudioMediaRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AudioMediaRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AudioMediaRequest) ProtoMessage() {} - -func (x *AudioMediaRequest) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[23] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AudioMediaRequest.ProtoReflect.Descriptor instead. -func (*AudioMediaRequest) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{23} -} - -func (x *AudioMediaRequest) GetChannelCount() int32 { - if x != nil { - return x.ChannelCount - } - return 0 -} - type AudioSender struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MediaRequest *AudioMediaRequest `protobuf:"bytes,1,opt,name=media_request,json=mediaRequest,proto3" json:"media_request,omitempty"` - Codec *models.Codec `protobuf:"bytes,2,opt,name=codec,proto3" json:"codec,omitempty"` + Codec *models.Codec `protobuf:"bytes,2,opt,name=codec,proto3" json:"codec,omitempty"` } func (x *AudioSender) Reset() { *x = AudioSender{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[24] + mi := &file_video_sfu_event_events_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1832,7 +1963,7 @@ func (x *AudioSender) String() string { func (*AudioSender) ProtoMessage() {} func (x *AudioSender) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[24] + mi := &file_video_sfu_event_events_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1845,14 +1976,7 @@ func (x *AudioSender) ProtoReflect() protoreflect.Message { // Deprecated: Use AudioSender.ProtoReflect.Descriptor instead. func (*AudioSender) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{24} -} - -func (x *AudioSender) GetMediaRequest() *AudioMediaRequest { - if x != nil { - return x.MediaRequest - } - return nil + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{26} } func (x *AudioSender) GetCodec() *models.Codec { @@ -1862,69 +1986,6 @@ func (x *AudioSender) GetCodec() *models.Codec { return nil } -type VideoMediaRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - IdealHeight int32 `protobuf:"varint,1,opt,name=ideal_height,json=idealHeight,proto3" json:"ideal_height,omitempty"` - IdealWidth int32 `protobuf:"varint,2,opt,name=ideal_width,json=idealWidth,proto3" json:"ideal_width,omitempty"` - IdealFrameRate int32 `protobuf:"varint,3,opt,name=ideal_frame_rate,json=idealFrameRate,proto3" json:"ideal_frame_rate,omitempty"` -} - -func (x *VideoMediaRequest) Reset() { - *x = VideoMediaRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[25] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *VideoMediaRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*VideoMediaRequest) ProtoMessage() {} - -func (x *VideoMediaRequest) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[25] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use VideoMediaRequest.ProtoReflect.Descriptor instead. -func (*VideoMediaRequest) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{25} -} - -func (x *VideoMediaRequest) GetIdealHeight() int32 { - if x != nil { - return x.IdealHeight - } - return 0 -} - -func (x *VideoMediaRequest) GetIdealWidth() int32 { - if x != nil { - return x.IdealWidth - } - return 0 -} - -func (x *VideoMediaRequest) GetIdealFrameRate() int32 { - if x != nil { - return x.IdealFrameRate - } - return 0 -} - // VideoLayerSetting is used to specify various parameters of a particular encoding in simulcast. // The parameters are specified here - https://developer.mozilla.org/en-US/docs/Web/API/RTCRtpEncodingParameters // SDKs use these parameters sent from the server to dynamically adjust these parameters to save CPU, bandwidth @@ -1933,19 +1994,19 @@ type VideoLayerSetting struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Active bool `protobuf:"varint,2,opt,name=active,proto3" json:"active,omitempty"` - MaxBitrate int32 `protobuf:"varint,3,opt,name=max_bitrate,json=maxBitrate,proto3" json:"max_bitrate,omitempty"` - ScaleResolutionDownBy float32 `protobuf:"fixed32,4,opt,name=scale_resolution_down_by,json=scaleResolutionDownBy,proto3" json:"scale_resolution_down_by,omitempty"` - Priority VideoLayerSetting_Priority `protobuf:"varint,5,opt,name=priority,proto3,enum=stream.video.sfu.event.VideoLayerSetting_Priority" json:"priority,omitempty"` - Codec *models.Codec `protobuf:"bytes,6,opt,name=codec,proto3" json:"codec,omitempty"` - MaxFramerate uint32 `protobuf:"varint,7,opt,name=max_framerate,json=maxFramerate,proto3" json:"max_framerate,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Active bool `protobuf:"varint,2,opt,name=active,proto3" json:"active,omitempty"` + MaxBitrate int32 `protobuf:"varint,3,opt,name=max_bitrate,json=maxBitrate,proto3" json:"max_bitrate,omitempty"` + ScaleResolutionDownBy float32 `protobuf:"fixed32,4,opt,name=scale_resolution_down_by,json=scaleResolutionDownBy,proto3" json:"scale_resolution_down_by,omitempty"` + Codec *models.Codec `protobuf:"bytes,6,opt,name=codec,proto3" json:"codec,omitempty"` + MaxFramerate uint32 `protobuf:"varint,7,opt,name=max_framerate,json=maxFramerate,proto3" json:"max_framerate,omitempty"` + ScalabilityMode string `protobuf:"bytes,8,opt,name=scalability_mode,json=scalabilityMode,proto3" json:"scalability_mode,omitempty"` } func (x *VideoLayerSetting) Reset() { *x = VideoLayerSetting{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[26] + mi := &file_video_sfu_event_events_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1958,7 +2019,7 @@ func (x *VideoLayerSetting) String() string { func (*VideoLayerSetting) ProtoMessage() {} func (x *VideoLayerSetting) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[26] + mi := &file_video_sfu_event_events_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1971,7 +2032,7 @@ func (x *VideoLayerSetting) ProtoReflect() protoreflect.Message { // Deprecated: Use VideoLayerSetting.ProtoReflect.Descriptor instead. func (*VideoLayerSetting) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{26} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{27} } func (x *VideoLayerSetting) GetName() string { @@ -2002,13 +2063,6 @@ func (x *VideoLayerSetting) GetScaleResolutionDownBy() float32 { return 0 } -func (x *VideoLayerSetting) GetPriority() VideoLayerSetting_Priority { - if x != nil { - return x.Priority - } - return VideoLayerSetting_PRIORITY_HIGH_UNSPECIFIED -} - func (x *VideoLayerSetting) GetCodec() *models.Codec { if x != nil { return x.Codec @@ -2023,20 +2077,26 @@ func (x *VideoLayerSetting) GetMaxFramerate() uint32 { return 0 } +func (x *VideoLayerSetting) GetScalabilityMode() string { + if x != nil { + return x.ScalabilityMode + } + return "" +} + type VideoSender struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MediaRequest *VideoMediaRequest `protobuf:"bytes,1,opt,name=media_request,json=mediaRequest,proto3" json:"media_request,omitempty"` - Codec *models.Codec `protobuf:"bytes,2,opt,name=codec,proto3" json:"codec,omitempty"` - Layers []*VideoLayerSetting `protobuf:"bytes,3,rep,name=layers,proto3" json:"layers,omitempty"` + Codec *models.Codec `protobuf:"bytes,2,opt,name=codec,proto3" json:"codec,omitempty"` + Layers []*VideoLayerSetting `protobuf:"bytes,3,rep,name=layers,proto3" json:"layers,omitempty"` } func (x *VideoSender) Reset() { *x = VideoSender{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[27] + mi := &file_video_sfu_event_events_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2049,7 +2109,7 @@ func (x *VideoSender) String() string { func (*VideoSender) ProtoMessage() {} func (x *VideoSender) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[27] + mi := &file_video_sfu_event_events_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2062,14 +2122,7 @@ func (x *VideoSender) ProtoReflect() protoreflect.Message { // Deprecated: Use VideoSender.ProtoReflect.Descriptor instead. func (*VideoSender) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{27} -} - -func (x *VideoSender) GetMediaRequest() *VideoMediaRequest { - if x != nil { - return x.MediaRequest - } - return nil + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{28} } func (x *VideoSender) GetCodec() *models.Codec { @@ -2099,7 +2152,7 @@ type ChangePublishQuality struct { func (x *ChangePublishQuality) Reset() { *x = ChangePublishQuality{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[28] + mi := &file_video_sfu_event_events_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2112,7 +2165,7 @@ func (x *ChangePublishQuality) String() string { func (*ChangePublishQuality) ProtoMessage() {} func (x *ChangePublishQuality) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[28] + mi := &file_video_sfu_event_events_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2125,7 +2178,7 @@ func (x *ChangePublishQuality) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangePublishQuality.ProtoReflect.Descriptor instead. func (*ChangePublishQuality) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{28} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{29} } func (x *ChangePublishQuality) GetAudioSenders() []*AudioSender { @@ -2170,7 +2223,7 @@ type CallGrantsUpdated struct { func (x *CallGrantsUpdated) Reset() { *x = CallGrantsUpdated{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[29] + mi := &file_video_sfu_event_events_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2183,7 +2236,7 @@ func (x *CallGrantsUpdated) String() string { func (*CallGrantsUpdated) ProtoMessage() {} func (x *CallGrantsUpdated) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[29] + mi := &file_video_sfu_event_events_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2196,7 +2249,7 @@ func (x *CallGrantsUpdated) ProtoReflect() protoreflect.Message { // Deprecated: Use CallGrantsUpdated.ProtoReflect.Descriptor instead. func (*CallGrantsUpdated) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{29} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{30} } func (x *CallGrantsUpdated) GetCurrentGrants() *models.CallGrants { @@ -2226,7 +2279,7 @@ type GoAway struct { func (x *GoAway) Reset() { *x = GoAway{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[30] + mi := &file_video_sfu_event_events_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2239,7 +2292,7 @@ func (x *GoAway) String() string { func (*GoAway) ProtoMessage() {} func (x *GoAway) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[30] + mi := &file_video_sfu_event_events_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2252,7 +2305,7 @@ func (x *GoAway) ProtoReflect() protoreflect.Message { // Deprecated: Use GoAway.ProtoReflect.Descriptor instead. func (*GoAway) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{30} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{31} } func (x *GoAway) GetReason() models.GoAwayReason { @@ -2275,7 +2328,7 @@ type CallEnded struct { func (x *CallEnded) Reset() { *x = CallEnded{} if protoimpl.UnsafeEnabled { - mi := &file_video_sfu_event_events_proto_msgTypes[31] + mi := &file_video_sfu_event_events_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2288,7 +2341,7 @@ func (x *CallEnded) String() string { func (*CallEnded) ProtoMessage() {} func (x *CallEnded) ProtoReflect() protoreflect.Message { - mi := &file_video_sfu_event_events_proto_msgTypes[31] + mi := &file_video_sfu_event_events_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2301,7 +2354,7 @@ func (x *CallEnded) ProtoReflect() protoreflect.Message { // Deprecated: Use CallEnded.ProtoReflect.Descriptor instead. func (*CallEnded) Descriptor() ([]byte, []int) { - return file_video_sfu_event_events_proto_rawDescGZIP(), []int{31} + return file_video_sfu_event_events_proto_rawDescGZIP(), []int{32} } func (x *CallEnded) GetReason() models.CallEndedReason { @@ -2321,7 +2374,7 @@ var file_video_sfu_event_events_proto_rawDesc = []byte{ 0x75, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2f, 0x73, 0x66, 0x75, 0x2f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x5f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x69, 0x67, 0x6e, - 0x61, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc1, 0x0d, 0x0a, 0x08, 0x53, 0x66, 0x75, + 0x61, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbf, 0x0e, 0x0a, 0x08, 0x53, 0x66, 0x75, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x54, 0x0a, 0x10, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, @@ -2428,56 +2481,89 @@ var file_video_sfu_event_events_proto_rawDesc = []byte{ 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, - 0x70, 0x61, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x3f, 0x0a, 0x0b, - 0x50, 0x69, 0x6e, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x04, 0x70, - 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x73, 0x2e, 0x50, 0x69, 0x6e, 0x52, 0x04, 0x70, 0x69, 0x6e, 0x73, 0x22, 0xa1, 0x01, - 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x34, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, - 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, - 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x62, 0x0a, - 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, - 0x65, 0x67, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x33, 0x2e, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x73, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x11, - 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, - 0x79, 0x22, 0x71, 0x0a, 0x0a, 0x49, 0x43, 0x45, 0x54, 0x72, 0x69, 0x63, 0x6b, 0x6c, 0x65, 0x12, - 0x3e, 0x0a, 0x09, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, - 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x50, 0x65, 0x65, - 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x23, 0x0a, 0x0d, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x63, 0x65, 0x43, 0x61, 0x6e, 0x64, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x22, 0x4c, 0x0a, 0x0a, 0x49, 0x43, 0x45, 0x52, 0x65, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x12, 0x3e, 0x0a, 0x09, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, - 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, - 0x50, 0x65, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x54, 0x79, - 0x70, 0x65, 0x22, 0xc9, 0x01, 0x0a, 0x0a, 0x53, 0x66, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x48, 0x0a, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x70, 0x61, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x7c, 0x0a, 0x1e, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x19, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, + 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x00, 0x52, 0x1c, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x1e, 0x0a, 0x1c, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x3f, 0x0a, 0x0b, 0x50, 0x69, + 0x6e, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x04, 0x70, 0x69, 0x6e, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x73, 0x2e, 0x50, 0x69, 0x6e, 0x52, 0x04, 0x70, 0x69, 0x6e, 0x73, 0x22, 0xa1, 0x01, 0x0a, 0x05, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x34, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, + 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x62, 0x0a, 0x12, 0x72, + 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, + 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x33, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x73, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x11, 0x72, 0x65, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, + 0x71, 0x0a, 0x0a, 0x49, 0x43, 0x45, 0x54, 0x72, 0x69, 0x63, 0x6b, 0x6c, 0x65, 0x12, 0x3e, 0x0a, + 0x09, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x21, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, + 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x63, 0x65, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x22, 0x4c, 0x0a, 0x0a, 0x49, 0x43, 0x45, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x12, 0x3e, 0x0a, 0x09, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, + 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x50, 0x65, + 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, + 0x22, 0xa3, 0x02, 0x0a, 0x0a, 0x53, 0x66, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x48, 0x0a, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, + 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4a, + 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x6a, 0x6f, + 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5e, 0x0a, 0x14, 0x68, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0b, - 0x6a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5e, 0x0a, 0x14, 0x68, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x12, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x11, 0x0a, 0x0f, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x14, - 0x0a, 0x12, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x6d, 0x0a, 0x13, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x11, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, - 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, - 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x52, 0x10, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0xc8, 0x01, 0x0a, 0x0e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x50, 0x75, 0x62, + 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x12, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x58, 0x0a, 0x12, 0x6c, 0x65, 0x61, + 0x76, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, + 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4c, + 0x65, 0x61, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, + 0x00, 0x52, 0x10, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x42, 0x11, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x49, 0x0a, 0x10, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x43, + 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x22, 0x14, 0x0a, 0x12, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x6d, 0x0a, 0x13, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, + 0x0a, 0x11, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x73, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x10, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, + 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xc8, 0x01, 0x0a, 0x0e, 0x54, 0x72, 0x61, 0x63, 0x6b, + 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x36, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x22, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, + 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, + 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, + 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, + 0x70, 0x61, 0x6e, 0x74, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, + 0x74, 0x22, 0x8f, 0x02, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, @@ -2485,231 +2571,223 @@ var file_video_sfu_event_events_proto_rawDesc = []byte{ 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, - 0x74, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x22, 0x8f, - 0x02, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, - 0x68, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, - 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x43, 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, - 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x54, 0x72, 0x61, - 0x63, 0x6b, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, - 0x61, 0x6e, 0x74, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, - 0x22, 0xa0, 0x02, 0x0a, 0x0b, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x72, 0x5f, 0x73, 0x64, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x53, 0x64, 0x70, 0x12, 0x4d, 0x0a, 0x0e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, - 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x43, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x0d, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x3f, 0x0a, 0x09, 0x6d, - 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, - 0x75, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x09, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, - 0x66, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x66, 0x61, 0x73, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x22, 0xd3, 0x01, 0x0a, 0x09, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x1e, 0x0a, 0x0b, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x73, 0x66, 0x75, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x53, 0x66, 0x75, 0x49, - 0x64, 0x12, 0x4d, 0x0a, 0x10, 0x61, 0x6e, 0x6e, 0x6f, 0x75, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x74, - 0x72, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0f, 0x61, 0x6e, 0x6e, 0x6f, 0x75, 0x6e, 0x63, 0x65, 0x64, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x73, - 0x12, 0x57, 0x0a, 0x0d, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x6c, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x0d, 0x73, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x73, 0x0a, 0x0c, 0x4a, 0x6f, 0x69, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0a, 0x63, 0x61, 0x6c, - 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0b, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x76, - 0x0a, 0x11, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x4a, 0x6f, 0x69, - 0x6e, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x61, 0x6c, 0x6c, 0x43, 0x69, 0x64, 0x12, 0x46, - 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, - 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x22, 0x74, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x61, 0x6c, - 0x6c, 0x5f, 0x63, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x61, 0x6c, - 0x6c, 0x43, 0x69, 0x64, 0x12, 0x46, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, - 0x61, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x73, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, - 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x22, 0x77, 0x0a, 0x12, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x61, 0x6c, 0x6c, 0x43, 0x69, 0x64, 0x12, 0x46, 0x0a, - 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, - 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x22, 0x44, 0x0a, 0x0f, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x72, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x63, 0x65, 0x5f, - 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, - 0x63, 0x65, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x64, 0x70, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x64, 0x70, 0x22, 0x23, 0x0a, 0x0f, 0x50, - 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x72, 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x12, 0x10, - 0x0a, 0x03, 0x73, 0x64, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x64, 0x70, - 0x22, 0x87, 0x01, 0x0a, 0x18, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x51, - 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x6b, 0x0a, - 0x1a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x71, 0x75, 0x61, 0x6c, - 0x69, 0x74, 0x79, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2d, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, - 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x18, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x61, 0x6c, - 0x69, 0x74, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x22, 0xaa, 0x01, 0x0a, 0x15, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, - 0x0a, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x59, 0x0a, 0x12, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x71, 0x75, 0x61, 0x6c, 0x69, - 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x43, 0x0a, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, + 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, + 0x54, 0x72, 0x61, 0x63, 0x6b, 0x55, 0x6e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x24, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, + 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x6e, 0x74, 0x22, 0xff, 0x02, 0x0a, 0x0b, 0x4a, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x5f, 0x73, 0x64, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x53, 0x64, 0x70, 0x12, + 0x4d, 0x0a, 0x0e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x73, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, + 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x43, + 0x0a, 0x09, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, + 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x02, 0x18, 0x01, 0x52, 0x09, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x0e, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, + 0x0d, 0x66, 0x61, 0x73, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x55, + 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x88, 0x03, 0x0a, 0x10, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x4f, 0x0a, 0x08, 0x73, 0x74, + 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x33, 0x2e, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, + 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, + 0x79, 0x52, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x4d, 0x0a, 0x10, 0x61, + 0x6e, 0x6e, 0x6f, 0x75, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, + 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, + 0x54, 0x72, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x61, 0x6e, 0x6e, 0x6f, 0x75, + 0x6e, 0x63, 0x65, 0x64, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x57, 0x0a, 0x0d, 0x73, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x31, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, + 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x2e, 0x54, 0x72, 0x61, 0x63, + 0x6b, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x52, 0x0d, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, + 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, + 0x12, 0x1e, 0x0a, 0x0b, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x73, 0x66, 0x75, 0x5f, 0x69, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x53, 0x66, 0x75, 0x49, 0x64, + 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x22, 0xd3, 0x01, 0x0a, 0x09, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, + 0x0a, 0x0b, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x73, 0x66, 0x75, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x53, 0x66, 0x75, 0x49, 0x64, 0x12, 0x4d, + 0x0a, 0x10, 0x61, 0x6e, 0x6e, 0x6f, 0x75, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x63, + 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x61, - 0x6c, 0x69, 0x74, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x22, 0x50, 0x0a, 0x16, 0x44, 0x6f, 0x6d, 0x69, 0x6e, - 0x61, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x7b, 0x0a, 0x0a, 0x41, 0x75, 0x64, - 0x69, 0x6f, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, - 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x73, 0x70, 0x65, 0x61, - 0x6b, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x53, 0x70, - 0x65, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x22, 0x5a, 0x0a, 0x11, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x4c, - 0x65, 0x76, 0x65, 0x6c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0c, 0x61, - 0x75, 0x64, 0x69, 0x6f, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, - 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x6f, - 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x4c, 0x65, 0x76, 0x65, - 0x6c, 0x73, 0x22, 0x38, 0x0a, 0x11, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x4d, 0x65, 0x64, 0x69, 0x61, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, - 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x93, 0x01, 0x0a, - 0x0b, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x0d, - 0x6d, 0x65, 0x64, 0x69, 0x61, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, - 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x75, 0x64, - 0x69, 0x6f, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0c, - 0x6d, 0x65, 0x64, 0x69, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x05, - 0x63, 0x6f, 0x64, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x73, 0x74, + 0x6c, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x61, 0x6e, + 0x6e, 0x6f, 0x75, 0x6e, 0x63, 0x65, 0x64, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x57, 0x0a, + 0x0d, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, + 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x2e, 0x54, + 0x72, 0x61, 0x63, 0x6b, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x0d, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xba, 0x01, 0x0a, 0x0c, 0x4a, 0x6f, 0x69, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0a, 0x63, 0x61, 0x6c, 0x6c, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x52, 0x05, 0x63, 0x6f, 0x64, - 0x65, 0x63, 0x22, 0x81, 0x01, 0x0a, 0x11, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x4d, 0x65, 0x64, 0x69, - 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x64, 0x65, 0x61, - 0x6c, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, - 0x69, 0x64, 0x65, 0x61, 0x6c, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x69, - 0x64, 0x65, 0x61, 0x6c, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0a, 0x69, 0x64, 0x65, 0x61, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x28, 0x0a, 0x10, - 0x69, 0x64, 0x65, 0x61, 0x6c, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x69, 0x64, 0x65, 0x61, 0x6c, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x52, 0x61, 0x74, 0x65, 0x22, 0xad, 0x03, 0x0a, 0x11, 0x56, 0x69, 0x64, 0x65, 0x6f, - 0x4c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, - 0x62, 0x69, 0x74, 0x72, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6d, - 0x61, 0x78, 0x42, 0x69, 0x74, 0x72, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x18, 0x73, 0x63, 0x61, - 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x6f, - 0x77, 0x6e, 0x5f, 0x62, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x15, 0x73, 0x63, 0x61, - 0x6c, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x6f, 0x77, 0x6e, - 0x42, 0x79, 0x12, 0x4e, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, - 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x69, - 0x64, 0x65, 0x6f, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x2e, - 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, - 0x74, 0x79, 0x12, 0x34, 0x0a, 0x05, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, - 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x43, 0x6f, 0x64, 0x65, - 0x63, 0x52, 0x05, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, - 0x66, 0x72, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0c, 0x6d, 0x61, 0x78, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x74, 0x65, 0x22, 0x67, 0x0a, - 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x52, 0x49, - 0x4f, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x52, 0x49, 0x4f, - 0x52, 0x49, 0x54, 0x59, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x52, - 0x49, 0x4f, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x4d, 0x45, 0x44, 0x49, 0x55, 0x4d, 0x10, 0x02, 0x12, - 0x15, 0x0a, 0x11, 0x50, 0x52, 0x49, 0x4f, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x56, 0x45, 0x52, 0x59, - 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x03, 0x22, 0xd6, 0x01, 0x0a, 0x0b, 0x56, 0x69, 0x64, 0x65, 0x6f, - 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x0d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x5f, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, + 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x1f, + 0x66, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x64, + 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1c, 0x66, 0x61, 0x73, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x44, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x22, 0x76, 0x0a, 0x11, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, + 0x6e, 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x61, 0x6c, 0x6c, + 0x5f, 0x63, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x61, 0x6c, 0x6c, + 0x43, 0x69, 0x64, 0x12, 0x46, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, + 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x73, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x0b, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x22, 0x74, 0x0a, 0x0f, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x19, + 0x0a, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x63, 0x61, 0x6c, 0x6c, 0x43, 0x69, 0x64, 0x12, 0x46, 0x0a, 0x0b, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, + 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, + 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, + 0x70, 0x61, 0x6e, 0x74, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, + 0x74, 0x22, 0x77, 0x0a, 0x12, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x61, 0x6c, 0x6c, 0x5f, + 0x63, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x61, 0x6c, 0x6c, 0x43, + 0x69, 0x64, 0x12, 0x46, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x73, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x0b, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x22, 0x44, 0x0a, 0x0f, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x12, 0x1f, 0x0a, + 0x0b, 0x69, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0a, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, + 0x0a, 0x03, 0x73, 0x64, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x64, 0x70, + 0x22, 0x23, 0x0a, 0x0f, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x72, 0x41, 0x6e, 0x73, + 0x77, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x64, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x73, 0x64, 0x70, 0x22, 0x87, 0x01, 0x0a, 0x18, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x64, 0x12, 0x6b, 0x0a, 0x1a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, + 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, + 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x18, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x22, + 0xaa, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, + 0x61, 0x6c, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x59, 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, - 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x4d, 0x65, 0x64, 0x69, - 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0c, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x05, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x18, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x22, 0x50, 0x0a, 0x16, + 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x7b, + 0x0a, 0x0a, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x17, 0x0a, 0x07, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, + 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x73, + 0x5f, 0x73, 0x70, 0x65, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0a, 0x69, 0x73, 0x53, 0x70, 0x65, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x22, 0x5a, 0x0a, 0x11, 0x41, + 0x75, 0x64, 0x69, 0x6f, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, + 0x12, 0x45, 0x0a, 0x0c, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, + 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, + 0x41, 0x75, 0x64, 0x69, 0x6f, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x0b, 0x61, 0x75, 0x64, 0x69, + 0x6f, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x22, 0x43, 0x0a, 0x0b, 0x41, 0x75, 0x64, 0x69, 0x6f, + 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x05, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, - 0x43, 0x6f, 0x64, 0x65, 0x63, 0x52, 0x05, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x12, 0x41, 0x0a, 0x06, - 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x4c, 0x61, 0x79, 0x65, 0x72, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x22, - 0xaa, 0x01, 0x0a, 0x14, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, - 0x68, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x48, 0x0a, 0x0d, 0x61, 0x75, 0x64, 0x69, - 0x6f, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, - 0x66, 0x75, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x53, 0x65, - 0x6e, 0x64, 0x65, 0x72, 0x52, 0x0c, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x53, 0x65, 0x6e, 0x64, 0x65, - 0x72, 0x73, 0x12, 0x48, 0x0a, 0x0d, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x5f, 0x73, 0x65, 0x6e, 0x64, - 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x2e, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x0c, - 0x76, 0x69, 0x64, 0x65, 0x6f, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x22, 0x79, 0x0a, 0x11, - 0x43, 0x61, 0x6c, 0x6c, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x4a, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x72, 0x61, - 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x73, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x0d, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x18, 0x0a, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x47, 0x0a, 0x06, 0x47, 0x6f, 0x41, 0x77, 0x61, - 0x79, 0x12, 0x3d, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x25, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, - 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x47, 0x6f, 0x41, 0x77, - 0x61, 0x79, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, - 0x22, 0x4d, 0x0a, 0x09, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x40, 0x0a, - 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, + 0x43, 0x6f, 0x64, 0x65, 0x63, 0x52, 0x05, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x22, 0x9f, 0x02, 0x0a, + 0x11, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1f, + 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x69, 0x74, 0x72, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x42, 0x69, 0x74, 0x72, 0x61, 0x74, 0x65, 0x12, + 0x37, 0x0a, 0x18, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x62, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x15, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x79, 0x12, 0x34, 0x0a, 0x05, 0x63, 0x6f, 0x64, 0x65, + 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x73, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x52, 0x05, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x12, 0x23, + 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x74, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, + 0x63, 0x61, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x86, + 0x01, 0x0a, 0x0b, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x34, + 0x0a, 0x05, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, - 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x6e, 0x64, 0x65, - 0x64, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x42, - 0x64, 0x42, 0x0b, 0x53, 0x66, 0x75, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x56, 0x31, 0x50, 0x01, - 0x5a, 0x36, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x65, 0x74, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2f, 0x73, - 0x66, 0x75, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0xaa, 0x02, 0x1a, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x2e, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x66, 0x75, 0x2e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x52, 0x05, 0x63, + 0x6f, 0x64, 0x65, 0x63, 0x12, 0x41, 0x0a, 0x06, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, + 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x69, + 0x64, 0x65, 0x6f, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x06, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x22, 0xaa, 0x01, 0x0a, 0x14, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, + 0x12, 0x48, 0x0a, 0x0d, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x2e, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x0c, 0x61, 0x75, + 0x64, 0x69, 0x6f, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x12, 0x48, 0x0a, 0x0d, 0x76, 0x69, + 0x64, 0x65, 0x6f, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, + 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x69, 0x64, 0x65, 0x6f, + 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x0c, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x53, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x73, 0x22, 0x79, 0x0a, 0x11, 0x43, 0x61, 0x6c, 0x6c, 0x47, 0x72, 0x61, 0x6e, + 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x4a, 0x0a, 0x0e, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, + 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x43, 0x61, 0x6c, 0x6c, + 0x47, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x47, + 0x72, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, + 0x47, 0x0a, 0x06, 0x47, 0x6f, 0x41, 0x77, 0x61, 0x79, 0x12, 0x3d, 0x0a, 0x06, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x2e, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x73, 0x2e, 0x47, 0x6f, 0x41, 0x77, 0x61, 0x79, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x4d, 0x0a, 0x09, 0x43, 0x61, 0x6c, 0x6c, + 0x45, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, + 0x69, 0x64, 0x65, 0x6f, 0x2e, 0x73, 0x66, 0x75, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, + 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x6e, 0x64, 0x65, 0x64, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, + 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x42, 0x64, 0x42, 0x0b, 0x53, 0x66, 0x75, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x56, 0x31, 0x50, 0x01, 0x5a, 0x36, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x47, 0x65, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x2f, 0x73, 0x66, 0x75, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0xaa, 0x02, 0x1a, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x66, 0x75, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2724,36 +2802,35 @@ func file_video_sfu_event_events_proto_rawDescGZIP() []byte { return file_video_sfu_event_events_proto_rawDescData } -var file_video_sfu_event_events_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_video_sfu_event_events_proto_msgTypes = make([]protoimpl.MessageInfo, 32) +var file_video_sfu_event_events_proto_msgTypes = make([]protoimpl.MessageInfo, 33) var file_video_sfu_event_events_proto_goTypes = []interface{}{ - (VideoLayerSetting_Priority)(0), // 0: stream.video.sfu.event.VideoLayerSetting.Priority - (*SfuEvent)(nil), // 1: stream.video.sfu.event.SfuEvent + (*SfuEvent)(nil), // 0: stream.video.sfu.event.SfuEvent + (*ParticipantMigrationComplete)(nil), // 1: stream.video.sfu.event.ParticipantMigrationComplete (*PinsChanged)(nil), // 2: stream.video.sfu.event.PinsChanged (*Error)(nil), // 3: stream.video.sfu.event.Error (*ICETrickle)(nil), // 4: stream.video.sfu.event.ICETrickle (*ICERestart)(nil), // 5: stream.video.sfu.event.ICERestart (*SfuRequest)(nil), // 6: stream.video.sfu.event.SfuRequest - (*HealthCheckRequest)(nil), // 7: stream.video.sfu.event.HealthCheckRequest - (*HealthCheckResponse)(nil), // 8: stream.video.sfu.event.HealthCheckResponse - (*TrackPublished)(nil), // 9: stream.video.sfu.event.TrackPublished - (*TrackUnpublished)(nil), // 10: stream.video.sfu.event.TrackUnpublished - (*JoinRequest)(nil), // 11: stream.video.sfu.event.JoinRequest - (*Migration)(nil), // 12: stream.video.sfu.event.Migration - (*JoinResponse)(nil), // 13: stream.video.sfu.event.JoinResponse - (*ParticipantJoined)(nil), // 14: stream.video.sfu.event.ParticipantJoined - (*ParticipantLeft)(nil), // 15: stream.video.sfu.event.ParticipantLeft - (*ParticipantUpdated)(nil), // 16: stream.video.sfu.event.ParticipantUpdated - (*SubscriberOffer)(nil), // 17: stream.video.sfu.event.SubscriberOffer - (*PublisherAnswer)(nil), // 18: stream.video.sfu.event.PublisherAnswer - (*ConnectionQualityChanged)(nil), // 19: stream.video.sfu.event.ConnectionQualityChanged - (*ConnectionQualityInfo)(nil), // 20: stream.video.sfu.event.ConnectionQualityInfo - (*DominantSpeakerChanged)(nil), // 21: stream.video.sfu.event.DominantSpeakerChanged - (*AudioLevel)(nil), // 22: stream.video.sfu.event.AudioLevel - (*AudioLevelChanged)(nil), // 23: stream.video.sfu.event.AudioLevelChanged - (*AudioMediaRequest)(nil), // 24: stream.video.sfu.event.AudioMediaRequest - (*AudioSender)(nil), // 25: stream.video.sfu.event.AudioSender - (*VideoMediaRequest)(nil), // 26: stream.video.sfu.event.VideoMediaRequest + (*LeaveCallRequest)(nil), // 7: stream.video.sfu.event.LeaveCallRequest + (*HealthCheckRequest)(nil), // 8: stream.video.sfu.event.HealthCheckRequest + (*HealthCheckResponse)(nil), // 9: stream.video.sfu.event.HealthCheckResponse + (*TrackPublished)(nil), // 10: stream.video.sfu.event.TrackPublished + (*TrackUnpublished)(nil), // 11: stream.video.sfu.event.TrackUnpublished + (*JoinRequest)(nil), // 12: stream.video.sfu.event.JoinRequest + (*ReconnectDetails)(nil), // 13: stream.video.sfu.event.ReconnectDetails + (*Migration)(nil), // 14: stream.video.sfu.event.Migration + (*JoinResponse)(nil), // 15: stream.video.sfu.event.JoinResponse + (*ParticipantJoined)(nil), // 16: stream.video.sfu.event.ParticipantJoined + (*ParticipantLeft)(nil), // 17: stream.video.sfu.event.ParticipantLeft + (*ParticipantUpdated)(nil), // 18: stream.video.sfu.event.ParticipantUpdated + (*SubscriberOffer)(nil), // 19: stream.video.sfu.event.SubscriberOffer + (*PublisherAnswer)(nil), // 20: stream.video.sfu.event.PublisherAnswer + (*ConnectionQualityChanged)(nil), // 21: stream.video.sfu.event.ConnectionQualityChanged + (*ConnectionQualityInfo)(nil), // 22: stream.video.sfu.event.ConnectionQualityInfo + (*DominantSpeakerChanged)(nil), // 23: stream.video.sfu.event.DominantSpeakerChanged + (*AudioLevel)(nil), // 24: stream.video.sfu.event.AudioLevel + (*AudioLevelChanged)(nil), // 25: stream.video.sfu.event.AudioLevelChanged + (*AudioSender)(nil), // 26: stream.video.sfu.event.AudioSender (*VideoLayerSetting)(nil), // 27: stream.video.sfu.event.VideoLayerSetting (*VideoSender)(nil), // 28: stream.video.sfu.event.VideoSender (*ChangePublishQuality)(nil), // 29: stream.video.sfu.event.ChangePublishQuality @@ -2780,67 +2857,70 @@ var file_video_sfu_event_events_proto_goTypes = []interface{}{ (models.CallEndedReason)(0), // 50: stream.video.sfu.models.CallEndedReason } var file_video_sfu_event_events_proto_depIdxs = []int32{ - 17, // 0: stream.video.sfu.event.SfuEvent.subscriber_offer:type_name -> stream.video.sfu.event.SubscriberOffer - 18, // 1: stream.video.sfu.event.SfuEvent.publisher_answer:type_name -> stream.video.sfu.event.PublisherAnswer - 19, // 2: stream.video.sfu.event.SfuEvent.connection_quality_changed:type_name -> stream.video.sfu.event.ConnectionQualityChanged - 23, // 3: stream.video.sfu.event.SfuEvent.audio_level_changed:type_name -> stream.video.sfu.event.AudioLevelChanged + 19, // 0: stream.video.sfu.event.SfuEvent.subscriber_offer:type_name -> stream.video.sfu.event.SubscriberOffer + 20, // 1: stream.video.sfu.event.SfuEvent.publisher_answer:type_name -> stream.video.sfu.event.PublisherAnswer + 21, // 2: stream.video.sfu.event.SfuEvent.connection_quality_changed:type_name -> stream.video.sfu.event.ConnectionQualityChanged + 25, // 3: stream.video.sfu.event.SfuEvent.audio_level_changed:type_name -> stream.video.sfu.event.AudioLevelChanged 33, // 4: stream.video.sfu.event.SfuEvent.ice_trickle:type_name -> stream.video.sfu.models.ICETrickle 29, // 5: stream.video.sfu.event.SfuEvent.change_publish_quality:type_name -> stream.video.sfu.event.ChangePublishQuality - 14, // 6: stream.video.sfu.event.SfuEvent.participant_joined:type_name -> stream.video.sfu.event.ParticipantJoined - 15, // 7: stream.video.sfu.event.SfuEvent.participant_left:type_name -> stream.video.sfu.event.ParticipantLeft - 21, // 8: stream.video.sfu.event.SfuEvent.dominant_speaker_changed:type_name -> stream.video.sfu.event.DominantSpeakerChanged - 13, // 9: stream.video.sfu.event.SfuEvent.join_response:type_name -> stream.video.sfu.event.JoinResponse - 8, // 10: stream.video.sfu.event.SfuEvent.health_check_response:type_name -> stream.video.sfu.event.HealthCheckResponse - 9, // 11: stream.video.sfu.event.SfuEvent.track_published:type_name -> stream.video.sfu.event.TrackPublished - 10, // 12: stream.video.sfu.event.SfuEvent.track_unpublished:type_name -> stream.video.sfu.event.TrackUnpublished + 16, // 6: stream.video.sfu.event.SfuEvent.participant_joined:type_name -> stream.video.sfu.event.ParticipantJoined + 17, // 7: stream.video.sfu.event.SfuEvent.participant_left:type_name -> stream.video.sfu.event.ParticipantLeft + 23, // 8: stream.video.sfu.event.SfuEvent.dominant_speaker_changed:type_name -> stream.video.sfu.event.DominantSpeakerChanged + 15, // 9: stream.video.sfu.event.SfuEvent.join_response:type_name -> stream.video.sfu.event.JoinResponse + 9, // 10: stream.video.sfu.event.SfuEvent.health_check_response:type_name -> stream.video.sfu.event.HealthCheckResponse + 10, // 11: stream.video.sfu.event.SfuEvent.track_published:type_name -> stream.video.sfu.event.TrackPublished + 11, // 12: stream.video.sfu.event.SfuEvent.track_unpublished:type_name -> stream.video.sfu.event.TrackUnpublished 3, // 13: stream.video.sfu.event.SfuEvent.error:type_name -> stream.video.sfu.event.Error 30, // 14: stream.video.sfu.event.SfuEvent.call_grants_updated:type_name -> stream.video.sfu.event.CallGrantsUpdated 31, // 15: stream.video.sfu.event.SfuEvent.go_away:type_name -> stream.video.sfu.event.GoAway 5, // 16: stream.video.sfu.event.SfuEvent.ice_restart:type_name -> stream.video.sfu.event.ICERestart 2, // 17: stream.video.sfu.event.SfuEvent.pins_updated:type_name -> stream.video.sfu.event.PinsChanged 32, // 18: stream.video.sfu.event.SfuEvent.call_ended:type_name -> stream.video.sfu.event.CallEnded - 16, // 19: stream.video.sfu.event.SfuEvent.participant_updated:type_name -> stream.video.sfu.event.ParticipantUpdated - 34, // 20: stream.video.sfu.event.PinsChanged.pins:type_name -> stream.video.sfu.models.Pin - 35, // 21: stream.video.sfu.event.Error.error:type_name -> stream.video.sfu.models.Error - 36, // 22: stream.video.sfu.event.Error.reconnect_strategy:type_name -> stream.video.sfu.models.WebsocketReconnectStrategy - 37, // 23: stream.video.sfu.event.ICETrickle.peer_type:type_name -> stream.video.sfu.models.PeerType - 37, // 24: stream.video.sfu.event.ICERestart.peer_type:type_name -> stream.video.sfu.models.PeerType - 11, // 25: stream.video.sfu.event.SfuRequest.join_request:type_name -> stream.video.sfu.event.JoinRequest - 7, // 26: stream.video.sfu.event.SfuRequest.health_check_request:type_name -> stream.video.sfu.event.HealthCheckRequest - 38, // 27: stream.video.sfu.event.HealthCheckResponse.participant_count:type_name -> stream.video.sfu.models.ParticipantCount - 39, // 28: stream.video.sfu.event.TrackPublished.type:type_name -> stream.video.sfu.models.TrackType - 40, // 29: stream.video.sfu.event.TrackPublished.participant:type_name -> stream.video.sfu.models.Participant - 39, // 30: stream.video.sfu.event.TrackUnpublished.type:type_name -> stream.video.sfu.models.TrackType - 41, // 31: stream.video.sfu.event.TrackUnpublished.cause:type_name -> stream.video.sfu.models.TrackUnpublishReason - 40, // 32: stream.video.sfu.event.TrackUnpublished.participant:type_name -> stream.video.sfu.models.Participant - 42, // 33: stream.video.sfu.event.JoinRequest.client_details:type_name -> stream.video.sfu.models.ClientDetails - 12, // 34: stream.video.sfu.event.JoinRequest.migration:type_name -> stream.video.sfu.event.Migration - 43, // 35: stream.video.sfu.event.Migration.announced_tracks:type_name -> stream.video.sfu.models.TrackInfo - 44, // 36: stream.video.sfu.event.Migration.subscriptions:type_name -> stream.video.sfu.signal.TrackSubscriptionDetails - 45, // 37: stream.video.sfu.event.JoinResponse.call_state:type_name -> stream.video.sfu.models.CallState - 40, // 38: stream.video.sfu.event.ParticipantJoined.participant:type_name -> stream.video.sfu.models.Participant - 40, // 39: stream.video.sfu.event.ParticipantLeft.participant:type_name -> stream.video.sfu.models.Participant - 40, // 40: stream.video.sfu.event.ParticipantUpdated.participant:type_name -> stream.video.sfu.models.Participant - 20, // 41: stream.video.sfu.event.ConnectionQualityChanged.connection_quality_updates:type_name -> stream.video.sfu.event.ConnectionQualityInfo - 46, // 42: stream.video.sfu.event.ConnectionQualityInfo.connection_quality:type_name -> stream.video.sfu.models.ConnectionQuality - 22, // 43: stream.video.sfu.event.AudioLevelChanged.audio_levels:type_name -> stream.video.sfu.event.AudioLevel - 24, // 44: stream.video.sfu.event.AudioSender.media_request:type_name -> stream.video.sfu.event.AudioMediaRequest - 47, // 45: stream.video.sfu.event.AudioSender.codec:type_name -> stream.video.sfu.models.Codec - 0, // 46: stream.video.sfu.event.VideoLayerSetting.priority:type_name -> stream.video.sfu.event.VideoLayerSetting.Priority - 47, // 47: stream.video.sfu.event.VideoLayerSetting.codec:type_name -> stream.video.sfu.models.Codec - 26, // 48: stream.video.sfu.event.VideoSender.media_request:type_name -> stream.video.sfu.event.VideoMediaRequest - 47, // 49: stream.video.sfu.event.VideoSender.codec:type_name -> stream.video.sfu.models.Codec - 27, // 50: stream.video.sfu.event.VideoSender.layers:type_name -> stream.video.sfu.event.VideoLayerSetting - 25, // 51: stream.video.sfu.event.ChangePublishQuality.audio_senders:type_name -> stream.video.sfu.event.AudioSender - 28, // 52: stream.video.sfu.event.ChangePublishQuality.video_senders:type_name -> stream.video.sfu.event.VideoSender - 48, // 53: stream.video.sfu.event.CallGrantsUpdated.current_grants:type_name -> stream.video.sfu.models.CallGrants - 49, // 54: stream.video.sfu.event.GoAway.reason:type_name -> stream.video.sfu.models.GoAwayReason - 50, // 55: stream.video.sfu.event.CallEnded.reason:type_name -> stream.video.sfu.models.CallEndedReason - 56, // [56:56] is the sub-list for method output_type - 56, // [56:56] is the sub-list for method input_type - 56, // [56:56] is the sub-list for extension type_name - 56, // [56:56] is the sub-list for extension extendee - 0, // [0:56] is the sub-list for field type_name + 18, // 19: stream.video.sfu.event.SfuEvent.participant_updated:type_name -> stream.video.sfu.event.ParticipantUpdated + 1, // 20: stream.video.sfu.event.SfuEvent.participant_migration_complete:type_name -> stream.video.sfu.event.ParticipantMigrationComplete + 34, // 21: stream.video.sfu.event.PinsChanged.pins:type_name -> stream.video.sfu.models.Pin + 35, // 22: stream.video.sfu.event.Error.error:type_name -> stream.video.sfu.models.Error + 36, // 23: stream.video.sfu.event.Error.reconnect_strategy:type_name -> stream.video.sfu.models.WebsocketReconnectStrategy + 37, // 24: stream.video.sfu.event.ICETrickle.peer_type:type_name -> stream.video.sfu.models.PeerType + 37, // 25: stream.video.sfu.event.ICERestart.peer_type:type_name -> stream.video.sfu.models.PeerType + 12, // 26: stream.video.sfu.event.SfuRequest.join_request:type_name -> stream.video.sfu.event.JoinRequest + 8, // 27: stream.video.sfu.event.SfuRequest.health_check_request:type_name -> stream.video.sfu.event.HealthCheckRequest + 7, // 28: stream.video.sfu.event.SfuRequest.leave_call_request:type_name -> stream.video.sfu.event.LeaveCallRequest + 38, // 29: stream.video.sfu.event.HealthCheckResponse.participant_count:type_name -> stream.video.sfu.models.ParticipantCount + 39, // 30: stream.video.sfu.event.TrackPublished.type:type_name -> stream.video.sfu.models.TrackType + 40, // 31: stream.video.sfu.event.TrackPublished.participant:type_name -> stream.video.sfu.models.Participant + 39, // 32: stream.video.sfu.event.TrackUnpublished.type:type_name -> stream.video.sfu.models.TrackType + 41, // 33: stream.video.sfu.event.TrackUnpublished.cause:type_name -> stream.video.sfu.models.TrackUnpublishReason + 40, // 34: stream.video.sfu.event.TrackUnpublished.participant:type_name -> stream.video.sfu.models.Participant + 42, // 35: stream.video.sfu.event.JoinRequest.client_details:type_name -> stream.video.sfu.models.ClientDetails + 14, // 36: stream.video.sfu.event.JoinRequest.migration:type_name -> stream.video.sfu.event.Migration + 13, // 37: stream.video.sfu.event.JoinRequest.reconnect_details:type_name -> stream.video.sfu.event.ReconnectDetails + 36, // 38: stream.video.sfu.event.ReconnectDetails.strategy:type_name -> stream.video.sfu.models.WebsocketReconnectStrategy + 43, // 39: stream.video.sfu.event.ReconnectDetails.announced_tracks:type_name -> stream.video.sfu.models.TrackInfo + 44, // 40: stream.video.sfu.event.ReconnectDetails.subscriptions:type_name -> stream.video.sfu.signal.TrackSubscriptionDetails + 43, // 41: stream.video.sfu.event.Migration.announced_tracks:type_name -> stream.video.sfu.models.TrackInfo + 44, // 42: stream.video.sfu.event.Migration.subscriptions:type_name -> stream.video.sfu.signal.TrackSubscriptionDetails + 45, // 43: stream.video.sfu.event.JoinResponse.call_state:type_name -> stream.video.sfu.models.CallState + 40, // 44: stream.video.sfu.event.ParticipantJoined.participant:type_name -> stream.video.sfu.models.Participant + 40, // 45: stream.video.sfu.event.ParticipantLeft.participant:type_name -> stream.video.sfu.models.Participant + 40, // 46: stream.video.sfu.event.ParticipantUpdated.participant:type_name -> stream.video.sfu.models.Participant + 22, // 47: stream.video.sfu.event.ConnectionQualityChanged.connection_quality_updates:type_name -> stream.video.sfu.event.ConnectionQualityInfo + 46, // 48: stream.video.sfu.event.ConnectionQualityInfo.connection_quality:type_name -> stream.video.sfu.models.ConnectionQuality + 24, // 49: stream.video.sfu.event.AudioLevelChanged.audio_levels:type_name -> stream.video.sfu.event.AudioLevel + 47, // 50: stream.video.sfu.event.AudioSender.codec:type_name -> stream.video.sfu.models.Codec + 47, // 51: stream.video.sfu.event.VideoLayerSetting.codec:type_name -> stream.video.sfu.models.Codec + 47, // 52: stream.video.sfu.event.VideoSender.codec:type_name -> stream.video.sfu.models.Codec + 27, // 53: stream.video.sfu.event.VideoSender.layers:type_name -> stream.video.sfu.event.VideoLayerSetting + 26, // 54: stream.video.sfu.event.ChangePublishQuality.audio_senders:type_name -> stream.video.sfu.event.AudioSender + 28, // 55: stream.video.sfu.event.ChangePublishQuality.video_senders:type_name -> stream.video.sfu.event.VideoSender + 48, // 56: stream.video.sfu.event.CallGrantsUpdated.current_grants:type_name -> stream.video.sfu.models.CallGrants + 49, // 57: stream.video.sfu.event.GoAway.reason:type_name -> stream.video.sfu.models.GoAwayReason + 50, // 58: stream.video.sfu.event.CallEnded.reason:type_name -> stream.video.sfu.models.CallEndedReason + 59, // [59:59] is the sub-list for method output_type + 59, // [59:59] is the sub-list for method input_type + 59, // [59:59] is the sub-list for extension type_name + 59, // [59:59] is the sub-list for extension extendee + 0, // [0:59] is the sub-list for field type_name } func init() { file_video_sfu_event_events_proto_init() } @@ -2862,7 +2942,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PinsChanged); i { + switch v := v.(*ParticipantMigrationComplete); i { case 0: return &v.state case 1: @@ -2874,7 +2954,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Error); i { + switch v := v.(*PinsChanged); i { case 0: return &v.state case 1: @@ -2886,7 +2966,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ICETrickle); i { + switch v := v.(*Error); i { case 0: return &v.state case 1: @@ -2898,7 +2978,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ICERestart); i { + switch v := v.(*ICETrickle); i { case 0: return &v.state case 1: @@ -2910,7 +2990,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SfuRequest); i { + switch v := v.(*ICERestart); i { case 0: return &v.state case 1: @@ -2922,7 +3002,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HealthCheckRequest); i { + switch v := v.(*SfuRequest); i { case 0: return &v.state case 1: @@ -2934,7 +3014,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HealthCheckResponse); i { + switch v := v.(*LeaveCallRequest); i { case 0: return &v.state case 1: @@ -2946,7 +3026,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrackPublished); i { + switch v := v.(*HealthCheckRequest); i { case 0: return &v.state case 1: @@ -2958,7 +3038,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrackUnpublished); i { + switch v := v.(*HealthCheckResponse); i { case 0: return &v.state case 1: @@ -2970,7 +3050,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JoinRequest); i { + switch v := v.(*TrackPublished); i { case 0: return &v.state case 1: @@ -2982,7 +3062,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Migration); i { + switch v := v.(*TrackUnpublished); i { case 0: return &v.state case 1: @@ -2994,7 +3074,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JoinResponse); i { + switch v := v.(*JoinRequest); i { case 0: return &v.state case 1: @@ -3006,7 +3086,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ParticipantJoined); i { + switch v := v.(*ReconnectDetails); i { case 0: return &v.state case 1: @@ -3018,7 +3098,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ParticipantLeft); i { + switch v := v.(*Migration); i { case 0: return &v.state case 1: @@ -3030,7 +3110,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ParticipantUpdated); i { + switch v := v.(*JoinResponse); i { case 0: return &v.state case 1: @@ -3042,7 +3122,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscriberOffer); i { + switch v := v.(*ParticipantJoined); i { case 0: return &v.state case 1: @@ -3054,7 +3134,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PublisherAnswer); i { + switch v := v.(*ParticipantLeft); i { case 0: return &v.state case 1: @@ -3066,7 +3146,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConnectionQualityChanged); i { + switch v := v.(*ParticipantUpdated); i { case 0: return &v.state case 1: @@ -3078,7 +3158,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConnectionQualityInfo); i { + switch v := v.(*SubscriberOffer); i { case 0: return &v.state case 1: @@ -3090,7 +3170,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DominantSpeakerChanged); i { + switch v := v.(*PublisherAnswer); i { case 0: return &v.state case 1: @@ -3102,7 +3182,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AudioLevel); i { + switch v := v.(*ConnectionQualityChanged); i { case 0: return &v.state case 1: @@ -3114,7 +3194,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AudioLevelChanged); i { + switch v := v.(*ConnectionQualityInfo); i { case 0: return &v.state case 1: @@ -3126,7 +3206,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AudioMediaRequest); i { + switch v := v.(*DominantSpeakerChanged); i { case 0: return &v.state case 1: @@ -3138,7 +3218,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AudioSender); i { + switch v := v.(*AudioLevel); i { case 0: return &v.state case 1: @@ -3150,7 +3230,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VideoMediaRequest); i { + switch v := v.(*AudioLevelChanged); i { case 0: return &v.state case 1: @@ -3162,7 +3242,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VideoLayerSetting); i { + switch v := v.(*AudioSender); i { case 0: return &v.state case 1: @@ -3174,7 +3254,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VideoSender); i { + switch v := v.(*VideoLayerSetting); i { case 0: return &v.state case 1: @@ -3186,7 +3266,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChangePublishQuality); i { + switch v := v.(*VideoSender); i { case 0: return &v.state case 1: @@ -3198,7 +3278,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CallGrantsUpdated); i { + switch v := v.(*ChangePublishQuality); i { case 0: return &v.state case 1: @@ -3210,7 +3290,7 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GoAway); i { + switch v := v.(*CallGrantsUpdated); i { case 0: return &v.state case 1: @@ -3222,6 +3302,18 @@ func file_video_sfu_event_events_proto_init() { } } file_video_sfu_event_events_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GoAway); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_video_sfu_event_events_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CallEnded); i { case 0: return &v.state @@ -3255,24 +3347,25 @@ func file_video_sfu_event_events_proto_init() { (*SfuEvent_PinsUpdated)(nil), (*SfuEvent_CallEnded)(nil), (*SfuEvent_ParticipantUpdated)(nil), + (*SfuEvent_ParticipantMigrationComplete)(nil), } - file_video_sfu_event_events_proto_msgTypes[5].OneofWrappers = []interface{}{ + file_video_sfu_event_events_proto_msgTypes[6].OneofWrappers = []interface{}{ (*SfuRequest_JoinRequest)(nil), (*SfuRequest_HealthCheckRequest)(nil), + (*SfuRequest_LeaveCallRequest)(nil), } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_video_sfu_event_events_proto_rawDesc, - NumEnums: 1, - NumMessages: 32, + NumEnums: 0, + NumMessages: 33, NumExtensions: 0, NumServices: 0, }, GoTypes: file_video_sfu_event_events_proto_goTypes, DependencyIndexes: file_video_sfu_event_events_proto_depIdxs, - EnumInfos: file_video_sfu_event_events_proto_enumTypes, MessageInfos: file_video_sfu_event_events_proto_msgTypes, }.Build() File_video_sfu_event_events_proto = out.File diff --git a/stream-video-android-core/src/main/proto/video/sfu/event/events.proto b/stream-video-android-core/src/main/proto/video/sfu/event/events.proto index 8542b562f9a..eaaf8eb9880 100644 --- a/stream-video-android-core/src/main/proto/video/sfu/event/events.proto +++ b/stream-video-android-core/src/main/proto/video/sfu/event/events.proto @@ -75,9 +75,15 @@ message SfuEvent { CallEnded call_ended = 23; // ParticipantUpdated is sent when user data is updated ParticipantUpdated participant_updated = 24; + // ParticipantMigrationComplete is sent when the participant migration is complete + ParticipantMigrationComplete participant_migration_complete = 25; } } +message ParticipantMigrationComplete{ + +} + message PinsChanged { // the list of pins in the call. // Pins are ordered in descending order (most important first). @@ -104,9 +110,15 @@ message SfuRequest { oneof request_payload { JoinRequest join_request = 1; HealthCheckRequest health_check_request = 2; + LeaveCallRequest leave_call_request = 3; } } +message LeaveCallRequest { + string session_id = 1; + string reason = 2; +} + message HealthCheckRequest { } @@ -147,9 +159,8 @@ message JoinRequest { // dumb SDP that allow us to extract subscriber's decode codecs string subscriber_sdp = 3; models.ClientDetails client_details = 4; - // TODO: we should know if this is going to be - // - publishing and subscribing, or just subscribing for future routing - Migration migration = 5; + // Deprecated: use ReconnectDetails instead + Migration migration = 5 [deprecated = true]; // Fast reconnect flag explicitly indicates that if the participant session // and the associated state is still present in the SFU, the client is ready // to restore the PeerConnection with an ICE restart. If the SFU replies with @@ -159,7 +170,19 @@ message JoinRequest { // For the SFU, fast_reconnect:false indicates that even if it has the state // cached, the client state is not in sync and hence it must be cleaned up before // proceeding further. - bool fast_reconnect = 6; + bool fast_reconnect = 6 [deprecated = true]; + + ReconnectDetails reconnect_details = 7; +} + +message ReconnectDetails { + models.WebsocketReconnectStrategy strategy = 1; + repeated models.TrackInfo announced_tracks = 3; + repeated signal.TrackSubscriptionDetails subscriptions = 4; + uint32 reconnect_attempt = 5; + string from_sfu_id = 6; + // only set in case of rejoin + string previous_session_id = 7; } message Migration { @@ -171,6 +194,7 @@ message Migration { message JoinResponse { models.CallState call_state = 1; bool reconnected = 2; + int32 fast_reconnect_deadline_seconds = 3; } // ParticipantJoined is fired when a user joins a call @@ -232,22 +256,10 @@ message AudioLevelChanged { repeated AudioLevel audio_levels = 1; } -message AudioMediaRequest { - int32 channel_count = 1; -} - message AudioSender { - AudioMediaRequest media_request = 1; models.Codec codec = 2; } -message VideoMediaRequest { - int32 ideal_height = 1; - int32 ideal_width = 2; - int32 ideal_frame_rate = 3; -} - - // VideoLayerSetting is used to specify various parameters of a particular encoding in simulcast. // The parameters are specified here - https://developer.mozilla.org/en-US/docs/Web/API/RTCRtpEncodingParameters // SDKs use these parameters sent from the server to dynamically adjust these parameters to save CPU, bandwidth @@ -256,19 +268,12 @@ message VideoLayerSetting { bool active = 2; int32 max_bitrate = 3; float scale_resolution_down_by = 4; - enum Priority { - PRIORITY_HIGH_UNSPECIFIED = 0; - PRIORITY_LOW = 1; - PRIORITY_MEDIUM = 2; - PRIORITY_VERY_LOW = 3; - } - Priority priority = 5; models.Codec codec = 6; uint32 max_framerate = 7; + string scalability_mode = 8; } message VideoSender { - VideoMediaRequest media_request = 1; models.Codec codec = 2; repeated VideoLayerSetting layers = 3; } diff --git a/stream-video-android-core/src/main/proto/video/sfu/event/events_vtproto.pb.go b/stream-video-android-core/src/main/proto/video/sfu/event/events_vtproto.pb.go index 387f0fd358e..433eab880ba 100644 --- a/stream-video-android-core/src/main/proto/video/sfu/event/events_vtproto.pb.go +++ b/stream-video-android-core/src/main/proto/video/sfu/event/events_vtproto.pb.go @@ -478,6 +478,60 @@ func (m *SfuEvent_ParticipantUpdated) MarshalToSizedBufferVT(dAtA []byte) (int, } return len(dAtA) - i, nil } +func (m *SfuEvent_ParticipantMigrationComplete) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *SfuEvent_ParticipantMigrationComplete) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + i := len(dAtA) + if m.ParticipantMigrationComplete != nil { + size, err := m.ParticipantMigrationComplete.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xca + } + return len(dAtA) - i, nil +} +func (m *ParticipantMigrationComplete) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ParticipantMigrationComplete) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ParticipantMigrationComplete) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + return len(dAtA) - i, nil +} + func (m *PinsChanged) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil @@ -761,6 +815,72 @@ func (m *SfuRequest_HealthCheckRequest) MarshalToSizedBufferVT(dAtA []byte) (int } return len(dAtA) - i, nil } +func (m *SfuRequest_LeaveCallRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *SfuRequest_LeaveCallRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + i := len(dAtA) + if m.LeaveCallRequest != nil { + size, err := m.LeaveCallRequest.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x1a + } + return len(dAtA) - i, nil +} +func (m *LeaveCallRequest) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LeaveCallRequest) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *LeaveCallRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.Reason) > 0 { + i -= len(m.Reason) + copy(dAtA[i:], m.Reason) + i = encodeVarint(dAtA, i, uint64(len(m.Reason))) + i-- + dAtA[i] = 0x12 + } + if len(m.SessionId) > 0 { + i -= len(m.SessionId) + copy(dAtA[i:], m.SessionId) + i = encodeVarint(dAtA, i, uint64(len(m.SessionId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *HealthCheckRequest) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil @@ -1032,6 +1152,16 @@ func (m *JoinRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.ReconnectDetails != nil { + size, err := m.ReconnectDetails.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarint(dAtA, i, uint64(size)) + i-- + dAtA[i] = 0x3a + } if m.FastReconnect { i-- if m.FastReconnect { @@ -1098,6 +1228,111 @@ func (m *JoinRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ReconnectDetails) MarshalVT() (dAtA []byte, err error) { + if m == nil { + return nil, nil + } + size := m.SizeVT() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBufferVT(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ReconnectDetails) MarshalToVT(dAtA []byte) (int, error) { + size := m.SizeVT() + return m.MarshalToSizedBufferVT(dAtA[:size]) +} + +func (m *ReconnectDetails) MarshalToSizedBufferVT(dAtA []byte) (int, error) { + if m == nil { + return 0, nil + } + i := len(dAtA) + _ = i + var l int + _ = l + if m.unknownFields != nil { + i -= len(m.unknownFields) + copy(dAtA[i:], m.unknownFields) + } + if len(m.PreviousSessionId) > 0 { + i -= len(m.PreviousSessionId) + copy(dAtA[i:], m.PreviousSessionId) + i = encodeVarint(dAtA, i, uint64(len(m.PreviousSessionId))) + i-- + dAtA[i] = 0x3a + } + if len(m.FromSfuId) > 0 { + i -= len(m.FromSfuId) + copy(dAtA[i:], m.FromSfuId) + i = encodeVarint(dAtA, i, uint64(len(m.FromSfuId))) + i-- + dAtA[i] = 0x32 + } + if m.ReconnectAttempt != 0 { + i = encodeVarint(dAtA, i, uint64(m.ReconnectAttempt)) + i-- + dAtA[i] = 0x28 + } + if len(m.Subscriptions) > 0 { + for iNdEx := len(m.Subscriptions) - 1; iNdEx >= 0; iNdEx-- { + if marshalto, ok := interface{}(m.Subscriptions[iNdEx]).(interface { + MarshalToSizedBufferVT([]byte) (int, error) + }); ok { + size, err := marshalto.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarint(dAtA, i, uint64(size)) + } else { + encoded, err := proto.Marshal(m.Subscriptions[iNdEx]) + if err != nil { + return 0, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = encodeVarint(dAtA, i, uint64(len(encoded))) + } + i-- + dAtA[i] = 0x22 + } + } + if len(m.AnnouncedTracks) > 0 { + for iNdEx := len(m.AnnouncedTracks) - 1; iNdEx >= 0; iNdEx-- { + if marshalto, ok := interface{}(m.AnnouncedTracks[iNdEx]).(interface { + MarshalToSizedBufferVT([]byte) (int, error) + }); ok { + size, err := marshalto.MarshalToSizedBufferVT(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarint(dAtA, i, uint64(size)) + } else { + encoded, err := proto.Marshal(m.AnnouncedTracks[iNdEx]) + if err != nil { + return 0, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = encodeVarint(dAtA, i, uint64(len(encoded))) + } + i-- + dAtA[i] = 0x1a + } + } + if m.Strategy != 0 { + i = encodeVarint(dAtA, i, uint64(m.Strategy)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *Migration) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil @@ -1216,6 +1451,11 @@ func (m *JoinResponse) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } + if m.FastReconnectDeadlineSeconds != 0 { + i = encodeVarint(dAtA, i, uint64(m.FastReconnectDeadlineSeconds)) + i-- + dAtA[i] = 0x18 + } if m.Reconnected { i-- if m.Reconnected { @@ -1779,44 +2019,6 @@ func (m *AudioLevelChanged) MarshalToSizedBufferVT(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *AudioMediaRequest) MarshalVT() (dAtA []byte, err error) { - if m == nil { - return nil, nil - } - size := m.SizeVT() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBufferVT(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *AudioMediaRequest) MarshalToVT(dAtA []byte) (int, error) { - size := m.SizeVT() - return m.MarshalToSizedBufferVT(dAtA[:size]) -} - -func (m *AudioMediaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { - if m == nil { - return 0, nil - } - i := len(dAtA) - _ = i - var l int - _ = l - if m.unknownFields != nil { - i -= len(m.unknownFields) - copy(dAtA[i:], m.unknownFields) - } - if m.ChannelCount != 0 { - i = encodeVarint(dAtA, i, uint64(m.ChannelCount)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - func (m *AudioSender) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil @@ -1869,20 +2071,10 @@ func (m *AudioSender) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i-- dAtA[i] = 0x12 } - if m.MediaRequest != nil { - size, err := m.MediaRequest.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } -func (m *VideoMediaRequest) MarshalVT() (dAtA []byte, err error) { +func (m *VideoLayerSetting) MarshalVT() (dAtA []byte, err error) { if m == nil { return nil, nil } @@ -1895,12 +2087,12 @@ func (m *VideoMediaRequest) MarshalVT() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *VideoMediaRequest) MarshalToVT(dAtA []byte) (int, error) { +func (m *VideoLayerSetting) MarshalToVT(dAtA []byte) (int, error) { size := m.SizeVT() return m.MarshalToSizedBufferVT(dAtA[:size]) } -func (m *VideoMediaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { +func (m *VideoLayerSetting) MarshalToSizedBufferVT(dAtA []byte) (int, error) { if m == nil { return 0, nil } @@ -1912,58 +2104,17 @@ func (m *VideoMediaRequest) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i -= len(m.unknownFields) copy(dAtA[i:], m.unknownFields) } - if m.IdealFrameRate != 0 { - i = encodeVarint(dAtA, i, uint64(m.IdealFrameRate)) - i-- - dAtA[i] = 0x18 - } - if m.IdealWidth != 0 { - i = encodeVarint(dAtA, i, uint64(m.IdealWidth)) + if len(m.ScalabilityMode) > 0 { + i -= len(m.ScalabilityMode) + copy(dAtA[i:], m.ScalabilityMode) + i = encodeVarint(dAtA, i, uint64(len(m.ScalabilityMode))) i-- - dAtA[i] = 0x10 + dAtA[i] = 0x42 } - if m.IdealHeight != 0 { - i = encodeVarint(dAtA, i, uint64(m.IdealHeight)) + if m.MaxFramerate != 0 { + i = encodeVarint(dAtA, i, uint64(m.MaxFramerate)) i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *VideoLayerSetting) MarshalVT() (dAtA []byte, err error) { - if m == nil { - return nil, nil - } - size := m.SizeVT() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBufferVT(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *VideoLayerSetting) MarshalToVT(dAtA []byte) (int, error) { - size := m.SizeVT() - return m.MarshalToSizedBufferVT(dAtA[:size]) -} - -func (m *VideoLayerSetting) MarshalToSizedBufferVT(dAtA []byte) (int, error) { - if m == nil { - return 0, nil - } - i := len(dAtA) - _ = i - var l int - _ = l - if m.unknownFields != nil { - i -= len(m.unknownFields) - copy(dAtA[i:], m.unknownFields) - } - if m.MaxFramerate != 0 { - i = encodeVarint(dAtA, i, uint64(m.MaxFramerate)) - i-- - dAtA[i] = 0x38 + dAtA[i] = 0x38 } if m.Codec != nil { if marshalto, ok := interface{}(m.Codec).(interface { @@ -1987,11 +2138,6 @@ func (m *VideoLayerSetting) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - if m.Priority != 0 { - i = encodeVarint(dAtA, i, uint64(m.Priority)) - i-- - dAtA[i] = 0x28 - } if m.ScaleResolutionDownBy != 0 { i -= 4 binary.LittleEndian.PutUint32(dAtA[i:], uint32(math.Float32bits(float32(m.ScaleResolutionDownBy)))) @@ -2087,16 +2233,6 @@ func (m *VideoSender) MarshalToSizedBufferVT(dAtA []byte) (int, error) { i-- dAtA[i] = 0x12 } - if m.MediaRequest != nil { - size, err := m.MediaRequest.MarshalToSizedBufferVT(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarint(dAtA, i, uint64(size)) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } @@ -2567,6 +2703,30 @@ func (m *SfuEvent_ParticipantUpdated) SizeVT() (n int) { } return n } +func (m *SfuEvent_ParticipantMigrationComplete) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ParticipantMigrationComplete != nil { + l = m.ParticipantMigrationComplete.SizeVT() + n += 2 + l + sov(uint64(l)) + } + return n +} +func (m *ParticipantMigrationComplete) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.unknownFields != nil { + n += len(m.unknownFields) + } + return n +} + func (m *PinsChanged) SizeVT() (n int) { if m == nil { return 0 @@ -2689,6 +2849,38 @@ func (m *SfuRequest_HealthCheckRequest) SizeVT() (n int) { } return n } +func (m *SfuRequest_LeaveCallRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.LeaveCallRequest != nil { + l = m.LeaveCallRequest.SizeVT() + n += 1 + l + sov(uint64(l)) + } + return n +} +func (m *LeaveCallRequest) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.SessionId) + if l > 0 { + n += 1 + l + sov(uint64(l)) + } + l = len(m.Reason) + if l > 0 { + n += 1 + l + sov(uint64(l)) + } + if m.unknownFields != nil { + n += len(m.unknownFields) + } + return n +} + func (m *HealthCheckRequest) SizeVT() (n int) { if m == nil { return 0 @@ -2827,6 +3019,60 @@ func (m *JoinRequest) SizeVT() (n int) { if m.FastReconnect { n += 2 } + if m.ReconnectDetails != nil { + l = m.ReconnectDetails.SizeVT() + n += 1 + l + sov(uint64(l)) + } + if m.unknownFields != nil { + n += len(m.unknownFields) + } + return n +} + +func (m *ReconnectDetails) SizeVT() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Strategy != 0 { + n += 1 + sov(uint64(m.Strategy)) + } + if len(m.AnnouncedTracks) > 0 { + for _, e := range m.AnnouncedTracks { + if size, ok := interface{}(e).(interface { + SizeVT() int + }); ok { + l = size.SizeVT() + } else { + l = proto.Size(e) + } + n += 1 + l + sov(uint64(l)) + } + } + if len(m.Subscriptions) > 0 { + for _, e := range m.Subscriptions { + if size, ok := interface{}(e).(interface { + SizeVT() int + }); ok { + l = size.SizeVT() + } else { + l = proto.Size(e) + } + n += 1 + l + sov(uint64(l)) + } + } + if m.ReconnectAttempt != 0 { + n += 1 + sov(uint64(m.ReconnectAttempt)) + } + l = len(m.FromSfuId) + if l > 0 { + n += 1 + l + sov(uint64(l)) + } + l = len(m.PreviousSessionId) + if l > 0 { + n += 1 + l + sov(uint64(l)) + } if m.unknownFields != nil { n += len(m.unknownFields) } @@ -2892,6 +3138,9 @@ func (m *JoinResponse) SizeVT() (n int) { if m.Reconnected { n += 2 } + if m.FastReconnectDeadlineSeconds != 0 { + n += 1 + sov(uint64(m.FastReconnectDeadlineSeconds)) + } if m.unknownFields != nil { n += len(m.unknownFields) } @@ -3116,31 +3365,12 @@ func (m *AudioLevelChanged) SizeVT() (n int) { return n } -func (m *AudioMediaRequest) SizeVT() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.ChannelCount != 0 { - n += 1 + sov(uint64(m.ChannelCount)) - } - if m.unknownFields != nil { - n += len(m.unknownFields) - } - return n -} - func (m *AudioSender) SizeVT() (n int) { if m == nil { return 0 } var l int _ = l - if m.MediaRequest != nil { - l = m.MediaRequest.SizeVT() - n += 1 + l + sov(uint64(l)) - } if m.Codec != nil { if size, ok := interface{}(m.Codec).(interface { SizeVT() int @@ -3157,27 +3387,6 @@ func (m *AudioSender) SizeVT() (n int) { return n } -func (m *VideoMediaRequest) SizeVT() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.IdealHeight != 0 { - n += 1 + sov(uint64(m.IdealHeight)) - } - if m.IdealWidth != 0 { - n += 1 + sov(uint64(m.IdealWidth)) - } - if m.IdealFrameRate != 0 { - n += 1 + sov(uint64(m.IdealFrameRate)) - } - if m.unknownFields != nil { - n += len(m.unknownFields) - } - return n -} - func (m *VideoLayerSetting) SizeVT() (n int) { if m == nil { return 0 @@ -3197,9 +3406,6 @@ func (m *VideoLayerSetting) SizeVT() (n int) { if m.ScaleResolutionDownBy != 0 { n += 5 } - if m.Priority != 0 { - n += 1 + sov(uint64(m.Priority)) - } if m.Codec != nil { if size, ok := interface{}(m.Codec).(interface { SizeVT() int @@ -3213,6 +3419,10 @@ func (m *VideoLayerSetting) SizeVT() (n int) { if m.MaxFramerate != 0 { n += 1 + sov(uint64(m.MaxFramerate)) } + l = len(m.ScalabilityMode) + if l > 0 { + n += 1 + l + sov(uint64(l)) + } if m.unknownFields != nil { n += len(m.unknownFields) } @@ -3225,10 +3435,6 @@ func (m *VideoSender) SizeVT() (n int) { } var l int _ = l - if m.MediaRequest != nil { - l = m.MediaRequest.SizeVT() - n += 1 + l + sov(uint64(l)) - } if m.Codec != nil { if size, ok := interface{}(m.Codec).(interface { SizeVT() int @@ -4202,60 +4408,9 @@ func (m *SfuEvent) UnmarshalVT(dAtA []byte) error { m.EventPayload = &SfuEvent_ParticipantUpdated{v} } iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PinsChanged) UnmarshalVT(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: PinsChanged: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PinsChanged: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 25: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pins", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ParticipantMigrationComplete", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -4282,17 +4437,16 @@ func (m *PinsChanged) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Pins = append(m.Pins, &models.Pin{}) - if unmarshal, ok := interface{}(m.Pins[len(m.Pins)-1]).(interface { - UnmarshalVT([]byte) error - }); ok { - if err := unmarshal.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + if oneof, ok := m.EventPayload.(*SfuEvent_ParticipantMigrationComplete); ok { + if err := oneof.ParticipantMigrationComplete.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } } else { - if err := proto.Unmarshal(dAtA[iNdEx:postIndex], m.Pins[len(m.Pins)-1]); err != nil { + v := &ParticipantMigrationComplete{} + if err := v.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } + m.EventPayload = &SfuEvent_ParticipantMigrationComplete{v} } iNdEx = postIndex default: @@ -4317,7 +4471,7 @@ func (m *PinsChanged) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *Error) UnmarshalVT(dAtA []byte) error { +func (m *ParticipantMigrationComplete) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4340,25 +4494,169 @@ func (m *Error) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Error: wiretype end group for non-group") + return fmt.Errorf("proto: ParticipantMigrationComplete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Error: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ParticipantMigrationComplete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + default: + iNdEx = preIndex + skippy, err := skip(dAtA[iNdEx:]) + if err != nil { + return err } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PinsChanged) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PinsChanged: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PinsChanged: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pins", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Pins = append(m.Pins, &models.Pin{}) + if unmarshal, ok := interface{}(m.Pins[len(m.Pins)-1]).(interface { + UnmarshalVT([]byte) error + }); ok { + if err := unmarshal.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + } else { + if err := proto.Unmarshal(dAtA[iNdEx:postIndex], m.Pins[len(m.Pins)-1]); err != nil { + return err + } + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Error) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Error: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Error: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] iNdEx++ msglen |= int(b&0x7F) << shift if b < 0x80 { @@ -4714,6 +5012,47 @@ func (m *SfuRequest) UnmarshalVT(dAtA []byte) error { m.RequestPayload = &SfuRequest_HealthCheckRequest{v} } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LeaveCallRequest", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if oneof, ok := m.RequestPayload.(*SfuRequest_LeaveCallRequest); ok { + if err := oneof.LeaveCallRequest.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + } else { + v := &LeaveCallRequest{} + if err := v.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.RequestPayload = &SfuRequest_LeaveCallRequest{v} + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skip(dAtA[iNdEx:]) @@ -4736,7 +5075,7 @@ func (m *SfuRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *HealthCheckRequest) UnmarshalVT(dAtA []byte) error { +func (m *LeaveCallRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4759,12 +5098,76 @@ func (m *HealthCheckRequest) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: HealthCheckRequest: wiretype end group for non-group") + return fmt.Errorf("proto: LeaveCallRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: HealthCheckRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: LeaveCallRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SessionId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SessionId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Reason = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skip(dAtA[iNdEx:]) @@ -4787,7 +5190,7 @@ func (m *HealthCheckRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *HealthCheckResponse) UnmarshalVT(dAtA []byte) error { +func (m *HealthCheckRequest) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4810,7 +5213,58 @@ func (m *HealthCheckResponse) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: HealthCheckResponse: wiretype end group for non-group") + return fmt.Errorf("proto: HealthCheckRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HealthCheckRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *HealthCheckResponse) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HealthCheckResponse: wiretype end group for non-group") } if fieldNum <= 0 { return fmt.Errorf("proto: HealthCheckResponse: illegal tag %d (wire type %d)", fieldNum, wire) @@ -5482,6 +5936,42 @@ func (m *JoinRequest) UnmarshalVT(dAtA []byte) error { } } m.FastReconnect = bool(v != 0) + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ReconnectDetails", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ReconnectDetails == nil { + m.ReconnectDetails = &ReconnectDetails{} + } + if err := m.ReconnectDetails.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skip(dAtA[iNdEx:]) @@ -5504,7 +5994,7 @@ func (m *JoinRequest) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *Migration) UnmarshalVT(dAtA []byte) error { +func (m *ReconnectDetails) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -5527,17 +6017,17 @@ func (m *Migration) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Migration: wiretype end group for non-group") + return fmt.Errorf("proto: ReconnectDetails: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Migration: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ReconnectDetails: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FromSfuId", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Strategy", wireType) } - var stringLen uint64 + m.Strategy = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflow @@ -5547,25 +6037,12 @@ func (m *Migration) UnmarshalVT(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + m.Strategy |= models.WebsocketReconnectStrategy(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FromSfuId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field AnnouncedTracks", wireType) } @@ -5607,7 +6084,7 @@ func (m *Migration) UnmarshalVT(dAtA []byte) error { } } iNdEx = postIndex - case 3: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Subscriptions", wireType) } @@ -5649,62 +6126,30 @@ func (m *Migration) UnmarshalVT(dAtA []byte) error { } } iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *JoinResponse) UnmarshalVT(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ReconnectAttempt", wireType) } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + m.ReconnectAttempt = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ReconnectAttempt |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: JoinResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: JoinResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CallState", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field FromSfuId", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflow @@ -5714,41 +6159,29 @@ func (m *JoinResponse) UnmarshalVT(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLength } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - if m.CallState == nil { - m.CallState = &models.CallState{} - } - if unmarshal, ok := interface{}(m.CallState).(interface { - UnmarshalVT([]byte) error - }); ok { - if err := unmarshal.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } - } else { - if err := proto.Unmarshal(dAtA[iNdEx:postIndex], m.CallState); err != nil { - return err - } - } + m.FromSfuId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Reconnected", wireType) + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PreviousSessionId", wireType) } - var v int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflow @@ -5758,12 +6191,24 @@ func (m *JoinResponse) UnmarshalVT(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - m.Reconnected = bool(v != 0) + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PreviousSessionId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skip(dAtA[iNdEx:]) @@ -5786,7 +6231,7 @@ func (m *JoinResponse) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ParticipantJoined) UnmarshalVT(dAtA []byte) error { +func (m *Migration) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -5809,15 +6254,15 @@ func (m *ParticipantJoined) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ParticipantJoined: wiretype end group for non-group") + return fmt.Errorf("proto: Migration: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ParticipantJoined: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Migration: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CallCid", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field FromSfuId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -5845,11 +6290,11 @@ func (m *ParticipantJoined) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.CallCid = string(dAtA[iNdEx:postIndex]) + m.FromSfuId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Participant", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AnnouncedTracks", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -5876,32 +6321,72 @@ func (m *ParticipantJoined) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Participant == nil { - m.Participant = &models.Participant{} - } - if unmarshal, ok := interface{}(m.Participant).(interface { + m.AnnouncedTracks = append(m.AnnouncedTracks, &models.TrackInfo{}) + if unmarshal, ok := interface{}(m.AnnouncedTracks[len(m.AnnouncedTracks)-1]).(interface { UnmarshalVT([]byte) error }); ok { if err := unmarshal.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { return err } } else { - if err := proto.Unmarshal(dAtA[iNdEx:postIndex], m.Participant); err != nil { + if err := proto.Unmarshal(dAtA[iNdEx:postIndex], m.AnnouncedTracks[len(m.AnnouncedTracks)-1]); err != nil { return err } } iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Subscriptions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Subscriptions = append(m.Subscriptions, &signal_rpc.TrackSubscriptionDetails{}) + if unmarshal, ok := interface{}(m.Subscriptions[len(m.Subscriptions)-1]).(interface { + UnmarshalVT([]byte) error + }); ok { + if err := unmarshal.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + } else { + if err := proto.Unmarshal(dAtA[iNdEx:postIndex], m.Subscriptions[len(m.Subscriptions)-1]); err != nil { + return err + } + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF } m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) iNdEx += skippy @@ -5913,7 +6398,7 @@ func (m *ParticipantJoined) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ParticipantLeft) UnmarshalVT(dAtA []byte) error { +func (m *JoinResponse) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -5936,17 +6421,17 @@ func (m *ParticipantLeft) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ParticipantLeft: wiretype end group for non-group") + return fmt.Errorf("proto: JoinResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ParticipantLeft: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: JoinResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CallCid", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CallState", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflow @@ -5956,29 +6441,41 @@ func (m *ParticipantLeft) UnmarshalVT(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLength } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.CallCid = string(dAtA[iNdEx:postIndex]) + if m.CallState == nil { + m.CallState = &models.CallState{} + } + if unmarshal, ok := interface{}(m.CallState).(interface { + UnmarshalVT([]byte) error + }); ok { + if err := unmarshal.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + } else { + if err := proto.Unmarshal(dAtA[iNdEx:postIndex], m.CallState); err != nil { + return err + } + } iNdEx = postIndex case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Participant", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Reconnected", wireType) } - var msglen int + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflow @@ -5988,36 +6485,31 @@ func (m *ParticipantLeft) UnmarshalVT(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Participant == nil { - m.Participant = &models.Participant{} + m.Reconnected = bool(v != 0) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field FastReconnectDeadlineSeconds", wireType) } - if unmarshal, ok := interface{}(m.Participant).(interface { - UnmarshalVT([]byte) error - }); ok { - if err := unmarshal.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err + m.FastReconnectDeadlineSeconds = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow } - } else { - if err := proto.Unmarshal(dAtA[iNdEx:postIndex], m.Participant); err != nil { - return err + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.FastReconnectDeadlineSeconds |= int32(b&0x7F) << shift + if b < 0x80 { + break } } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skip(dAtA[iNdEx:]) @@ -6040,7 +6532,7 @@ func (m *ParticipantLeft) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ParticipantUpdated) UnmarshalVT(dAtA []byte) error { +func (m *ParticipantJoined) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -6063,10 +6555,10 @@ func (m *ParticipantUpdated) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ParticipantUpdated: wiretype end group for non-group") + return fmt.Errorf("proto: ParticipantJoined: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ParticipantUpdated: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ParticipantJoined: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -6167,7 +6659,7 @@ func (m *ParticipantUpdated) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *SubscriberOffer) UnmarshalVT(dAtA []byte) error { +func (m *ParticipantLeft) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -6190,17 +6682,17 @@ func (m *SubscriberOffer) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SubscriberOffer: wiretype end group for non-group") + return fmt.Errorf("proto: ParticipantLeft: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SubscriberOffer: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ParticipantLeft: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IceRestart", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CallCid", wireType) } - var v int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflow @@ -6210,17 +6702,29 @@ func (m *SubscriberOffer) UnmarshalVT(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - m.IceRestart = bool(v != 0) + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CallCid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sdp", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Participant", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflow @@ -6230,23 +6734,35 @@ func (m *SubscriberOffer) UnmarshalVT(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLength } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLength } if postIndex > l { return io.ErrUnexpectedEOF } - m.Sdp = string(dAtA[iNdEx:postIndex]) + if m.Participant == nil { + m.Participant = &models.Participant{} + } + if unmarshal, ok := interface{}(m.Participant).(interface { + UnmarshalVT([]byte) error + }); ok { + if err := unmarshal.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + } else { + if err := proto.Unmarshal(dAtA[iNdEx:postIndex], m.Participant); err != nil { + return err + } + } iNdEx = postIndex default: iNdEx = preIndex @@ -6270,7 +6786,7 @@ func (m *SubscriberOffer) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *PublisherAnswer) UnmarshalVT(dAtA []byte) error { +func (m *ParticipantUpdated) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -6293,15 +6809,15 @@ func (m *PublisherAnswer) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PublisherAnswer: wiretype end group for non-group") + return fmt.Errorf("proto: ParticipantUpdated: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PublisherAnswer: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ParticipantUpdated: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sdp", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CallCid", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -6329,7 +6845,51 @@ func (m *PublisherAnswer) UnmarshalVT(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Sdp = string(dAtA[iNdEx:postIndex]) + m.CallCid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Participant", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Participant == nil { + m.Participant = &models.Participant{} + } + if unmarshal, ok := interface{}(m.Participant).(interface { + UnmarshalVT([]byte) error + }); ok { + if err := unmarshal.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { + return err + } + } else { + if err := proto.Unmarshal(dAtA[iNdEx:postIndex], m.Participant); err != nil { + return err + } + } iNdEx = postIndex default: iNdEx = preIndex @@ -6353,7 +6913,7 @@ func (m *PublisherAnswer) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *ConnectionQualityChanged) UnmarshalVT(dAtA []byte) error { +func (m *SubscriberOffer) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -6376,17 +6936,17 @@ func (m *ConnectionQualityChanged) UnmarshalVT(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ConnectionQualityChanged: wiretype end group for non-group") + return fmt.Errorf("proto: SubscriberOffer: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ConnectionQualityChanged: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SubscriberOffer: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionQualityUpdates", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IceRestart", wireType) } - var msglen int + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflow @@ -6396,15 +6956,201 @@ func (m *ConnectionQualityChanged) UnmarshalVT(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + msglen + m.IceRestart = bool(v != 0) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sdp", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sdp = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PublisherAnswer) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PublisherAnswer: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PublisherAnswer: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sdp", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sdp = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skip(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLength + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ConnectionQualityChanged) UnmarshalVT(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ConnectionQualityChanged: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ConnectionQualityChanged: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionQualityUpdates", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLength } @@ -6918,76 +7664,6 @@ func (m *AudioLevelChanged) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *AudioMediaRequest) UnmarshalVT(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: AudioMediaRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AudioMediaRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ChannelCount", wireType) - } - m.ChannelCount = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ChannelCount |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *AudioSender) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -7017,42 +7693,6 @@ func (m *AudioSender) UnmarshalVT(dAtA []byte) error { return fmt.Errorf("proto: AudioSender: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MediaRequest", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.MediaRequest == nil { - m.MediaRequest = &AudioMediaRequest{} - } - if err := m.MediaRequest.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Codec", wireType) @@ -7119,114 +7759,6 @@ func (m *AudioSender) UnmarshalVT(dAtA []byte) error { } return nil } -func (m *VideoMediaRequest) UnmarshalVT(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: VideoMediaRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: VideoMediaRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IdealHeight", wireType) - } - m.IdealHeight = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.IdealHeight |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IdealWidth", wireType) - } - m.IdealWidth = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.IdealWidth |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IdealFrameRate", wireType) - } - m.IdealFrameRate = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.IdealFrameRate |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skip(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLength - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *VideoLayerSetting) UnmarshalVT(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -7338,25 +7870,6 @@ func (m *VideoLayerSetting) UnmarshalVT(dAtA []byte) error { v = uint32(binary.LittleEndian.Uint32(dAtA[iNdEx:])) iNdEx += 4 m.ScaleResolutionDownBy = float32(math.Float32frombits(v)) - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Priority", wireType) - } - m.Priority = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Priority |= VideoLayerSetting_Priority(b&0x7F) << shift - if b < 0x80 { - break - } - } case 6: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Codec", wireType) @@ -7420,6 +7933,38 @@ func (m *VideoLayerSetting) UnmarshalVT(dAtA []byte) error { break } } + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ScalabilityMode", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflow + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLength + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ScalabilityMode = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skip(dAtA[iNdEx:]) @@ -7471,42 +8016,6 @@ func (m *VideoSender) UnmarshalVT(dAtA []byte) error { return fmt.Errorf("proto: VideoSender: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MediaRequest", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflow - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLength - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLength - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.MediaRequest == nil { - m.MediaRequest = &VideoMediaRequest{} - } - if err := m.MediaRequest.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Codec", wireType)