From 17eafa8872950ad5942bfcc0deb80bbe931acdb0 Mon Sep 17 00:00:00 2001 From: matty Date: Sun, 14 Apr 2024 14:39:10 -0400 Subject: [PATCH] add basic settings for hevc_nvenc --- dist/main.js | 152 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 115 insertions(+), 37 deletions(-) diff --git a/dist/main.js b/dist/main.js index 2a32571..70cab64 100644 --- a/dist/main.js +++ b/dist/main.js @@ -5,7 +5,9 @@ let logger; let transcodingManager; const DEFAULT_HARDWARE_DECODE = false; const DEFAULT_VOD_QUALITY = "p7"; +const DEFAULT_HEVC_PROFILE = "main10"; const DEFAULT_LIVE_QUALITY = "hq"; +const DEFAULT_HEVC_ENABLED = false; const DEFAULT_BITRATES = new Map([ [0, 64 * 1000], [144, 320 * 1000], @@ -20,6 +22,8 @@ let pluginSettings = { hardwareDecode: DEFAULT_HARDWARE_DECODE, vodQuality: DEFAULT_VOD_QUALITY, liveQuality: DEFAULT_LIVE_QUALITY, + hevcEnabled: DEFAULT_HEVC_ENABLED, + hevcProfile: DEFAULT_HEVC_PROFILE, baseBitrate: new Map(DEFAULT_BITRATES) }; let latestStreamNum = 9999; @@ -42,6 +46,14 @@ async function register({ settingsManager, peertubeHelpers, transcodingManager: default: DEFAULT_HARDWARE_DECODE, private: false }); + registerSetting({ + name: 'hevc-encode', + label: 'Enable H265 NVENC', + type: 'input-checkbox', + descriptionHTML: 'Enables H265 NVENC (experimental)', + default: DEFAULT_HEVC_ENABLED, + private: false + }); registerSetting({ name: 'vod-quality', label: 'VOD Quality', @@ -59,6 +71,19 @@ async function register({ settingsManager, peertubeHelpers, transcodingManager: default: DEFAULT_VOD_QUALITY.toString(), private: false }); + registerSetting({ + name: 'hevc-profile', + label: 'HEVC Profile', + type: 'select', + options: [ + { label: 'main', value: 'main' }, + { label: 'main10 (default)', value: 'main10' }, + { label: 'rext', value: 'rext' } + ], + descriptionHTML: 'Set the HEVC profile', + default: DEFAULT_VOD_QUALITY.toString(), + private: false + }); registerSetting({ name: 'live-quality', label: 'Live Quality', @@ -106,6 +131,8 @@ async function loadSettings(settingsManager) { pluginSettings.hardwareDecode = await settingsManager.getSetting('hardware-decode') == "true"; pluginSettings.vodQuality = parseInt(await settingsManager.getSetting('vod-quality')) || DEFAULT_VOD_QUALITY; pluginSettings.liveQuality = parseInt(await settingsManager.getSetting('live-quality')) || DEFAULT_LIVE_QUALITY; + pluginSettings.hevcProfile = parseInt(await settingsManager.getSetting('hevc-profile')) || DEFAULT_HEVC_PROFILE; + pluginSettings.hevcEnabled = parseInt(await settingsManager.getSetting('hevc-encode')) || DEFAULT_HEVC_ENABLED; for (const [resolution, bitrate] of DEFAULT_BITRATES) { const key = `base-bitrate-${resolution}`; const storedValue = await settingsManager.getSetting(key); @@ -115,6 +142,8 @@ async function loadSettings(settingsManager) { logger.info(`Hardware decode: ${pluginSettings.hardwareDecode}`); logger.info(`VOD Quality: ${pluginSettings.vodQuality}`); logger.info(`Live Quality: ${pluginSettings.liveQuality}`); + logger.info(`HEVC encode: ${pluginSettings.hevcEnabled}`); + logger.info(`HEVC profile: ${pluginSettings.hevcProfile}`); } function printResolution(resolution) { switch (resolution) { @@ -150,29 +179,53 @@ async function vodBuilder(params) { // let targetBitrate = inputBitrate; let shouldInitVaapi = (streamNum == undefined || streamNum <= latestStreamNum); if (targetBitrate > inputBitrate) { - targetBitrate = inputBitrate; + targetBitrate = inputBitrate; } logger.info(`Building encoder options, received ${JSON.stringify(params)}`); if (shouldInitVaapi && streamNum != undefined) { latestStreamNum = streamNum; } - let options = { - scaleFilter: { - name: 'scale' - }, - inputOptions: shouldInitVaapi ? buildInitOptions() : [], - outputOptions: [ - `-preset ${pluginSettings.vodQuality}`, - `-b:v${streamSuffix} ${targetBitrate}`, - //`-b:v${streamSuffix} 0`, - `-bufsize ${targetBitrate * 2}`, - `-profile:v${streamSuffix} high`, - `-cq 25`, - //`-rc vbr`, - //`-c:v${streamSuffix} h264_nvenc`, - `-bf 4` - ] - }; + let options = {}; + if (pluginSettings.hevcEnabled) { + + options = { + scaleFilter: { + name: 'scale' + }, + inputOptions: shouldInitVaapi ? buildInitOptions() : [], + outputOptions: [ + `-preset ${pluginSettings.hevcQuality}`, + `-b:v${streamSuffix} ${targetBitrate}`, + //`-b:v${streamSuffix} 0`, + `-bufsize ${targetBitrate * 2}`, + `-profile:v${streamSuffix} ${pluginSettings.hevcProfile}`, + //`-cq 25`, + //`-rc vbr`, + `-c:v${streamSuffix} hevc_nvenc`, + //`-bf 4` + ] + }; + + } else { + + options = { + scaleFilter: { + name: 'scale' + }, + inputOptions: shouldInitVaapi ? buildInitOptions() : [], + outputOptions: [ + `-preset ${pluginSettings.vodQuality}`, + `-b:v${streamSuffix} ${targetBitrate}`, + //`-b:v${streamSuffix} 0`, + `-bufsize ${targetBitrate * 2}`, + `-profile:v${streamSuffix} high`, + `-cq 25`, + //`-rc vbr`, + //`-c:v${streamSuffix} h264_nvenc`, + `-bf 4` + ] + }; + } logger.info(`EncoderOptions: ${JSON.stringify(options)}`); return options; } @@ -189,25 +242,50 @@ async function liveBuilder(params) { if (shouldInitVaapi && streamNum != undefined) { latestStreamNum = streamNum; } - const options = { - scaleFilter: { - name: 'scale' - }, - inputOptions: shouldInitVaapi ? buildInitOptions() : [], - outputOptions: [ - `-tune ${pluginSettings.liveQuality}`, - `-r:v${streamSuffix} ${fps}`, - `-profile:v${streamSuffix} high`, - //`-c:v${streamSuffix} h264_nvenc`, - `-cq 25`, - `-g:v${streamSuffix} ${fps * 2}`, - `-b:v${streamSuffix} ${targetBitrate}`, - //`-b:v${streamSuffix} 0`, - `-bufsize ${targetBitrate * 2}`, - //`-rc vbr`, - `-bf 4` - ] - }; + + let options = {}; + + if (pluginSettings.hevcEnabled) { + options = { + scaleFilter: { + name: 'scale' + }, + inputOptions: shouldInitVaapi ? buildInitOptions() : [], + outputOptions: [ + `-tune ${pluginSettings.liveQuality}`, + `-r:v${streamSuffix} ${fps}`, + `-profile:v${streamSuffix} ${pluginSettings.hevcProfile}`, + `-c:v${streamSuffix} hevc_nvenc`, + //`-cq 25`, + `-g:v${streamSuffix} ${fps * 2}`, + `-b:v${streamSuffix} ${targetBitrate}`, + //`-b:v${streamSuffix} 0`, + `-bufsize ${targetBitrate * 2}`, + //`-rc vbr`, + // `-bf 4` + ] + }; + } else { + + options = { + scaleFilter: { + name: 'scale' + }, + inputOptions: shouldInitVaapi ? buildInitOptions() : [], + outputOptions: [ + `-tune ${pluginSettings.liveQuality}`, + `-r:v${streamSuffix} ${fps}`, + `-profile:v${streamSuffix} high`, + `-cq 25`, + `-g:v${streamSuffix} ${fps * 2}`, + `-b:v${streamSuffix} ${targetBitrate}`, + `-bufsize ${targetBitrate * 2}`, + //`-rc vbr`, + `-bf 4` + ] + }; + + } logger.info(`EncoderOptions: ${JSON.stringify(options)}`); return options; }