From fb650243daf78500d5a83eacdd78c79f219a83ed Mon Sep 17 00:00:00 2001 From: Ingo Oppermann Date: Mon, 7 Nov 2022 22:15:38 +0100 Subject: [PATCH] Add skills props to encoder and decoder components --- src/misc/EncodingSelect.js | 28 +++++++++------ src/misc/coders/Decoders/audio/Default.js | 1 + src/misc/coders/Decoders/video/Default.js | 1 + src/misc/coders/Decoders/video/H264CUVID.js | 1 + src/misc/coders/Decoders/video/H264MMAL.js | 1 + src/misc/coders/Decoders/video/HEVCCUVID.js | 1 + src/misc/coders/Decoders/video/MJPEGCUVID.js | 1 + src/misc/coders/Decoders/video/MPEG1CUVID.js | 1 + src/misc/coders/Decoders/video/MPEG2CUVID.js | 1 + src/misc/coders/Decoders/video/MPEG2MMAL.js | 1 + src/misc/coders/Decoders/video/MPEG4CUVID.js | 1 + src/misc/coders/Decoders/video/MPEG4MMAL.js | 1 + src/misc/coders/Decoders/video/NVDEC.js | 1 + src/misc/coders/Decoders/video/VC1CUVID.js | 1 + src/misc/coders/Decoders/video/VC1MMAL.js | 1 + src/misc/coders/Decoders/video/VP8CUVID.js | 1 + src/misc/coders/Decoders/video/VP9CUVID.js | 1 + .../coders/Decoders/video/VideoToolbox.js | 1 + src/misc/coders/Encoders/audio/AAC.js | 1 + .../coders/Encoders/audio/AACAudioToolbox.js | 1 + src/misc/coders/Encoders/audio/Copy.js | 1 + src/misc/coders/Encoders/audio/Libopus.js | 1 + src/misc/coders/Encoders/audio/Libvorbis.js | 1 + src/misc/coders/Encoders/audio/MP3.js | 1 + src/misc/coders/Encoders/audio/None.js | 1 + src/misc/coders/Encoders/audio/Opus.js | 1 + src/misc/coders/Encoders/audio/Vorbis.js | 1 + src/misc/coders/Encoders/video/Copy.js | 1 + src/misc/coders/Encoders/video/H264NVENC.js | 1 + src/misc/coders/Encoders/video/H264OMX.js | 1 + src/misc/coders/Encoders/video/H264V4L2M2M.js | 1 + src/misc/coders/Encoders/video/H264VAAPI.js | 1 + .../coders/Encoders/video/H264VideoToolbox.js | 1 + src/misc/coders/Encoders/video/HEVCVAAPI.js | 1 + src/misc/coders/Encoders/video/None.js | 1 + src/misc/coders/Encoders/video/Raw.js | 1 + src/misc/coders/Encoders/video/VP9.js | 36 ++++++++++++------- src/misc/coders/Encoders/video/VP9VAAPI.js | 1 + src/misc/coders/Encoders/video/X264.js | 36 ++++++++++++------- src/misc/coders/Encoders/video/X265.js | 36 ++++++++++++------- src/views/Edit/Profile.js | 7 ++-- src/views/Publication/Add.js | 6 ++-- src/views/Publication/Edit.js | 6 ++-- 43 files changed, 133 insertions(+), 58 deletions(-) diff --git a/src/misc/EncodingSelect.js b/src/misc/EncodingSelect.js index 0ef6838..6434cbf 100644 --- a/src/misc/EncodingSelect.js +++ b/src/misc/EncodingSelect.js @@ -16,6 +16,15 @@ export default function EncodingSelect(props) { const { i18n } = useLingui(); const profile = props.profile; + let availableEncoders = []; + let availableDecoders = []; + + if (props.type === 'video') { + availableEncoders = props.skills.encoders.video; + availableDecoders = props.skills.decoders.video; + } else if (props.type === 'audio') { + availableEncoders = props.skills.encoders.audio; + } const handleDecoderChange = (event) => { const decoder = profile.decoder; @@ -30,7 +39,7 @@ export default function EncodingSelect(props) { } if (c !== null) { - const defaults = c.defaults(); + const defaults = c.defaults(props.skills); decoder.settings = defaults.settings; decoder.mapping = defaults.mapping; } @@ -60,7 +69,7 @@ export default function EncodingSelect(props) { } if (c !== null) { - const defaults = c.defaults({}); + const defaults = c.defaults(props.skills); encoder.settings = defaults.settings; encoder.mapping = defaults.mapping; } @@ -116,10 +125,10 @@ export default function EncodingSelect(props) { let encoderSettingsHelp = null; let coder = encoderRegistry.Get(profile.encoder.coder); - if (coder !== null && props.availableEncoders.includes(coder.coder)) { + if (coder !== null && availableEncoders.includes(coder.coder)) { const Settings = coder.component; - encoderSettings = ; + encoderSettings = ; if (props.type === 'video' && !['copy', 'none', 'rawvideo'].includes(coder.coder)) { encoderSettingsHelp = handleEncoderHelp(coder.coder); @@ -130,7 +139,7 @@ export default function EncodingSelect(props) { for (let c of encoderRegistry.List()) { // Does ffmpeg support the coder? - if (!props.availableEncoders.includes(c.coder)) { + if (!availableEncoders.includes(c.coder)) { continue; } @@ -173,14 +182,14 @@ export default function EncodingSelect(props) { if (coder.coder !== 'copy' && coder.coder !== 'none') { let c = decoderRegistry.Get(profile.decoder.coder); - if (c !== null && props.availableDecoders.includes(c.coder)) { + if (c !== null && availableDecoders.includes(c.coder)) { const Settings = c.component; - decoderSettings = ; + decoderSettings = ; } // List all decoders for the codec of the stream - for (let c of decoderRegistry.GetCodersForCodec(stream.codec, props.availableDecoders, 'any')) { + for (let c of decoderRegistry.GetCodersForCodec(stream.codec, availableDecoders, 'any')) { decoderList.push( {c.name} @@ -237,7 +246,6 @@ EncodingSelect.defaultProps = { streams: [], profile: {}, codecs: [], - availableEncoders: [], - availableDecoders: [], + skills: {}, onChange: function (encoder, decoder, automatic) {}, }; diff --git a/src/misc/coders/Decoders/audio/Default.js b/src/misc/coders/Decoders/audio/Default.js index a1d3cac..76f7adb 100644 --- a/src/misc/coders/Decoders/audio/Default.js +++ b/src/misc/coders/Decoders/audio/Default.js @@ -41,6 +41,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Decoders/video/Default.js b/src/misc/coders/Decoders/video/Default.js index 1dc1411..cadb4fa 100644 --- a/src/misc/coders/Decoders/video/Default.js +++ b/src/misc/coders/Decoders/video/Default.js @@ -41,6 +41,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Decoders/video/H264CUVID.js b/src/misc/coders/Decoders/video/H264CUVID.js index 051fe18..6a37ecc 100644 --- a/src/misc/coders/Decoders/video/H264CUVID.js +++ b/src/misc/coders/Decoders/video/H264CUVID.js @@ -41,6 +41,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Decoders/video/H264MMAL.js b/src/misc/coders/Decoders/video/H264MMAL.js index 80feb94..9aba835 100644 --- a/src/misc/coders/Decoders/video/H264MMAL.js +++ b/src/misc/coders/Decoders/video/H264MMAL.js @@ -41,6 +41,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Decoders/video/HEVCCUVID.js b/src/misc/coders/Decoders/video/HEVCCUVID.js index 869f26a..41d16dc 100644 --- a/src/misc/coders/Decoders/video/HEVCCUVID.js +++ b/src/misc/coders/Decoders/video/HEVCCUVID.js @@ -41,6 +41,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Decoders/video/MJPEGCUVID.js b/src/misc/coders/Decoders/video/MJPEGCUVID.js index fc8706a..ea9394c 100644 --- a/src/misc/coders/Decoders/video/MJPEGCUVID.js +++ b/src/misc/coders/Decoders/video/MJPEGCUVID.js @@ -41,6 +41,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Decoders/video/MPEG1CUVID.js b/src/misc/coders/Decoders/video/MPEG1CUVID.js index cb2ecdf..ca66f48 100644 --- a/src/misc/coders/Decoders/video/MPEG1CUVID.js +++ b/src/misc/coders/Decoders/video/MPEG1CUVID.js @@ -41,6 +41,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Decoders/video/MPEG2CUVID.js b/src/misc/coders/Decoders/video/MPEG2CUVID.js index 2d88baa..be14daa 100644 --- a/src/misc/coders/Decoders/video/MPEG2CUVID.js +++ b/src/misc/coders/Decoders/video/MPEG2CUVID.js @@ -41,6 +41,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Decoders/video/MPEG2MMAL.js b/src/misc/coders/Decoders/video/MPEG2MMAL.js index d2166c3..f2ee0ab 100644 --- a/src/misc/coders/Decoders/video/MPEG2MMAL.js +++ b/src/misc/coders/Decoders/video/MPEG2MMAL.js @@ -41,6 +41,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Decoders/video/MPEG4CUVID.js b/src/misc/coders/Decoders/video/MPEG4CUVID.js index b3da8b5..441c9c6 100644 --- a/src/misc/coders/Decoders/video/MPEG4CUVID.js +++ b/src/misc/coders/Decoders/video/MPEG4CUVID.js @@ -41,6 +41,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Decoders/video/MPEG4MMAL.js b/src/misc/coders/Decoders/video/MPEG4MMAL.js index 3e23ae4..8b4f6c3 100644 --- a/src/misc/coders/Decoders/video/MPEG4MMAL.js +++ b/src/misc/coders/Decoders/video/MPEG4MMAL.js @@ -41,6 +41,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Decoders/video/NVDEC.js b/src/misc/coders/Decoders/video/NVDEC.js index 28b3216..6945bde 100644 --- a/src/misc/coders/Decoders/video/NVDEC.js +++ b/src/misc/coders/Decoders/video/NVDEC.js @@ -41,6 +41,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Decoders/video/VC1CUVID.js b/src/misc/coders/Decoders/video/VC1CUVID.js index b7da391..8271a4c 100644 --- a/src/misc/coders/Decoders/video/VC1CUVID.js +++ b/src/misc/coders/Decoders/video/VC1CUVID.js @@ -41,6 +41,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Decoders/video/VC1MMAL.js b/src/misc/coders/Decoders/video/VC1MMAL.js index 0c3fbad..6c88800 100644 --- a/src/misc/coders/Decoders/video/VC1MMAL.js +++ b/src/misc/coders/Decoders/video/VC1MMAL.js @@ -41,6 +41,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Decoders/video/VP8CUVID.js b/src/misc/coders/Decoders/video/VP8CUVID.js index d298e8a..186778c 100644 --- a/src/misc/coders/Decoders/video/VP8CUVID.js +++ b/src/misc/coders/Decoders/video/VP8CUVID.js @@ -41,6 +41,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Decoders/video/VP9CUVID.js b/src/misc/coders/Decoders/video/VP9CUVID.js index 5c8a409..26a7c49 100644 --- a/src/misc/coders/Decoders/video/VP9CUVID.js +++ b/src/misc/coders/Decoders/video/VP9CUVID.js @@ -41,6 +41,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Decoders/video/VideoToolbox.js b/src/misc/coders/Decoders/video/VideoToolbox.js index 1f77c30..a23486a 100644 --- a/src/misc/coders/Decoders/video/VideoToolbox.js +++ b/src/misc/coders/Decoders/video/VideoToolbox.js @@ -41,6 +41,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Encoders/audio/AAC.js b/src/misc/coders/Encoders/audio/AAC.js index 98687d5..b9af128 100644 --- a/src/misc/coders/Encoders/audio/AAC.js +++ b/src/misc/coders/Encoders/audio/AAC.js @@ -70,6 +70,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Encoders/audio/AACAudioToolbox.js b/src/misc/coders/Encoders/audio/AACAudioToolbox.js index f96ad23..240c7fd 100644 --- a/src/misc/coders/Encoders/audio/AACAudioToolbox.js +++ b/src/misc/coders/Encoders/audio/AACAudioToolbox.js @@ -70,6 +70,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Encoders/audio/Copy.js b/src/misc/coders/Encoders/audio/Copy.js index 9065c38..58b21cf 100644 --- a/src/misc/coders/Encoders/audio/Copy.js +++ b/src/misc/coders/Encoders/audio/Copy.js @@ -40,6 +40,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Encoders/audio/Libopus.js b/src/misc/coders/Encoders/audio/Libopus.js index 6ab9b25..d0a35c2 100644 --- a/src/misc/coders/Encoders/audio/Libopus.js +++ b/src/misc/coders/Encoders/audio/Libopus.js @@ -66,6 +66,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Encoders/audio/Libvorbis.js b/src/misc/coders/Encoders/audio/Libvorbis.js index 589fb44..ae01d32 100644 --- a/src/misc/coders/Encoders/audio/Libvorbis.js +++ b/src/misc/coders/Encoders/audio/Libvorbis.js @@ -66,6 +66,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Encoders/audio/MP3.js b/src/misc/coders/Encoders/audio/MP3.js index bb69de6..3664d51 100644 --- a/src/misc/coders/Encoders/audio/MP3.js +++ b/src/misc/coders/Encoders/audio/MP3.js @@ -67,6 +67,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Encoders/audio/None.js b/src/misc/coders/Encoders/audio/None.js index 5f5c3fd..718e0a1 100644 --- a/src/misc/coders/Encoders/audio/None.js +++ b/src/misc/coders/Encoders/audio/None.js @@ -36,6 +36,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Encoders/audio/Opus.js b/src/misc/coders/Encoders/audio/Opus.js index 5ce35df..d34f2aa 100644 --- a/src/misc/coders/Encoders/audio/Opus.js +++ b/src/misc/coders/Encoders/audio/Opus.js @@ -133,6 +133,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Encoders/audio/Vorbis.js b/src/misc/coders/Encoders/audio/Vorbis.js index 07a66ca..a8cc2a6 100644 --- a/src/misc/coders/Encoders/audio/Vorbis.js +++ b/src/misc/coders/Encoders/audio/Vorbis.js @@ -66,6 +66,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Encoders/video/Copy.js b/src/misc/coders/Encoders/video/Copy.js index 4f636a0..2283e68 100644 --- a/src/misc/coders/Encoders/video/Copy.js +++ b/src/misc/coders/Encoders/video/Copy.js @@ -35,6 +35,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Encoders/video/H264NVENC.js b/src/misc/coders/Encoders/video/H264NVENC.js index 82758a1..b6d8986 100644 --- a/src/misc/coders/Encoders/video/H264NVENC.js +++ b/src/misc/coders/Encoders/video/H264NVENC.js @@ -218,6 +218,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Encoders/video/H264OMX.js b/src/misc/coders/Encoders/video/H264OMX.js index 834fc6a..4896d25 100644 --- a/src/misc/coders/Encoders/video/H264OMX.js +++ b/src/misc/coders/Encoders/video/H264OMX.js @@ -96,6 +96,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Encoders/video/H264V4L2M2M.js b/src/misc/coders/Encoders/video/H264V4L2M2M.js index da03a84..d153eac 100644 --- a/src/misc/coders/Encoders/video/H264V4L2M2M.js +++ b/src/misc/coders/Encoders/video/H264V4L2M2M.js @@ -141,6 +141,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Encoders/video/H264VAAPI.js b/src/misc/coders/Encoders/video/H264VAAPI.js index f65151d..730fe61 100644 --- a/src/misc/coders/Encoders/video/H264VAAPI.js +++ b/src/misc/coders/Encoders/video/H264VAAPI.js @@ -149,6 +149,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Encoders/video/H264VideoToolbox.js b/src/misc/coders/Encoders/video/H264VideoToolbox.js index 52d52bb..f416856 100644 --- a/src/misc/coders/Encoders/video/H264VideoToolbox.js +++ b/src/misc/coders/Encoders/video/H264VideoToolbox.js @@ -125,6 +125,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Encoders/video/HEVCVAAPI.js b/src/misc/coders/Encoders/video/HEVCVAAPI.js index c2f4fae..ec0f00f 100644 --- a/src/misc/coders/Encoders/video/HEVCVAAPI.js +++ b/src/misc/coders/Encoders/video/HEVCVAAPI.js @@ -149,6 +149,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Encoders/video/None.js b/src/misc/coders/Encoders/video/None.js index 6cd3632..e5363a5 100644 --- a/src/misc/coders/Encoders/video/None.js +++ b/src/misc/coders/Encoders/video/None.js @@ -36,6 +36,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Encoders/video/Raw.js b/src/misc/coders/Encoders/video/Raw.js index 5c72db2..bd6c66f 100644 --- a/src/misc/coders/Encoders/video/Raw.js +++ b/src/misc/coders/Encoders/video/Raw.js @@ -35,6 +35,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Encoders/video/VP9.js b/src/misc/coders/Encoders/video/VP9.js index 7f3353b..3d5f3cf 100644 --- a/src/misc/coders/Encoders/video/VP9.js +++ b/src/misc/coders/Encoders/video/VP9.js @@ -1,4 +1,5 @@ import React from 'react'; +import SemverSatisfies from 'semver/functions/satisfies'; import Grid from '@mui/material/Grid'; import MenuItem from '@mui/material/MenuItem'; @@ -20,7 +21,12 @@ function init(initialState) { return state; } -function createMapping(settings) { +function createMapping(settings, skills) { + let ffversion = 4; + if (SemverSatisfies(skills.ffmpeg.version, '^5.0.0')) { + ffversion = 5; + } + const local = [ '-codec:v', 'libvpx-vp9', @@ -47,11 +53,10 @@ function createMapping(settings) { ); } - if (settings.fps_mode !== 'passthrough') { - local.push( - '-fps_mode', - `${settings.fps_mode}` - ) + if (ffversion === 5) { + if (settings.fps_mode !== 'passthrough') { + local.push('-fps_mode', `${settings.fps_mode}`); + } } const mapping = { @@ -78,6 +83,10 @@ FpsMode.defaultProps = { function Coder(props) { const settings = init(props.settings); + let ffversion = 4; + if (SemverSatisfies(props.skills.ffmpeg.version, '^5.0.0')) { + ffversion = 5; + } const handleChange = (newSettings) => { let automatic = false; @@ -86,7 +95,7 @@ function Coder(props) { automatic = true; } - props.onChange(newSettings, createMapping(newSettings), automatic); + props.onChange(newSettings, createMapping(newSettings, props.skills), automatic); }; const update = (what) => (event) => { @@ -114,9 +123,11 @@ function Coder(props) { - - - + {ffversion === 5 && ( + + + + )} ); } @@ -124,6 +135,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; @@ -137,12 +149,12 @@ function summarize(settings) { return `${name}, ${settings.bitrate} kbit/s, ${settings.fps} FPS, Preset: ${settings.preset}, Profile: ${settings.profile}`; } -function defaults() { +function defaults(skills) { const settings = init({}); return { settings: settings, - mapping: createMapping(settings), + mapping: createMapping(settings, skills), }; } diff --git a/src/misc/coders/Encoders/video/VP9VAAPI.js b/src/misc/coders/Encoders/video/VP9VAAPI.js index 5156df3..a02d278 100644 --- a/src/misc/coders/Encoders/video/VP9VAAPI.js +++ b/src/misc/coders/Encoders/video/VP9VAAPI.js @@ -149,6 +149,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; diff --git a/src/misc/coders/Encoders/video/X264.js b/src/misc/coders/Encoders/video/X264.js index 781faeb..2f034b9 100644 --- a/src/misc/coders/Encoders/video/X264.js +++ b/src/misc/coders/Encoders/video/X264.js @@ -1,4 +1,5 @@ import React from 'react'; +import SemverSatisfies from 'semver/functions/satisfies'; import Grid from '@mui/material/Grid'; import MenuItem from '@mui/material/MenuItem'; @@ -23,7 +24,12 @@ function init(initialState) { return state; } -function createMapping(settings) { +function createMapping(settings, skills) { + let ffversion = 4; + if (SemverSatisfies(skills.ffmpeg.version, '^5.0.0')) { + ffversion = 5; + } + const local = [ '-codec:v', 'libx264', @@ -52,11 +58,10 @@ function createMapping(settings) { ); } - if (settings.fps_mode !== 'passthrough') { - local.push( - '-fps_mode', - `${settings.fps_mode}` - ) + if (ffversion === 5) { + if (settings.fps_mode !== 'passthrough') { + local.push('-fps_mode', `${settings.fps_mode}`); + } } if (settings.profile !== 'auto') { @@ -131,6 +136,10 @@ FpsMode.defaultProps = { function Coder(props) { const settings = init(props.settings); + let ffversion = 4; + if (SemverSatisfies(props.skills.ffmpeg.version, '^5.0.0')) { + ffversion = 5; + } const handleChange = (newSettings) => { let automatic = false; @@ -139,7 +148,7 @@ function Coder(props) { automatic = true; } - props.onChange(newSettings, createMapping(newSettings), automatic); + props.onChange(newSettings, createMapping(newSettings, props.skills), automatic); }; const update = (what) => (event) => { @@ -167,9 +176,11 @@ function Coder(props) { - - - + {ffversion === 5 && ( + + + + )} @@ -186,6 +197,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; @@ -199,12 +211,12 @@ function summarize(settings) { return `${name}, ${settings.bitrate} kbit/s, ${settings.fps} FPS, Preset: ${settings.preset}, Profile: ${settings.profile}`; } -function defaults() { +function defaults(skills) { const settings = init({}); return { settings: settings, - mapping: createMapping(settings), + mapping: createMapping(settings, skills), }; } diff --git a/src/misc/coders/Encoders/video/X265.js b/src/misc/coders/Encoders/video/X265.js index eaa3ebe..4169662 100644 --- a/src/misc/coders/Encoders/video/X265.js +++ b/src/misc/coders/Encoders/video/X265.js @@ -1,4 +1,5 @@ import React from 'react'; +import SemverSatisfies from 'semver/functions/satisfies'; import Grid from '@mui/material/Grid'; import MenuItem from '@mui/material/MenuItem'; @@ -23,7 +24,12 @@ function init(initialState) { return state; } -function createMapping(settings) { +function createMapping(settings, skills) { + let ffversion = 4; + if (SemverSatisfies(skills.ffmpeg.version, '^5.0.0')) { + ffversion = 5; + } + const local = [ '-codec:v', 'libx265', @@ -52,11 +58,10 @@ function createMapping(settings) { ); } - if (settings.fps_mode !== 'passthrough') { - local.push( - '-fps_mode', - `${settings.fps_mode}` - ) + if (ffversion === 5) { + if (settings.fps_mode !== 'passthrough') { + local.push('-fps_mode', `${settings.fps_mode}`); + } } if (settings.profile !== 'auto') { @@ -131,6 +136,10 @@ FpsMode.defaultProps = { function Coder(props) { const settings = init(props.settings); + let ffversion = 4; + if (SemverSatisfies(props.skills.ffmpeg.version, '^5.0.0')) { + ffversion = 5; + } const handleChange = (newSettings) => { let automatic = false; @@ -139,7 +148,7 @@ function Coder(props) { automatic = true; } - props.onChange(newSettings, createMapping(newSettings), automatic); + props.onChange(newSettings, createMapping(newSettings, props.skills), automatic); }; const update = (what) => (event) => { @@ -167,9 +176,11 @@ function Coder(props) { - - - + {ffversion === 5 && ( + + + + )} @@ -186,6 +197,7 @@ function Coder(props) { Coder.defaultProps = { stream: {}, settings: {}, + skills: {}, onChange: function (settings, mapping) {}, }; @@ -199,12 +211,12 @@ function summarize(settings) { return `${name}, ${settings.bitrate} kbit/s, ${settings.fps} FPS, Preset: ${settings.preset}, Profile: ${settings.profile}`; } -function defaults() { +function defaults(skills) { const settings = init({}); return { settings: settings, - mapping: createMapping(settings), + mapping: createMapping(settings, skills), }; } diff --git a/src/views/Edit/Profile.js b/src/views/Edit/Profile.js index 02f644c..816acdb 100644 --- a/src/views/Edit/Profile.js +++ b/src/views/Edit/Profile.js @@ -403,8 +403,7 @@ export default function Source(props) { streams={$sources.video.streams} profile={$profile.video} codecs={['copy', 'h264']} - availableEncoders={props.skills.encoders.video} - availableDecoders={props.skills.decoders.video} + skills={props.skills} onChange={handleEncoding('video')} /> @@ -476,7 +475,7 @@ export default function Source(props) { streams={$sources.video.streams} profile={$profile.audio} codecs={['copy', 'aac', 'mp3']} - availableEncoders={props.skills.encoders.audio} + skills={props.skills} onChange={handleEncoding('audio')} /> @@ -553,7 +552,7 @@ export default function Source(props) { streams={$sources.audio.streams} profile={$profile.audio} codecs={['copy', 'aac', 'mp3']} - availableEncoders={props.skills.encoders.audio} + skills={props.skills} onChange={handleEncoding('audio')} /> diff --git a/src/views/Publication/Add.js b/src/views/Publication/Add.js index 71f6991..b6ebab6 100644 --- a/src/views/Publication/Add.js +++ b/src/views/Publication/Add.js @@ -457,8 +457,7 @@ export default function Add(props) { streams={$sources[0].streams} profile={$settings.profiles[0].video} codecs={serviceSkills.codecs.video} - availableEncoders={$skills.encoders.video} - availableDecoders={$skills.decoders.video} + skills={$skills} onChange={handleProcessing('video')} /> @@ -473,8 +472,7 @@ export default function Add(props) { streams={$sources[0].streams} profile={$settings.profiles[0].audio} codecs={serviceSkills.codecs.audio} - availableEncoders={$skills.encoders.audio} - availableDecoders={$skills.decoders.audio} + skills={$skills} onChange={handleProcessing('audio')} /> diff --git a/src/views/Publication/Edit.js b/src/views/Publication/Edit.js index 9281be0..7481b54 100644 --- a/src/views/Publication/Edit.js +++ b/src/views/Publication/Edit.js @@ -496,8 +496,7 @@ export default function Edit(props) { streams={$sources[0].streams} profile={$settings.profiles[0].video} codecs={$serviceSkills.codecs.video} - availableEncoders={$skills.encoders.video} - availableDecoders={$skills.decoders.video} + skills={$skills} onChange={handleEncoding('video')} /> @@ -512,8 +511,7 @@ export default function Edit(props) { streams={$sources[0].streams} profile={$settings.profiles[0].audio} codecs={$serviceSkills.codecs.audio} - availableEncoders={$skills.encoders.audio} - availableDecoders={$skills.decoders.audio} + skills={$skills} onChange={handleEncoding('audio')} />