Skip to content

Commit b8db6c1

Browse files
committed
add adaptive streaming;
1 parent b41861c commit b8db6c1

File tree

6 files changed

+129
-1
lines changed

6 files changed

+129
-1
lines changed

livekit-ffi/generate_proto.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ protoc \
2424
$PROTOCOL/handle.proto \
2525
$PROTOCOL/room.proto \
2626
$PROTOCOL/track.proto \
27+
$PROTOCOL/track_publication.proto \
2728
$PROTOCOL/participant.proto \
2829
$PROTOCOL/video_frame.proto \
2930
$PROTOCOL/audio_frame.proto \

livekit-ffi/protocol/ffi.proto

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ option csharp_namespace = "LiveKit.Proto";
2020
// import "handle.proto";
2121
import "e2ee.proto";
2222
import "track.proto";
23+
import "track_publication.proto";
2324
import "room.proto";
2425
import "video_frame.proto";
2526
import "audio_frame.proto";
@@ -106,6 +107,10 @@ message FfiRequest {
106107
RegisterRpcMethodRequest register_rpc_method = 39;
107108
UnregisterRpcMethodRequest unregister_rpc_method = 40;
108109
RpcMethodInvocationResponseRequest rpc_method_invocation_response = 41;
110+
111+
// Track Publication
112+
EnableRemoteTrackPublicationRequest enable_remote_track_publication = 42;
113+
UpdateRemoteTrackPublicationDimensionRequest update_remote_track_publication_dimension = 43;
109114
}
110115
}
111116

@@ -160,6 +165,9 @@ message FfiResponse {
160165
RegisterRpcMethodResponse register_rpc_method = 38;
161166
UnregisterRpcMethodResponse unregister_rpc_method = 39;
162167
RpcMethodInvocationResponseResponse rpc_method_invocation_response = 40;
168+
// Track Publication
169+
EnableRemoteTrackPublicationResponse enable_remote_track_publication = 41;
170+
UpdateRemoteTrackPublicationDimensionResponse update_remote_track_publication_dimension = 42;
163171
}
164172
}
165173

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// Copyright 2023 LiveKit, Inc.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
syntax = "proto2";
16+
17+
package livekit.proto;
18+
option csharp_namespace = "LiveKit.Proto";
19+
20+
// Enable/Disable a remote track publication
21+
message EnableRemoteTrackPublicationRequest {
22+
required uint64 track_publication_handle = 1;
23+
required bool enabled = 2;
24+
}
25+
26+
message EnableRemoteTrackPublicationResponse {}
27+
28+
// update a remote track publication dimension
29+
message UpdateRemoteTrackPublicationDimensionRequest {
30+
required uint64 track_publication_handle = 1;
31+
required uint32 width = 2;
32+
required uint32 height = 3;
33+
}
34+
35+
message UpdateRemoteTrackPublicationDimensionResponse {}
36+
37+
38+

livekit-ffi/src/server/requests.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,36 @@ fn on_set_subscribed(
152152
Ok(proto::SetSubscribedResponse {})
153153
}
154154

155+
fn on_enable_remote_track_publication(
156+
server: &'static FfiServer,
157+
request: proto::EnableRemoteTrackPublicationRequest,
158+
) -> FfiResult<proto::EnableRemoteTrackPublicationResponse> {
159+
let ffi_publication =
160+
server.retrieve_handle::<FfiPublication>(request.track_publication_handle)?;
161+
162+
let TrackPublication::Remote(publication) = &ffi_publication.publication else {
163+
return Err(FfiError::InvalidRequest("publication is not a RemotePublication".into()));
164+
};
165+
166+
publication.set_enabled(request.enabled);
167+
Ok(proto::EnableRemoteTrackPublicationResponse {})
168+
}
169+
170+
fn on_update_remote_track_publication_dimension(
171+
server: &'static FfiServer,
172+
request: proto::UpdateRemoteTrackPublicationDimensionRequest,
173+
) -> FfiResult<proto::UpdateRemoteTrackPublicationDimensionResponse> {
174+
let ffi_publication =
175+
server.retrieve_handle::<FfiPublication>(request.track_publication_handle)?;
176+
177+
let TrackPublication::Remote(publication) = &ffi_publication.publication else {
178+
return Err(FfiError::InvalidRequest("publication is not a RemotePublication".into()));
179+
};
180+
let dimension = TrackDimension(request.width, request.height);
181+
publication.update_video_dimensions(dimension);
182+
Ok(proto::UpdateRemoteTrackPublicationDimensionResponse {})
183+
}
184+
155185
fn on_set_local_metadata(
156186
server: &'static FfiServer,
157187
set_local_metadata: proto::SetLocalMetadataRequest,
@@ -995,6 +1025,12 @@ pub fn handle_request(
9951025
on_rpc_method_invocation_response(server, request)?,
9961026
)
9971027
}
1028+
proto::ffi_request::Message::EnableRemoteTrackPublication(request) => {
1029+
proto::ffi_response::Message::EnableRemoteTrackPublication(on_enable_remote_track_publication(server, request)?)
1030+
}
1031+
proto::ffi_request::Message::UpdateRemoteTrackPublicationDimension(request) => {
1032+
proto::ffi_response::Message::UpdateRemoteTrackPublicationDimension(on_update_remote_track_publication_dimension(server, request)?)
1033+
}
9981034
});
9991035

