From f422b0b45e338b2676e52bce4a6e21c8296fe4fe Mon Sep 17 00:00:00 2001 From: Ingo Oppermann Date: Thu, 14 Jul 2022 19:04:03 +0200 Subject: [PATCH] Remove resample filter from audio decoders, add filters to summary --- src/misc/coders/Encoders/audio/AAC.js | 41 +-------------- .../coders/Encoders/audio/AACAudioToolbox.js | 41 +-------------- src/misc/coders/Encoders/audio/Libopus.js | 41 +-------------- src/misc/coders/Encoders/audio/Libvorbis.js | 41 +-------------- src/misc/coders/Encoders/audio/MP3.js | 41 +-------------- src/misc/coders/Encoders/audio/Opus.js | 30 +---------- src/misc/coders/Encoders/audio/Vorbis.js | 41 +-------------- src/misc/filters/audio/Loudnorm.js | 2 +- src/misc/filters/audio/Resample.js | 2 +- src/misc/filters/audio/Volume.js | 2 +- src/misc/filters/video/HFlip.js | 2 +- src/misc/filters/video/Transpose.js | 2 +- src/misc/filters/video/VFlip.js | 2 +- src/utils/metadata.js | 28 +++++++--- src/version.js | 3 +- src/views/Edit/Summary.js | 52 ++++++++++++++++--- 16 files changed, 89 insertions(+), 282 deletions(-) diff --git a/src/misc/coders/Encoders/audio/AAC.js b/src/misc/coders/Encoders/audio/AAC.js index 4784c7b..98687d5 100644 --- a/src/misc/coders/Encoders/audio/AAC.js +++ b/src/misc/coders/Encoders/audio/AAC.js @@ -7,9 +7,6 @@ import Audio from '../../settings/Audio'; function init(initialState) { const state = { bitrate: '64', - channels: '2', - layout: 'stereo', - sampling: '44100', ...initialState, }; @@ -17,18 +14,7 @@ function init(initialState) { } function createMapping(settings, stream) { - let sampling = settings.sampling; - let layout = settings.layout; - - if (sampling === 'inherit') { - sampling = stream.sampling_hz; - } - - if (layout === 'inherit') { - layout = stream.layout; - } - - const local = ['-codec:a', 'aac', '-b:a', `${settings.bitrate}k`, '-shortest', '-filter:a', `aresample=osr=${sampling}:ocl=${layout}`]; + const local = ['-codec:a', 'aac', '-b:a', `${settings.bitrate}k`, '-shortest']; if (stream.codec === 'aac') { local.push('-bsf:a', 'aac_adtstoasc'); @@ -64,23 +50,6 @@ function Coder(props) { [what]: value, }; - if (what === 'layout') { - let channels = stream.channels; - - switch (value) { - case 'mono': - channels = 1; - break; - case 'stereo': - channels = 2; - break; - default: - break; - } - - newSettings.channels = channels; - } - handleChange(newSettings); }; @@ -94,12 +63,6 @@ function Coder(props) { - - - - - - ); } @@ -117,7 +80,7 @@ const type = 'audio'; const hwaccel = false; function summarize(settings) { - return `${name}, ${settings.bitrate} kbit/s, ${settings.layout}, ${settings.sampling}Hz`; + return `${name}, ${settings.bitrate} kbit/s`; } function defaults(stream) { diff --git a/src/misc/coders/Encoders/audio/AACAudioToolbox.js b/src/misc/coders/Encoders/audio/AACAudioToolbox.js index 94fe217..63e4c90 100644 --- a/src/misc/coders/Encoders/audio/AACAudioToolbox.js +++ b/src/misc/coders/Encoders/audio/AACAudioToolbox.js @@ -7,9 +7,6 @@ import Audio from '../../settings/Audio'; function init(initialState) { const state = { bitrate: '64', - channels: '2', - layout: 'stereo', - sampling: '44100', ...initialState, }; @@ -17,18 +14,7 @@ function init(initialState) { } function createMapping(settings, stream) { - let sampling = settings.sampling; - let layout = settings.layout; - - if (sampling === 'inherit') { - sampling = stream.sampling_hz; - } - - if (layout === 'inherit') { - layout = stream.layout; - } - - const local = ['-codec:a', 'aac_at', '-b:a', `${settings.bitrate}k`, '-shortest', '-filter:a', `aresample=osr=${sampling}:ocl=${layout}`]; + const local = ['-codec:a', 'aac_at', '-b:a', `${settings.bitrate}k`, '-shortest']; if (stream.codec === 'aac') { local.push('-bsf:a', 'aac_adtstoasc'); @@ -64,23 +50,6 @@ function Coder(props) { [what]: value, }; - if (what === 'layout') { - let channels = stream.channels; - - switch (value) { - case 'mono': - channels = 1; - break; - case 'stereo': - channels = 2; - break; - default: - break; - } - - newSettings.channels = channels; - } - handleChange(newSettings); }; @@ -94,12 +63,6 @@ function Coder(props) { - - - - - - ); } @@ -117,7 +80,7 @@ const type = 'audio'; const hwaccel = true; function summarize(settings) { - return `${name}, ${settings.bitrate} kbit/s, ${settings.layout}, ${settings.sampling}Hz`; + return `${name}, ${settings.bitrate} kbit/s`; } function defaults(stream) { diff --git a/src/misc/coders/Encoders/audio/Libopus.js b/src/misc/coders/Encoders/audio/Libopus.js index a7bd2ce..6ab9b25 100644 --- a/src/misc/coders/Encoders/audio/Libopus.js +++ b/src/misc/coders/Encoders/audio/Libopus.js @@ -7,9 +7,6 @@ import Audio from '../../settings/Audio'; function init(initialState) { const state = { bitrate: '64', - channels: '2', - layout: 'stereo', - sampling: '44100', ...initialState, }; @@ -17,18 +14,7 @@ function init(initialState) { } function createMapping(settings, stream) { - let sampling = settings.sampling; - let layout = settings.layout; - - if (sampling === 'inherit') { - sampling = stream.sampling_hz; - } - - if (layout === 'inherit') { - layout = stream.layout; - } - - const local = ['-codec:a', 'libopus', '-b:a', `${settings.bitrate}k`, '-shortest', '-filter:a', `aresample=osr=${sampling}:ocl=${layout}`]; + const local = ['-codec:a', 'libopus', '-b:a', `${settings.bitrate}k`, '-shortest']; const mapping = { global: [], @@ -60,23 +46,6 @@ function Coder(props) { [what]: value, }; - if (what === 'layout') { - let channels = stream.channels; - - switch (value) { - case 'mono': - channels = 1; - break; - case 'stereo': - channels = 2; - break; - default: - break; - } - - newSettings.channels = channels; - } - handleChange(newSettings); }; @@ -90,12 +59,6 @@ function Coder(props) { - - - - - - ); } @@ -113,7 +76,7 @@ const type = 'audio'; const hwaccel = false; function summarize(settings) { - return `${name}, ${settings.bitrate} kbit/s, ${settings.layout}, ${settings.sampling}Hz`; + return `${name}, ${settings.bitrate} kbit/s`; } function defaults(stream) { diff --git a/src/misc/coders/Encoders/audio/Libvorbis.js b/src/misc/coders/Encoders/audio/Libvorbis.js index bb7aa4b..42e3b46 100644 --- a/src/misc/coders/Encoders/audio/Libvorbis.js +++ b/src/misc/coders/Encoders/audio/Libvorbis.js @@ -7,9 +7,6 @@ import Audio from '../../settings/Audio'; function init(initialState) { const state = { bitrate: '64', - channels: '2', - layout: 'stereo', - sampling: '44100', ...initialState, }; @@ -17,18 +14,7 @@ function init(initialState) { } function createMapping(settings, stream) { - let sampling = settings.sampling; - let layout = settings.layout; - - if (sampling === 'inherit') { - sampling = stream.sampling_hz; - } - - if (layout === 'inherit') { - layout = stream.layout; - } - - const local = ['-codec:a', 'libvorbis', '-b:a', `${settings.bitrate}k`, '-shortest', '-filter:a', `aresample=osr=${sampling}:ocl=${layout}`]; + const local = ['-codec:a', 'libvorbis', '-b:a', `${settings.bitrate}k`, '-shortest']; const mapping = { global: [], @@ -60,23 +46,6 @@ function Coder(props) { [what]: value, }; - if (what === 'layout') { - let channels = stream.channels; - - switch (value) { - case 'mono': - channels = 1; - break; - case 'stereo': - channels = 2; - break; - default: - break; - } - - newSettings.channels = channels; - } - handleChange(newSettings); }; @@ -90,12 +59,6 @@ function Coder(props) { - - - - - - ); } @@ -113,7 +76,7 @@ const type = 'audio'; const hwaccel = false; function summarize(settings) { - return `${name}, ${settings.bitrate} kbit/s, ${settings.layout}, ${settings.sampling}Hz`; + return `${name}, ${settings.bitrate} kbit/s`; } function defaults(stream) { diff --git a/src/misc/coders/Encoders/audio/MP3.js b/src/misc/coders/Encoders/audio/MP3.js index 0e7fc49..5543eef 100644 --- a/src/misc/coders/Encoders/audio/MP3.js +++ b/src/misc/coders/Encoders/audio/MP3.js @@ -7,9 +7,6 @@ import Audio from '../../settings/Audio'; function init(initialState) { const state = { bitrate: '64', - channels: '2', - layout: 'stereo', - sampling: '44100', ...initialState, }; @@ -17,19 +14,8 @@ function init(initialState) { } function createMapping(settings, stream) { - let sampling = settings.sampling; - let layout = settings.layout; - - if (sampling === 'inherit') { - sampling = stream.sampling_hz; - } - - if (layout === 'inherit') { - layout = stream.layout; - } - // '-qscale:a', '6' - const local = ['-codec:a', 'libmp3lame', '-b:a', `${settings.bitrate}k`, '-shortest', '-filter:a', `aresample=osr=${sampling}:ocl=${layout}`]; + const local = ['-codec:a', 'libmp3lame', '-b:a', `${settings.bitrate}k`, '-shortest']; const mapping = { global: [], @@ -61,23 +47,6 @@ function Coder(props) { [what]: value, }; - if (what === 'layout') { - let channels = stream.channels; - - switch (value) { - case 'mono': - channels = 1; - break; - case 'stereo': - channels = 2; - break; - default: - break; - } - - newSettings.channels = channels; - } - handleChange(newSettings); }; @@ -91,12 +60,6 @@ function Coder(props) { - - - - - - ); } @@ -114,7 +77,7 @@ const type = 'audio'; const hwaccel = false; function summarize(settings) { - return `${name}, ${settings.bitrate} kbit/s, ${settings.layout}, ${settings.sampling}Hz`; + return `${name}, ${settings.bitrate} kbit/s`; } function defaults(stream) { diff --git a/src/misc/coders/Encoders/audio/Opus.js b/src/misc/coders/Encoders/audio/Opus.js index c5fe8a6..863daef 100644 --- a/src/misc/coders/Encoders/audio/Opus.js +++ b/src/misc/coders/Encoders/audio/Opus.js @@ -13,9 +13,6 @@ function init(initialState) { const state = { bitrate: '64', delay: 'auto', - channels: '2', - layout: 'stereo', - sampling: '44100', ...initialState, }; @@ -34,7 +31,7 @@ function createMapping(settings, stream) { layout = stream.layout; } - const local = ['-codec:a', 'opus', '-b:a', `${settings.bitrate}k`, '-vbr', 'on', '-shortest', '-filter:a', `aresample=osr=${sampling}:ocl=${layout}`]; + const local = ['-codec:a', 'opus', '-b:a', `${settings.bitrate}k`, '-vbr', 'on', '-shortest']; if (settings.delay !== 'auto') { local.push('opus_delay', settings.delay); @@ -113,23 +110,6 @@ function Coder(props) { [what]: value, }; - if (what === 'layout') { - let channels = stream.channels; - - switch (value) { - case 'mono': - channels = 1; - break; - case 'stereo': - channels = 2; - break; - default: - break; - } - - newSettings.channels = channels; - } - handleChange(newSettings); }; @@ -146,12 +126,6 @@ function Coder(props) { - - - - - - ); } @@ -169,7 +143,7 @@ const type = 'audio'; const hwaccel = false; function summarize(settings) { - return `${name}, ${settings.bitrate} kbit/s, ${settings.layout}, ${settings.sampling}Hz`; + return `${name}, ${settings.bitrate} kbit/s`; } function defaults(stream) { diff --git a/src/misc/coders/Encoders/audio/Vorbis.js b/src/misc/coders/Encoders/audio/Vorbis.js index 462a508..872dd83 100644 --- a/src/misc/coders/Encoders/audio/Vorbis.js +++ b/src/misc/coders/Encoders/audio/Vorbis.js @@ -7,9 +7,6 @@ import Audio from '../../settings/Audio'; function init(initialState) { const state = { bitrate: '64', - channels: '2', - layout: 'stereo', - sampling: '44100', ...initialState, }; @@ -17,18 +14,7 @@ function init(initialState) { } function createMapping(settings, stream) { - let sampling = settings.sampling; - let layout = settings.layout; - - if (sampling === 'inherit') { - sampling = stream.sampling_hz; - } - - if (layout === 'inherit') { - layout = stream.layout; - } - - const local = ['-codec:a', 'vorbis', '-b:a', `${settings.bitrate}k`, '-qscale:a', '3', '-shortest', '-filter:a', `aresample=osr=${sampling}:ocl=${layout}`]; + const local = ['-codec:a', 'vorbis', '-b:a', `${settings.bitrate}k`, '-qscale:a', '3', '-shortest']; const mapping = { global: [], @@ -60,23 +46,6 @@ function Coder(props) { [what]: value, }; - if (what === 'layout') { - let channels = stream.channels; - - switch (value) { - case 'mono': - channels = 1; - break; - case 'stereo': - channels = 2; - break; - default: - break; - } - - newSettings.channels = channels; - } - handleChange(newSettings); }; @@ -90,12 +59,6 @@ function Coder(props) { - - - - - - ); } @@ -113,7 +76,7 @@ const type = 'audio'; const hwaccel = false; function summarize(settings) { - return `${name}, ${settings.bitrate} kbit/s, ${settings.layout}, ${settings.sampling}Hz`; + return `${name}, ${settings.bitrate} kbit/s`; } function defaults(stream) { diff --git a/src/misc/filters/audio/Loudnorm.js b/src/misc/filters/audio/Loudnorm.js index 7b0ec22..319bbf6 100644 --- a/src/misc/filters/audio/Loudnorm.js +++ b/src/misc/filters/audio/Loudnorm.js @@ -69,7 +69,7 @@ function Filter(props) { Filter.defaultProps = { settings: {}, - onChange: function (settings, mapping) {}, + onChange: function (settings, graph, automatic) {}, }; const filter = 'loudnorm'; diff --git a/src/misc/filters/audio/Resample.js b/src/misc/filters/audio/Resample.js index 5cd7e1b..f9ad447 100644 --- a/src/misc/filters/audio/Resample.js +++ b/src/misc/filters/audio/Resample.js @@ -200,7 +200,7 @@ function Filter(props) { Filter.defaultProps = { settings: {}, - onChange: function (settings, mapping) {}, + onChange: function (settings, graph, automatic) {}, }; const filter = 'aresample'; diff --git a/src/misc/filters/audio/Volume.js b/src/misc/filters/audio/Volume.js index 8aeb750..758b129 100644 --- a/src/misc/filters/audio/Volume.js +++ b/src/misc/filters/audio/Volume.js @@ -126,7 +126,7 @@ function Filter(props) { Filter.defaultProps = { settings: {}, - onChange: function (settings, mapping) {}, + onChange: function (settings, graph, automatic) {}, }; const filter = 'volume'; diff --git a/src/misc/filters/video/HFlip.js b/src/misc/filters/video/HFlip.js index 52d8ff2..0bf8147 100644 --- a/src/misc/filters/video/HFlip.js +++ b/src/misc/filters/video/HFlip.js @@ -67,7 +67,7 @@ function Filter(props) { Filter.defaultProps = { settings: {}, - onChange: function (settings, mapping) {}, + onChange: function (settings, graph, automatic) {}, }; const filter = 'hflip'; diff --git a/src/misc/filters/video/Transpose.js b/src/misc/filters/video/Transpose.js index 80eb338..474e1fc 100644 --- a/src/misc/filters/video/Transpose.js +++ b/src/misc/filters/video/Transpose.js @@ -95,7 +95,7 @@ Filter.defaultProps = { }; const filter = 'transpose'; -const name = 'Filter (transpose)'; +const name = 'Transpose'; const type = 'video'; const hwaccel = false; diff --git a/src/misc/filters/video/VFlip.js b/src/misc/filters/video/VFlip.js index 9c76f94..a523dfd 100644 --- a/src/misc/filters/video/VFlip.js +++ b/src/misc/filters/video/VFlip.js @@ -67,7 +67,7 @@ function Filter(props) { Filter.defaultProps = { settings: {}, - onChange: function (settings, mapping) {}, + onChange: function (settings, graph, automatic) {}, }; const filter = 'vflip'; diff --git a/src/utils/metadata.js b/src/utils/metadata.js index 3bfda79..1f819ea 100644 --- a/src/utils/metadata.js +++ b/src/utils/metadata.js @@ -3,7 +3,7 @@ Ingest Metadata Layout: data = { - version: 1, + version: "1.2.0", meta: { name: 'Livestream 1', description: 'Live from earth. Powered by datarhei/restreamer.', @@ -99,12 +99,24 @@ data = { '-codec:a', 'aac', '-b:a', '64k', '-bsf:a', 'aac_adtstoasc', - '-shortest', - '-af', 'aresample=osr=44100:ocl=2' + '-shortest' ] } }, decoder: null, + filter: { + graph: 'aresample=osr=44100:ocl=stereo', + settings: { + aresample: { + graph: 'aresample=osr=44100:ocl=stereo', + settings: { + channels: 2, + layout: 'stereo', + sampling: 44100 + } + } + } + }, }, video: { source: 0, @@ -124,6 +136,7 @@ data = { } }, decoder: null, + filter: null, }, "or": {}, "video": { @@ -210,7 +223,7 @@ data = { Egress Metadata Layout: data = { - version: 1, + version: "1.2.0", name: "foobar", control: { process: { @@ -232,14 +245,15 @@ data = { */ import * as Coders from '../misc/coders/Encoders'; +import * as version from '../version'; const defaultMetadata = { - version: 1, + version: version.Version, playersite: {}, }; const defaultIngestMetadata = { - version: 1, + version: version.Version, sources: [], profiles: [{}], streams: [], @@ -282,7 +296,7 @@ const defaultIngestMetadata = { }; const defaultEgressMetadata = { - version: 1, + version: version.Version, name: '', control: { process: { diff --git a/src/version.js b/src/version.js index 1dedd3d..adccb4b 100644 --- a/src/version.js +++ b/src/version.js @@ -3,5 +3,6 @@ import { name, version, bundle } from '../package.json'; const Core = '^16.9.0'; const FFmpeg = '^4.1.0 || ^5.0.0'; const UI = bundle ? bundle : name + ' v' + version; +const Version = version; -export { Core, FFmpeg, UI }; +export { Core, FFmpeg, UI, Version }; diff --git a/src/views/Edit/Summary.js b/src/views/Edit/Summary.js index c9c9fd5..b910421 100644 --- a/src/views/Edit/Summary.js +++ b/src/views/Edit/Summary.js @@ -6,6 +6,7 @@ import Typography from '@mui/material/Typography'; import Grid from '@mui/material/Grid'; import * as Coders from '../../misc/coders/Encoders'; +import * as Filters from '../../misc/filters'; import BoxText from '../../misc/BoxText'; import Sources from './Sources'; @@ -28,6 +29,7 @@ export default function Summary(props) { let name = i18n._(t`No source selected`); let address = ''; let encodingSummary = i18n._(t`None`); + let filterSummary = []; let showEncoding = false; @@ -51,6 +53,30 @@ export default function Summary(props) { if (coder !== null) { encodingSummary = coder.summarize(profile.encoder.settings); } + + if (profile.filter.graph.length !== 0) { + let filters = null; + + if (props.type === 'video') { + filters = Filters.Video; + } else if (props.type === 'audio') { + filters = Filters.Audio; + } + + for (let filter of filters.List()) { + const name = filter.filter; + + if (!(name in profile.filter.settings)) { + continue; + } + + if (profile.filter.settings[name].graph.length === 0) { + continue; + } + + filterSummary.push(filter.summarize(profile.filter.settings[name].settings)); + } + } } return ( @@ -61,12 +87,26 @@ export default function Summary(props) { {address} {showEncoding === true && ( - - - Encoding - - {encodingSummary} - + + + + Encoding + + {encodingSummary} + + + + Filter + + {filterSummary.length ? ( + {filterSummary.join(', ')} + ) : ( + + None + + )} + + )}