Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
f7daf51
feat(plugin-meetings): add AV1 codec support and related constants
fnowakow Mar 27, 2026
4e13054
refactor(plugin-meetings): cleanup
fnowakow Mar 27, 2026
f839cce
feat(plugin-meetings): implement payload type updates for multistream…
fnowakow Mar 27, 2026
3f202df
feat(plugin-meetings): enhance AV1 codec handling
fnowakow Mar 27, 2026
c036a6f
feat(plugin-meetings): refactor ingress payload type handling for med…
fnowakow Mar 30, 2026
62f347a
feat(plugin-meetings): enable AV1 slides support and improve ingress …
fnowakow Mar 31, 2026
d677d63
feat(plugin-meetings): add configuration and API for AV1 video slides…
fnowakow Mar 31, 2026
f59d9fd
feat(plugin-meetings): add dynamic ingress payload type resolution fo…
Apr 1, 2026
4b4f496
feat: add logging for get ingress payload
Apr 1, 2026
1de0d0d
fix(plugin-meetings): fix AV1 codec parameters and standardize naming…
Apr 2, 2026
1decb0d
fix(plugin-meetings): merge AV1 codec defaults with resolution parame…
fnowakow Apr 7, 2026
9266e76
refactor(plugin-meetings): remove redundant tier property from AV1 co…
fnowakow Apr 7, 2026
ee151d0
refactor(plugin-meetings): remove unused imports from meeting index
fnowakow Apr 7, 2026
1010534
refactor(plugin-meetings): correct method name casing for AV1 video s…
fnowakow Apr 7, 2026
3d78c78
refactor(plugin-meetings): rename AV1 video slides configuration and …
fnowakow Apr 7, 2026
f3f1dc8
chore: formatting
fnowakow Apr 8, 2026
9c223e4
fix: tests
fnowakow Apr 8, 2026
7e9d411
fix: blank spaces
fnowakow Apr 8, 2026
b2a31c6
refactor(plugin-meetings): update codec parameters
fnowakow Apr 13, 2026
cb39af8
refactor(plugin-meetings): enhance AV1 codec parameter handling with …
fnowakow Apr 15, 2026
0571d52
test(plugin-meetings): add AV1 codec degradation tests for media requ…
fnowakow Apr 15, 2026
c9d9c38
test(plugin-meetings): replace Chai expect with assert for consistenc…
fnowakow Apr 15, 2026
8c55ea2
test(plugin-meetings): enhance mediaRequestManager tests
fnowakow Apr 15, 2026
b81cfe3
test(plugin-meetings): clean up mediaRequestManager tests
fnowakow Apr 15, 2026
01bb1db
Merge branch 'next' into av1-no-refactor
k-wasniowski Apr 17, 2026
1b0e493
Merge branch 'next' into av1-no-refactor
k-wasniowski Apr 17, 2026
1d951c2
refactor(plugin-meetings): update AV1 codec parameters for improved a…
fnowakow Apr 17, 2026
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
1 change: 1 addition & 0 deletions packages/@webex/plugin-meetings/src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ export default {
degradationPreferences: {
maxMacroblocksLimit: 8192,
},
enableAv1SlidesSupport: false,
// This only applies to non-multistream meetings
iceCandidatesGatheringTimeout: undefined,
backendIpv6NativeSupport: false,
Expand Down
3 changes: 3 additions & 0 deletions packages/@webex/plugin-meetings/src/media/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ Media.createMediaConnection = (
iceCandidatesTimeout?: number;
disableAudioMainDtx?: boolean;
enableAudioTwcc?: boolean;
enableAv1SlidesSupport?: boolean;
stopIceGatheringAfterFirstRelayCandidate?: boolean;
}
) => {
Expand All @@ -159,6 +160,7 @@ Media.createMediaConnection = (
iceCandidatesTimeout,
disableAudioMainDtx,
enableAudioTwcc,
enableAv1SlidesSupport,
stopIceGatheringAfterFirstRelayCandidate,
} = options;

Expand All @@ -178,6 +180,7 @@ Media.createMediaConnection = (
const config: MultistreamConnectionConfig = {
iceServers,
disableAudioTwcc: !enableAudioTwcc,
enableAV1SlidesSupport: !!enableAv1SlidesSupport,
};

if (bundlePolicy) {
Expand Down
35 changes: 33 additions & 2 deletions packages/@webex/plugin-meetings/src/meeting/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import {
MediaConnectionEventNames,
MediaContent,
MediaType,
MediaCodecMimeType,
RemoteTrackType,
RoapMessage,
StatsAnalyzer,
Expand All @@ -31,7 +30,7 @@ import {
NetworkQualityMonitor,
StatsMonitor,
StatsMonitorEventNames,
InboundAudioIssueSubTypes,
MediaCodecMimeType,
} from '@webex/internal-media-core';

import {DataChannelTokenType} from '@webex/internal-plugin-llm';
Expand Down Expand Up @@ -966,6 +965,30 @@ export default class Meeting extends StatelessWebexPlugin {
},
(csi: CSI) => (this.members.findMemberByCsi(csi) as any)?.id
);

const getIngressPayloadTypeCallback = (
mediaType: MediaType,
codecMimeType: MediaCodecMimeType
) => {
if (this.isMultistream) {
try {
return this.mediaProperties.webrtcMediaConnection.getIngressPayloadType(
mediaType,
codecMimeType
);
} catch (error) {
Comment thread
edvujic marked this conversation as resolved.
LoggerProxy.logger.info(
`Meeting:index#mediaRequestManager --> failed to get ingress payload type for mediaType=${mediaType}, codecMimeType=${codecMimeType}`,
error
);

return undefined;
}
}

return undefined;
};

/**
* Object containing helper classes for managing media requests for audio/video/screenshare (for multistream media connections)
* All multistream media requests sent out for this meeting have to go through them.
Expand All @@ -985,6 +1008,7 @@ export default class Meeting extends StatelessWebexPlugin {
mediaRequests
);
},
getIngressPayloadTypeCallback,
{
// @ts-ignore - config coming from registerPlugin
degradationPreferences: this.config.degradationPreferences,
Expand All @@ -1006,6 +1030,7 @@ export default class Meeting extends StatelessWebexPlugin {
mediaRequests
);
},
getIngressPayloadTypeCallback,
{
// @ts-ignore - config coming from registerPlugin
degradationPreferences: this.config.degradationPreferences,
Expand All @@ -1027,6 +1052,7 @@ export default class Meeting extends StatelessWebexPlugin {
mediaRequests
);
},
getIngressPayloadTypeCallback,
{
// @ts-ignore - config coming from registerPlugin
degradationPreferences: this.config.degradationPreferences,
Expand All @@ -1048,11 +1074,14 @@ export default class Meeting extends StatelessWebexPlugin {
mediaRequests
);
},
getIngressPayloadTypeCallback,
{
// @ts-ignore - config coming from registerPlugin
degradationPreferences: this.config.degradationPreferences,
kind: 'video',
trimRequestsToNumOfSources: false,
// @ts-ignore - config coming from registerPlugin
enableAv1: this.config.enableAv1SlidesSupport,
Comment thread
SomeBody16 marked this conversation as resolved.
Comment thread
SomeBody16 marked this conversation as resolved.
}
),
};
Expand Down Expand Up @@ -7550,6 +7579,8 @@ export default class Meeting extends StatelessWebexPlugin {
disableAudioMainDtx: this.config.experimental.disableAudioMainDtx,
// @ts-ignore - config coming from registerPlugin
enableAudioTwcc: this.config.enableAudioTwccForMultistream,
// @ts-ignore - config coming from registerPlugin
enableAv1SlidesSupport: this.config.enableAv1SlidesSupport,
stopIceGatheringAfterFirstRelayCandidate:
// @ts-ignore - config coming from registerPlugin
this.config.stopIceGatheringAfterFirstRelayCandidate,
Expand Down
21 changes: 21 additions & 0 deletions packages/@webex/plugin-meetings/src/meetings/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -927,6 +927,27 @@ export default class Meetings extends WebexPlugin {
}
}

/**
* API to toggle AV1 codec support for video slides in multistream,
* needs to be called before webex.meetings.joinWithMedia()
*
* @param {Boolean} newValue
* @private
* @memberof Meetings
* @returns {undefined}
*/
private _toggleEnableAv1SlidesSupport(newValue: boolean) {
if (typeof newValue !== 'boolean') {
return;
}

// @ts-ignore
if (this.config.enableAv1SlidesSupport !== newValue) {
// @ts-ignore
this.config.enableAv1SlidesSupport = newValue;
}
}

/**
* API to toggle stopping ICE Candidates Gathering after first relay candidate,
* needs to be called before webex.meetings.joinWithMedia()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
export const AV1_CODEC_PARAMETERS = {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does the AV1EncodingParams type from @webex/internal-media-core still expect a profile field? If so, this could be a type error or silent omission downstream. Worth confirming against the 2.23.3 type definitions.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It does not at 2.23.3

export type AV1EncodingParams = BaseVideoEncodingParams & {
  levelIdx?: number;
  tier?: number;
  maxPicSize?: number;
  maxDecodeRate?: number;
};

'90p': {
levelIdx: 0,
tier: 0,
maxWidth: 160,
maxHeight: 90,
maxPicSize: 160 * 90,
maxDecodeRate: 5_529_600,
},
'180p': {
levelIdx: 0,
tier: 0,
maxWidth: 320,
maxHeight: 180,
maxPicSize: 320 * 180,
maxDecodeRate: 5_529_600,
},
'360p': {
levelIdx: 1,
tier: 0,
maxWidth: 640,
maxHeight: 360,
maxPicSize: 640 * 360,
maxDecodeRate: 10_454_400,
},
'540p': {
levelIdx: 4,
tier: 0,
maxWidth: 960,
maxHeight: 540,
maxPicSize: 960 * 540,
maxDecodeRate: 24_969_600,
},
'720p': {
levelIdx: 5,
tier: 0,
maxWidth: 1280,
maxHeight: 720,
maxPicSize: 1280 * 720,
maxDecodeRate: 39_938_400,
},
'1080p': {
levelIdx: 8,
tier: 0,
maxWidth: 1920,
maxHeight: 1080,
maxPicSize: 1920 * 1080,
maxDecodeRate: 77_856_768,
},
};

export const H264_CODEC_PARAMETERS = {
maxFs: 8192,
maxFps: 3000,
maxMbps: 245760,
};
Loading
Loading