mirror of https://github.com/OpenVidu/openvidu.git
78 lines
2.4 KiB
JavaScript
78 lines
2.4 KiB
JavaScript
// Ideally we'd use an editor or import shaders directly from the API.
|
|
import { FilterStream } from './filter-stream.js';
|
|
|
|
export default function monkeyPatchMediaDevices() {
|
|
const enumerateDevicesFn = MediaDevices.prototype.enumerateDevices;
|
|
const getUserMediaFn = MediaDevices.prototype.getUserMedia;
|
|
const getDisplayMediaFn = MediaDevices.prototype.getDisplayMedia;
|
|
|
|
const fakeVideoDevice = {
|
|
deviceId: 'virtual',
|
|
groupID: '',
|
|
kind: 'videoinput',
|
|
label: 'custom_fake_video_1'
|
|
};
|
|
|
|
const fakeAudioDevice = {
|
|
deviceId: 'virtual',
|
|
groupID: '',
|
|
kind: 'audioinput',
|
|
label: 'custom_fake_audio_1'
|
|
};
|
|
|
|
const enumerateDevicesMonkeyPatch = async function () {
|
|
const res = await enumerateDevicesFn.call(navigator.mediaDevices);
|
|
res.push(fakeVideoDevice);
|
|
res.push(fakeAudioDevice);
|
|
return res;
|
|
};
|
|
|
|
const getUserMediaMonkeyPatch = async function () {
|
|
const args = arguments[0];
|
|
const { deviceId, advanced, width, height } = args.video;
|
|
if (deviceId === 'virtual' || deviceId?.exact === 'virtual') {
|
|
const constraints = {
|
|
video: {
|
|
facingMode: args.facingMode,
|
|
advanced,
|
|
width,
|
|
height
|
|
},
|
|
audio: false
|
|
};
|
|
const res = await getUserMediaFn.call(navigator.mediaDevices, constraints);
|
|
|
|
if (res) {
|
|
const filter = new FilterStream(res, fakeVideoDevice.label);
|
|
return filter.outputStream;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
return getUserMediaFn.call(navigator.mediaDevices, ...arguments);
|
|
};
|
|
|
|
const getDisplayMediaMonkeyPatch = async function () {
|
|
const { video, audio } = arguments[0];
|
|
|
|
const screenVideoElement = document.getElementsByClassName('OV_video-element screen-type')[0];
|
|
const currentTrackLabel = screenVideoElement?.srcObject?.getVideoTracks()[0]?.label;
|
|
const res = await getDisplayMediaFn.call(navigator.mediaDevices, { video, audio });
|
|
|
|
if (res && currentTrackLabel && currentTrackLabel !== 'custom_fake_screen') {
|
|
const filter = new FilterStream(res, 'custom_fake_screen');
|
|
return filter.outputStream;
|
|
}
|
|
|
|
return res;
|
|
};
|
|
|
|
MediaDevices.prototype.enumerateDevices = enumerateDevicesMonkeyPatch;
|
|
navigator.mediaDevices.enumerateDevices = enumerateDevicesMonkeyPatch;
|
|
MediaDevices.prototype.getUserMedia = getUserMediaMonkeyPatch;
|
|
navigator.mediaDevices.getUserMedia = getUserMediaMonkeyPatch;
|
|
MediaDevices.prototype.getDisplayMedia = getDisplayMediaMonkeyPatch;
|
|
navigator.mediaDevices.getDisplayMedia = getDisplayMediaMonkeyPatch;
|
|
}
|