123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- // @flow
-
- import type { Dispatch } from 'redux';
-
- import VideoLayout from '../../../modules/UI/videolayout/VideoLayout';
- import { MEDIA_TYPE } from '../base/media';
- import { getTrackByMediaTypeAndParticipant } from '../base/tracks';
-
- import { UPDATE_LAST_LARGE_VIDEO_MEDIA_EVENT } from './actionTypes';
-
- export * from './actions.any';
-
- /**
- * Captures a screenshot of the video displayed on the large video.
- *
- * @returns {Function}
- */
- export function captureLargeVideoScreenshot() {
- return (dispatch: Dispatch<any>, getState: Function): Promise<string> => {
- const state = getState();
- const largeVideo = state['features/large-video'];
- const promise = Promise.resolve();
-
- if (!largeVideo) {
- return promise;
- }
- const tracks = state['features/base/tracks'];
- const participantTrack = getTrackByMediaTypeAndParticipant(tracks, MEDIA_TYPE.VIDEO, largeVideo.participantId);
-
- // Participants that join the call video muted do not have a jitsiTrack attached.
- if (!(participantTrack && participantTrack.jitsiTrack)) {
- return promise;
- }
- const videoStream = participantTrack.jitsiTrack.getOriginalStream();
-
- if (!videoStream) {
- return promise;
- }
-
- // Get the video element for the large video, cast HTMLElement to HTMLVideoElement to make flow happy.
- /* eslint-disable-next-line no-extra-parens*/
- const videoElement = ((document.getElementById('largeVideo'): any): HTMLVideoElement);
-
- if (!videoElement) {
- return promise;
- }
-
- // Create a HTML canvas and draw video on to the canvas.
- const [ track ] = videoStream.getVideoTracks();
- const { height, width } = track.getSettings() ?? track.getConstraints();
- const canvasElement = document.createElement('canvas');
- const ctx = canvasElement.getContext('2d');
-
- canvasElement.style.display = 'none';
- canvasElement.height = parseInt(height, 10);
- canvasElement.width = parseInt(width, 10);
- ctx.drawImage(videoElement, 0, 0);
- const dataURL = canvasElement.toDataURL('image/png', 1.0);
-
- // Cleanup.
- ctx.clearRect(0, 0, canvasElement.width, canvasElement.height);
- canvasElement.remove();
-
- return Promise.resolve(dataURL);
- };
- }
-
- /**
- * Resizes the large video container based on the dimensions provided.
- *
- * @param {number} width - Width that needs to be applied on the large video container.
- * @param {number} height - Height that needs to be applied on the large video container.
- * @returns {Function}
- */
- export function resizeLargeVideo(width: number, height: number) {
- return (dispatch: Dispatch<any>, getState: Function) => {
- const state = getState();
- const largeVideo = state['features/large-video'];
-
- if (largeVideo) {
- const largeVideoContainer = VideoLayout.getLargeVideo();
-
- largeVideoContainer.updateContainerSize(width, height);
- largeVideoContainer.resize();
- }
- };
- }
-
- /**
- * Updates the last media event received for the large video.
- *
- * @param {string} name - The current media event name for the video.
- * @returns {{
- * type: UPDATE_LAST_LARGE_VIDEO_MEDIA_EVENT,
- * name: string
- * }}
- */
- export function updateLastLargeVideoMediaEvent(name: String) {
- return {
- type: UPDATE_LAST_LARGE_VIDEO_MEDIA_EVENT,
- name
- };
- }
|