Skip to content
Open
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
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import MillicastMedia from "./MillicastMedia"

export default class MillicastPublishUserMedia extends Publish {
constructor(options, tokenGenerator, autoReconnect) {
super(options.streamName, tokenGenerator, autoReconnect);
super(undefined, tokenGenerator, autoReconnect);
this.mediaManager = new MillicastMedia(options);
}

Expand Down
2 changes: 2 additions & 0 deletions packages/millicast-publisher-demo/src/publisher.js
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,8 @@ document.addEventListener("DOMContentLoaded", async (event) => {
simulcast,
disableVideo,
disableAudio,
scalabilityMode: 'L3T3',
degradationPreference: 'balanced',
peerConfig : {
autoInitStats: true,
statsIntervalMs : 5000
Expand Down
6 changes: 6 additions & 0 deletions packages/millicast-sdk/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# @millicast/sdk

## 0.7.0

### Minor Changes

- d681907: Add DegradationPreference to PublishOptions

## 0.6.1

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/millicast-sdk/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@millicast/sdk",
"version": "0.6.1",
"version": "0.7.0",
"description": "SDK for building a realtime broadcaster using the Millicast platform.",
"keywords": [
"sdk",
Expand Down
42 changes: 42 additions & 0 deletions packages/millicast-sdk/src/PeerConnection.js
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,48 @@ export default class PeerConnection extends EventEmitter {
}
}

/**
* Configures the strategy used to manage bandwidth constraints for video tracks.
* This determines whether the browser should sacrifice frame rate or resolution
* when network conditions degrade.
* @async
* @param {RTCDegradationPreference} degradationPreference - The strategy to apply.
* Valid values:
* - 'maintain-framerate': Lowers resolution to keep FPS steady (ideal for talking heads).
* - 'maintain-resolution': Lowers FPS to keep image crisp (ideal for screen sharing/text).
* - 'balanced': Automatically balances FPS and resolution.
* @returns {Promise<void>} Resolves when the parameters are successfully applied.
* @throws {Error} If setParameters fails due to invalid state or browser limitations.
* @see {@link https://developer.mozilla.org/en-US/docs/Web/API/RTCRtpSender/setParameters#degradationpreference|MDN: degradationPreference}
*/
async applyDegradationPreference (degradationPreference) {
if (!degradationPreference) return

const validOptions = ['balanced', 'maintain-framerate', 'maintain-resolution']
if (!validOptions.includes(degradationPreference)) {
logger.warn(`Invalid option [${degradationPreference}] provided. Valid options: ${validOptions.join(', ')}`)
return
}

const videoSender = this.peer.getSenders().find(s => s.track && s.track.kind === 'video')

if (!videoSender) {
logger.warn('No active video sender found to apply degradation preference.')
return
}

try {
const parameters = videoSender.getParameters()
parameters.degradationPreference = degradationPreference

await videoSender.setParameters(parameters)
logger.info(`Successfully set degradation preference to: ${degradationPreference}`)
} catch (error) {
logger.error('Failed to set degradation preference:', error)
throw error
}
}

/**
* @typedef {Object} MillicastCapability
* @property {Array<Object>} codecs
Expand Down
2 changes: 2 additions & 0 deletions packages/millicast-sdk/src/Publish.js
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,8 @@ export default class Publish extends BaseWebRTC {

await webRTCPeerInstance.setRTCRemoteSDP(remoteSdp)

await webRTCPeerInstance.applyDegradationPreference(this.options.degradationPreference)

logger.info('Broadcasting to streamName: ', this.streamName)

let oldWebRTCPeer = this.webRTCPeer
Expand Down
Loading
Loading