Added resolution setting.

master
Håvar Aambø Fosstveit 2019-04-12 09:10:05 +02:00
parent b422cd3892
commit 091ad77179
4 changed files with 144 additions and 27 deletions

View File

@ -29,8 +29,31 @@ let ROOM_OPTIONS =
const VIDEO_CONSTRAINS =
{
'low' :
{
width : { ideal: 320 },
aspectRatio : 1.334
},
'medium' :
{
width : { ideal: 640 },
aspectRatio : 1.334
},
'high' :
{
width : { ideal: 1280 },
aspectRatio : 1.334
},
'veryhigh' :
{
width : { ideal: 1920 },
aspectRatio : 1.334
},
'ultra' :
{
width : { ideal: 3840 },
aspectRatio : 1.334
}
};
let store;
@ -839,6 +862,56 @@ export default class RoomClient
stateActions.setAudioInProgress(false));
}
async changeVideoResolution(resolution)
{
logger.debug('changeVideoResolution() [resolution: %s]', resolution);
store.dispatch(
stateActions.setWebcamInProgress(true));
try
{
const deviceId = await this._getWebcamDeviceId();
const device = this._webcams[deviceId];
if (!device)
throw new Error('no webcam devices');
logger.debug('changeVideoResolution() | calling getUserMedia()');
const stream = await navigator.mediaDevices.getUserMedia(
{
video :
{
deviceId : { exact: device.deviceId },
...VIDEO_CONSTRAINS[resolution]
}
});
const track = stream.getVideoTracks()[0];
const newTrack = await this._webcamProducer.replaceTrack(track);
track.stop();
store.dispatch(
stateActions.setProducerTrack(this._webcamProducer.id, newTrack));
store.dispatch(stateActions.setSelectedWebcamDevice(deviceId));
store.dispatch(stateActions.setVideoResolution(resolution));
await this._updateWebcams();
}
catch (error)
{
logger.error('changeVideoResolution() failed: %o', error);
}
store.dispatch(
stateActions.setWebcamInProgress(false));
}
async changeWebcam(deviceId)
{
logger.debug('changeWebcam() [deviceId: %s]', deviceId);
@ -849,6 +922,7 @@ export default class RoomClient
try
{
const device = this._webcams[deviceId];
const resolution = store.getState().settings.resolution;
if (!device)
throw new Error('no webcam devices');
@ -864,7 +938,7 @@ export default class RoomClient
video :
{
deviceId : { exact: device.deviceId },
...VIDEO_CONSTRAINS
...VIDEO_CONSTRAINS[resolution]
}
});
@ -1666,6 +1740,7 @@ export default class RoomClient
const deviceId = await this._getWebcamDeviceId();
const device = this._webcams[deviceId];
const resolution = store.getState().settings.resolution;
if (!device)
throw new Error('no webcam devices');
@ -1681,7 +1756,7 @@ export default class RoomClient
video :
{
deviceId : { exact: deviceId },
...VIDEO_CONSTRAINS
...VIDEO_CONSTRAINS[resolution]
}
});

View File

@ -113,6 +113,14 @@ export const setSelectedWebcamDevice = (deviceId) =>
};
};
export const setVideoResolution = (resolution) =>
{
return {
type : 'SET_VIDEO_RESOLUTION',
payload : { resolution }
};
};
export const setFileSharingSupported = (supported) =>
{
return {

View File

@ -59,13 +59,33 @@ const styles = (theme) =>
label : 'Filmstrip view'
} ]; */
const resolutions = [ {
value : 'low',
label : 'Low'
},
{
value : 'medium',
label : 'Medium'
},
{
value : 'high',
label : 'High (HD)'
},
{
value : 'veryhigh',
label : 'Very high (FHD)'
},
{
value : 'ultra',
label : 'Ultra (UHD)'
} ];
const Settings = ({
roomClient,
room,
me,
settings,
onToggleAdvancedMode,
// handleChangeMode,
handleCloseSettings,
classes
}) =>
@ -156,32 +176,38 @@ const Settings = ({
</FormHelperText>
</FormControl>
</form>
<form className={classes.setting} autoComplete='off'>
<FormControl className={classes.formControl}>
<Select
value={settings.resolution || ''}
onChange={(event) =>
{
if (event.target.value)
roomClient.changeVideoResolution(event.target.value);
}}
name='Video resolution'
autoWidth
className={classes.selectEmpty}
>
{ resolutions.map((resolution, index) =>
{
return (
<MenuItem key={index} value={resolution.value}>
{resolution.label}
</MenuItem>
);
})}
</Select>
<FormHelperText>
Select your video resolution
</FormHelperText>
</FormControl>
</form>
<FormControlLabel
className={classes.setting}
control={<Checkbox checked={settings.advancedMode} onChange={onToggleAdvancedMode} value='advancedMode' />}
label='Advanced mode'
/>
{ /* <form className={classes.setting} autoComplete='off'>
<FormControl className={classes.formControl}>
<Select
value={room.mode || ''}
onChange={(event) => handleChangeMode(event.target.value)}
name='Room mode'
autoWidth
className={classes.selectEmpty}
>
{ modes.map((mode, index) =>
{
return (
<MenuItem key={index} value={mode.value}>{mode.label}</MenuItem>
);
})}
</Select>
<FormHelperText>
Select room layout
</FormHelperText>
</FormControl>
</form> */ }
<DialogActions>
<Button onClick={() => handleCloseSettings({ settingsOpen: false })} color='primary'>
Close

View File

@ -4,7 +4,8 @@ const initialState =
picture : null,
selectedWebcam : null,
selectedAudioDevice : null,
advancedMode : false
advancedMode : false,
resolution : 'high' // low, medium, high, veryhigh, ultra
};
const settings = (state = initialState, action) =>
@ -44,6 +45,13 @@ const settings = (state = initialState, action) =>
return { ...state, advancedMode };
}
case 'SET_VIDEO_RESOLUTION':
{
const { resolution } = action.payload;
return { ...state, resolution };
}
default:
return state;
}