Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .changeset/update-degradation-preference-enum.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
livekit: minor
livekit-ffi: minor
libwebrtc: minor
webrtc-sys: minor
---

Add `MaintainFramerateAndResolution` to `DegradationPreference` enum to align with WebRTC M144.

- `MAINTAIN_FRAMERATE_AND_RESOLUTION` is now the recommended value (replaces deprecated `DISABLED`)
- `DISABLED` is deprecated but still supported for backwards compatibility
- Both values map to the same behavior: maintain framerate and resolution, dropping frames if needed
16 changes: 12 additions & 4 deletions libwebrtc/src/rtp_parameters.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,23 @@ pub enum Priority {
/// Controls how the encoder degrades quality when bandwidth is constrained.
#[derive(Debug, Copy, Clone, PartialEq, Eq, Default)]
pub enum DegradationPreference {
/// Maintain both framerate and resolution. Frames may be dropped before encoding
/// if necessary to avoid overusing network and encoder resources.
MaintainFramerateAndResolution,
/// Degrade framerate to maintain resolution.
MaintainFramerate,
/// Degrade resolution to maintain framerate.
MaintainResolution,
/// Balance between framerate and resolution degradation.
#[default]
Balanced,
/// Disable degradation preference (not recommended).
Disabled,
}

impl DegradationPreference {
/// Deprecated: Use `MaintainFramerateAndResolution` instead.
#[deprecated(since = "0.8.0", note = "Use MaintainFramerateAndResolution instead")]
#[allow(non_upper_case_globals)]
pub const Disabled: Self = Self::MaintainFramerateAndResolution;
}

#[derive(Debug, Clone)]
Expand Down Expand Up @@ -65,7 +73,7 @@ impl RtpParameters {
pub fn set_degradation_preference(&mut self, preference: DegradationPreference) {
self.has_degradation_preference = true;
self.degradation_preference = match preference {
DegradationPreference::Disabled => 0,
DegradationPreference::MaintainFramerateAndResolution => 0,
DegradationPreference::MaintainFramerate => 1,
DegradationPreference::MaintainResolution => 2,
DegradationPreference::Balanced => 3,
Expand All @@ -78,7 +86,7 @@ impl RtpParameters {
return None;
}
Some(match self.degradation_preference {
0 => DegradationPreference::Disabled,
0 => DegradationPreference::MaintainFramerateAndResolution,
1 => DegradationPreference::MaintainFramerate,
2 => DegradationPreference::MaintainResolution,
3 => DegradationPreference::Balanced,
Expand Down
11 changes: 10 additions & 1 deletion livekit-ffi-node-bindings/proto/room_pb.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -155,11 +155,20 @@ export declare enum DegradationPreference {
MAINTAIN_RESOLUTION = 2,

/**
* Disable degradation preference.
* Deprecated: Use MAINTAIN_FRAMERATE_AND_RESOLUTION instead.
* Maintained for backwards compatibility, maps to MAINTAIN_FRAMERATE_AND_RESOLUTION.
*
* @generated from enum value: DEGRADATION_PREFERENCE_DISABLED = 3;
*/
DISABLED = 3,

/**
* Maintain both framerate and resolution. Frames may be dropped before encoding
* if necessary to avoid overusing network and encoder resources.
*
* @generated from enum value: DEGRADATION_PREFERENCE_MAINTAIN_FRAMERATE_AND_RESOLUTION = 4;
*/
MAINTAIN_FRAMERATE_AND_RESOLUTION = 4,
}

/**
Expand Down
1 change: 1 addition & 0 deletions livekit-ffi-node-bindings/proto/room_pb.js
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ const DegradationPreference = /*@__PURE__*/ proto2.makeEnum(
{no: 1, name: "DEGRADATION_PREFERENCE_MAINTAIN_FRAMERATE", localName: "MAINTAIN_FRAMERATE"},
{no: 2, name: "DEGRADATION_PREFERENCE_MAINTAIN_RESOLUTION", localName: "MAINTAIN_RESOLUTION"},
{no: 3, name: "DEGRADATION_PREFERENCE_DISABLED", localName: "DISABLED"},
{no: 4, name: "DEGRADATION_PREFERENCE_MAINTAIN_FRAMERATE_AND_RESOLUTION", localName: "MAINTAIN_FRAMERATE_AND_RESOLUTION"},
],
);

Expand Down
6 changes: 5 additions & 1 deletion livekit-ffi/protocol/room.proto
Original file line number Diff line number Diff line change
Expand Up @@ -345,8 +345,12 @@ enum DegradationPreference {
DEGRADATION_PREFERENCE_MAINTAIN_FRAMERATE = 1;
// Degrade resolution to maintain framerate (drop frames to keep clarity).
DEGRADATION_PREFERENCE_MAINTAIN_RESOLUTION = 2;
// Disable degradation preference.
// Deprecated: Use MAINTAIN_FRAMERATE_AND_RESOLUTION instead.
// Maintained for backwards compatibility, maps to MAINTAIN_FRAMERATE_AND_RESOLUTION.
DEGRADATION_PREFERENCE_DISABLED = 3;
// Maintain both framerate and resolution. Frames may be dropped before encoding
// if necessary to avoid overusing network and encoder resources.
DEGRADATION_PREFERENCE_MAINTAIN_FRAMERATE_AND_RESOLUTION = 4;
}

enum IceTransportType {
Expand Down
7 changes: 6 additions & 1 deletion livekit-ffi/src/conversion/room.rs
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,12 @@ fn degradation_preference_from_proto(pref: Option<i32>) -> Option<DegradationPre
proto::DegradationPreference::MaintainResolution => {
Some(DegradationPreference::MaintainResolution)
}
proto::DegradationPreference::Disabled => Some(DegradationPreference::Disabled),
// Both Disabled and MaintainFramerateAndResolution map to the same value
// Disabled is deprecated, use MaintainFramerateAndResolution instead
proto::DegradationPreference::Disabled
| proto::DegradationPreference::MaintainFramerateAndResolution => {
Some(DegradationPreference::MaintainFramerateAndResolution)
}
}
}

Expand Down
6 changes: 3 additions & 3 deletions livekit/src/room/options.rs
Original file line number Diff line number Diff line change
Expand Up @@ -619,14 +619,14 @@ mod tests {
DegradationPreference::Balanced
);

// User explicitly sets Disabled
// User explicitly sets MaintainFramerateAndResolution
let options = TrackPublishOptions {
degradation_preference: Some(DegradationPreference::Disabled),
degradation_preference: Some(DegradationPreference::MaintainFramerateAndResolution),
..Default::default()
};
assert_eq!(
get_default_degradation_preference(&options, 1080),
DegradationPreference::Disabled
DegradationPreference::MaintainFramerateAndResolution
);
}
}
5 changes: 4 additions & 1 deletion webrtc-sys/src/rtp_parameters.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,10 @@ pub mod ffi {
#[derive(Debug)]
#[repr(i32)]
pub enum DegradationPreference {
Disabled,
/// Maintain both framerate and resolution. Frames may be dropped before encoding
/// if necessary to avoid overusing network and encoder resources.
/// Note: This was previously called `Disabled` in older WebRTC versions.
MaintainFramerateAndResolution,
MaintainFramerate,
MaintainResolution,
Balanced,
Expand Down