10001036
Ok(res)

livekit/src/room/participant/remote_participant.rs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,32 @@ impl RemoteParticipant {
384384
.await
385385
});
386386
}
387-
})
387+
});
388+
389+
publication.on_video_dimensions_changed({
390+
let rtc_engine = self.inner.rtc_engine.clone();
391+
move |publication, dimension| {
392+
let rtc_engine = rtc_engine.clone();
393+
livekit_runtime::spawn(async move {
394+
let tsid: String = publication.sid().into();
395+
let TrackDimension(width, height) = dimension;
396+
let enabled = publication.is_enabled();
397+
let update_track_settings = proto::UpdateTrackSettings {
398+
track_sids: vec![tsid.clone()],
399+
disabled: !enabled,
400+
width,
401+
height,
402+
..Default::default()
403+
};
404+
405+
rtc_engine
406+
.send_request(proto::signal_request::Message::TrackSetting(
407+
update_track_settings,
408+
))
409+
.await
410+
});
411+
}
412+
});
388413
}
389414

390415
pub(crate) fn remove_publication(&self, sid: &TrackSid) -> Option<TrackPublication> {

livekit/src/room/publication/remote.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ type PermissionStatusChangedHandler =
2828
Box<dyn Fn(RemoteTrackPublication, PermissionStatus, PermissionStatus) + Send>; // old_status, new_status
2929
type SubscriptionUpdateNeededHandler = Box<dyn Fn(RemoteTrackPublication, bool) + Send>;
3030
type EnabledStatusChangedHandler = Box<dyn Fn(RemoteTrackPublication, bool) + Send>;
31+
type VideoDimensionsChangedHandler = Box<dyn Fn(RemoteTrackPublication, TrackDimension) + Send>;
3132

3233
#[derive(Default)]
3334
struct RemoteEvents {
@@ -37,6 +38,7 @@ struct RemoteEvents {
3738
permission_status_changed: Mutex<Option<PermissionStatusChangedHandler>>,
3839
subscription_update_needed: Mutex<Option<SubscriptionUpdateNeededHandler>>,
3940
enabled_status_changed: Mutex<Option<EnabledStatusChangedHandler>>,
41+
video_dimensions_changed: Mutex<Option<VideoDimensionsChangedHandler>>,
4042
}
4143

4244
#[derive(Debug)]
@@ -215,6 +217,13 @@ impl RemoteTrackPublication {
215217
*self.remote.events.enabled_status_changed.lock() = Some(Box::new(f));
216218
}
217219

220+
pub(crate) fn on_video_dimensions_changed(
221+
&self,
222+
f: impl Fn(RemoteTrackPublication, TrackDimension) + Send + 'static,
223+
) {
224+
*self.remote.events.video_dimensions_changed.lock() = Some(Box::new(f));
225+
}
226+
218227
pub fn set_subscribed(&self, subscribed: bool) {
219228
let old_subscription_state = self.subscription_status();
220229
let old_permission_state = self.permission_status();
@@ -262,6 +271,17 @@ impl RemoteTrackPublication {
262271
}
263272
}
264273

274+
pub fn update_video_dimensions(&self, dimension: TrackDimension) {
275+
if self.is_subscribed() && dimension != self.dimension() {
276+
// Request to send an update to the SFU
277+
if let Some(video_dimensions_changed) =
278+
self.remote.events.video_dimensions_changed.lock().as_ref()
279+
{
280+
video_dimensions_changed(self.clone(), dimension)
281+
}
282+
}
283+
}
284+
265285
pub fn subscription_status(&self) -> SubscriptionStatus {
266286
if !self.remote.info.read().subscribed {
267287
return SubscriptionStatus::Unsubscribed;

0 commit comments

Comments
 (0)