Codec Selection
lib-jitsi-meet implements sophisticated codec selection to optimize video quality across different network conditions, browsers, and device capabilities.CodecSelection Class
TheCodecSelection class manages codec preferences for both JVB and P2P connections.
Initialization
modules/qualitycontrol/CodecSelection.ts:55-62
Configuration Options
modules/qualitycontrol/CodecSelection.ts:19-27
Default Codec Orders
lib-jitsi-meet uses different default codec orders based on platform and connection type:modules/qualitycontrol/CodecSelection.ts:15-17
Rationale:
- Desktop JVB: Prefer newer codecs (AV1, VP9) for better quality/bandwidth
- Mobile JVB: Prefer VP8 for better hardware support and battery life
- Mobile P2P: Prefer H.264 for hardware acceleration and interoperability
Codec Support Detection
The codec list is filtered based on browser capabilities:modules/qualitycontrol/CodecSelection.ts:137-151
Codec Preference Order Generation
The constructor generates the final codec order based on config and browser support:modules/qualitycontrol/CodecSelection.ts:63-94, 122
Browser-Specific Adjustments
Firefox AV1 Handling
modules/qualitycontrol/CodecSelection.ts:96-112
VP9 Encoding Support
modules/qualitycontrol/CodecSelection.ts:100-112
Safari AV1 Disabled
modules/qualitycontrol/CodecSelection.ts:117-119
Screenshare Codec Selection
modules/qualitycontrol/CodecSelection.ts:125-127
Codec Negotiation
TheselectPreferredCodec method calculates the codec to use based on local preferences and remote capabilities:
modules/qualitycontrol/CodecSelection.ts:179-235
E2EE Constraint
modules/qualitycontrol/CodecSelection.ts:188-190
Asymmetric Codec Support
lib-jitsi-meet supports asymmetric codecs (decode different codec than encode):modules/qualitycontrol/CodecSelection.ts:209-226
Dynamic Codec Switching
Codecs can be changed dynamically due to CPU restrictions:modules/qualitycontrol/CodecSelection.ts:244-274
Codec Complexity Order
Codecs are ordered by encoding complexity (fromStandardVideoQualitySettings.ts):
modules/qualitycontrol/CodecSelection.ts:6, 249-250
Visitor Codec Support
modules/qualitycontrol/CodecSelection.ts:282-289
Codec Capabilities API
Getting Codec Preference List
modules/qualitycontrol/CodecSelection.ts:159-161
Getting Screenshare Codec
modules/qualitycontrol/CodecSelection.ts:169-171
Integration with TraceablePeerConnection
The codec selection integrates with the peer connection:setCodecPreferences API
For browsers supportingRTCRtpTransceiver.setCodecPreferences() (Chrome, Edge):
Codec Selection API (Chrome 126+)
For browsers supporting per-encoding codec selection:Best Practices
-
Use preferenceOrder over deprecated settings: The
preferenceOrderarray provides more flexibility thanpreferredCodec/disabledCodec. -
Different codecs for JVB and P2P: Optimize for each connection type:
-
Test on target browsers: Codec support varies significantly. Use
_getSupportedVideoCodecs()to verify. - Consider hardware acceleration: H.264 has better hardware support on mobile devices.
-
Monitor CPU usage: Use
changeCodecPreferenceOrder()to dynamically adjust based on CPU load.
Next Steps
- WebRTC Internals - Encoding parameters and SDP
- Network Optimization - Bandwidth adaptation
- Browser Compatibility - Feature detection