You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

LiteModeContext.js 1.7KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import { getLogger } from '@jitsi/logger';
  2. import RTCEvents from '../../service/RTC/RTCEvents';
  3. import FeatureFlags from '../flags/FeatureFlags';
  4. // Flag to set on receivers to avoid setting up the lite mode
  5. // more than once.
  6. const kJitsiLiteMode = Symbol('kJitsiLiteMode');
  7. const logger = getLogger(__filename);
  8. /**
  9. * This module implements a discard-all insertable stream. Use to reduce decoder CPU load for testing.
  10. */
  11. export class LiteModeContext {
  12. /**
  13. * A constructor.
  14. * @param {JitsiConference} conference - The conference instance for which lite mode is to be enabled.
  15. */
  16. constructor(conference) {
  17. this.enabled = FeatureFlags.isRunInLiteModeEnabled();
  18. if (!this.enabled) {
  19. return;
  20. }
  21. conference.rtc.on(
  22. RTCEvents.REMOTE_TRACK_ADDED,
  23. (track, tpc) => this._setupLiteModeForTrack(tpc, track));
  24. }
  25. /**
  26. * Setup Lite Mode for a track.
  27. *
  28. * @private
  29. */
  30. _setupLiteModeForTrack(tpc, track) {
  31. if (!this.enabled) {
  32. return;
  33. }
  34. const receiver = tpc.findReceiverForTrack(track.track);
  35. if (!receiver) {
  36. logger.warn(`Could not set up lite mode for ${track}: receiver not found in: ${tpc}`);
  37. return;
  38. }
  39. if (receiver[kJitsiLiteMode]) {
  40. return;
  41. }
  42. receiver[kJitsiLiteMode] = true;
  43. const receiverStreams = receiver.createEncodedStreams();
  44. const transformStream = new TransformStream({
  45. transform: () => {
  46. // Don't call controller.enqueue(encodedFrame), and so drop everything
  47. }
  48. });
  49. receiverStreams.readable.pipeThrough(transformStream).pipeTo(receiverStreams.writable);
  50. }
  51. }