diff --git a/lib/Command/VideoSetup.php b/lib/Command/VideoSetup.php index 32802168..c1783747 100644 --- a/lib/Command/VideoSetup.php +++ b/lib/Command/VideoSetup.php @@ -180,6 +180,10 @@ class VideoSetup extends Command protected function detectFeatures() { + // Reset the current configuration + $this->config->deleteSystemValue('memories.vod.vaapi'); + $this->config->deleteSystemValue('memories.vod.nvenc'); + $this->output->writeln("\nStarting ffmpeg feature detection"); $this->output->writeln('This may take a while. Please be patient'); @@ -203,6 +207,7 @@ class VideoSetup extends Command $this->checkCPU(); $this->checkVAAPI(); + $this->checkNVENC(); } finally { if (file_exists($this->sampleFile)) { unlink($this->sampleFile); @@ -220,11 +225,15 @@ class VideoSetup extends Command protected function checkVAAPI() { + // Reset current configuration + $this->config->deleteSystemValue('memories.vod.vaapi'); + $this->config->deleteSystemValue('memories.vod.vaapi.low_power'); + // Check for VAAPI $this->output->write("\nChecking for VAAPI acceleration (/dev/dri/renderD128) ... "); if (!file_exists('/dev/dri/renderD128')) { $this->output->writeln('NOT FOUND'); - $this->config->setSystemValue('memories.vod.vaapi', false); + $this->config->deleteSystemValue('memories.vod.vaapi'); return; } @@ -236,7 +245,7 @@ class VideoSetup extends Command $this->output->writeln('NO'); $this->output->writeln('Current user does not have read permissions on /dev/dri/renderD128'); $this->output->writeln('VAAPI will not work. You may need to add your user to the video/render groups'); - $this->config->setSystemValue('memories.vod.vaapi', false); + $this->config->deleteSystemValue('memories.vod.vaapi'); return; } @@ -255,13 +264,13 @@ class VideoSetup extends Command // Check if passed any test if (!$basic && !$lowPower) { - $this->config->setSystemValue('memories.vod.vaapi', false); + $this->config->deleteSystemValue('memories.vod.vaapi'); return; } // Everything is good - $this->output->writeln('Do you want to enable VAAPI acceleration? [Y/n]'); + $this->output->write('Do you want to enable VAAPI acceleration? [Y/n] '); if ('n' === trim(fgets(fopen('php://stdin', 'r')))) { $this->config->setSystemValue('memories.vod.vaapi', false); $this->output->writeln('VAAPI is now disabled'); @@ -273,6 +282,52 @@ class VideoSetup extends Command } } + protected function checkNVENC() + { + $this->output->writeln("\nChecking for NVIDIA acceleration with NVENC"); + + // Reset the current configuration + $this->config->deleteSystemValue('memories.vod.nvenc.temporal_aq'); + $this->config->deleteSystemValue('memories.vod.nvenc.scale'); + + // Basic test + $this->config->setSystemValue('memories.vod.nvenc', true); + + // Different scaling methods + $this->config->setSystemValue('memories.vod.nvenc.scale', 'npp'); + $withScaleNpp = $this->testResult('NVENC (scale_npp)', true); + $this->config->setSystemValue('memories.vod.nvenc.scale', 'cuda'); + $withScaleCuda = $this->testResult('NVENC (scale_cuda)', true); + + if (!$withScaleNpp && !$withScaleCuda) { + $this->config->deleteSystemValue('memories.vod.nvenc'); + $this->config->deleteSystemValue('memories.vod.nvenc.scale'); + $this->output->writeln('NVENC does not seem to be available'); + + return; + } + if ($withScaleNpp) { + $this->config->setSystemValue('memories.vod.nvenc.scale', 'npp'); + } elseif ($withScaleCuda) { + $this->config->setSystemValue('memories.vod.nvenc.scale', 'cuda'); + } + + // Try with temporal-aq + $this->config->setSystemValue('memories.vod.nvenc.temporal_aq', true); + if (!$this->testResult('NVENC (temporal-aq)', true)) { + $this->config->deleteSystemValue('memories.vod.nvenc.temporal_aq'); + } + + // Good to go + $this->output->write('Do you want to enable NVENC acceleration? [Y/n] '); + if ('n' === trim(fgets(fopen('php://stdin', 'r')))) { + $this->config->setSystemValue('memories.vod.nvenc', false); + $this->output->writeln('NVENC is now disabled'); + } else { + $this->output->writeln('NVENC transcoding is now enabled'); + } + } + protected function test(): void { $url = \OCA\Memories\Controller\VideoController::getGoVodUrl('test', $this->sampleFile, '360p-000001.ts'); @@ -302,7 +357,7 @@ class VideoSetup extends Command } } - private function testResult(string $name): bool + private function testResult(string $name, bool $minor = false): bool { $this->output->write("Testing transcoding with {$name} ... "); @@ -316,8 +371,10 @@ class VideoSetup extends Command $msg = $e->getMessage(); $logFile = $this->logFile; $this->output->writeln('FAIL'); - $this->output->writeln("{$name} transcoding failed with error {$msg}"); - $this->output->writeln("Check the log file of go-vod for more details ({$logFile})"); + if (!$minor) { + $this->output->writeln("{$name} transcoding failed with error {$msg}"); + $this->output->writeln("Check the log file of go-vod for more details ({$logFile})"); + } return false; } diff --git a/lib/Controller/VideoController.php b/lib/Controller/VideoController.php index b284cafb..cf2bba5a 100644 --- a/lib/Controller/VideoController.php +++ b/lib/Controller/VideoController.php @@ -402,6 +402,8 @@ class VideoController extends ApiBase 'vaapiLowPower' => $config->getSystemValue('memories.vod.vaapi.low_power', false), 'nvenc' => $config->getSystemValue('memories.vod.nvenc', false), + 'nvencTemporalAQ' => $config->getSystemValue('memories.vod.nvenc.temporal_aq', false), + 'nvencScale' => $config->getSystemValue('memories.vod.nvenc.scale', 'npp'), ]; // Write config to file diff --git a/scripts/get-exiftool.sh b/scripts/get-exiftool.sh index 768a68cf..4398af08 100755 --- a/scripts/get-exiftool.sh +++ b/scripts/get-exiftool.sh @@ -20,7 +20,7 @@ mv "exiftool-$exifver" exiftool rm -rf *.zip exiftool/t exiftool/html chmod 755 exiftool/exiftool -govod="0.0.26" +govod="0.0.27" echo "Getting go-vod $govod" wget -q "https://github.com/pulsejet/go-vod/releases/download/$govod/go-vod-amd64" wget -q "https://github.com/pulsejet/go-vod/releases/download/$govod/go-vod-aarch64"