;;; SPDX-License-Identifier: GPL-3.0-or-later ;;; Copyright © 2022 Jelle Licht ;;; Copyright © 2024 Oleg Pykhalov (define-module (nongnu packages video) #:use-module (gnu packages avahi) #:use-module (gnu packages base) #:use-module (gnu packages bash) #:use-module (gnu packages compression) #:use-module (gnu packages elf) #:use-module (gnu packages gawk) #:use-module (gnu packages gcc) #:use-module (gnu packages pkg-config) #:use-module (gnu packages video) #:use-module (guix build utils) #:use-module (guix build-system cmake) #:use-module (guix build-system trivial) #:use-module (guix gexp) #:use-module (guix git-download) #:use-module (guix packages) #:use-module (guix utils) #:use-module ((guix licenses) #:prefix license:) #:use-module ((nonguix licenses) #:prefix nonguix-license:) #:use-module (nongnu packages chromium)) (define-public gmmlib (package (name "gmmlib") (version "22.3.19") (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/intel/gmmlib") (commit (string-append "intel-gmmlib-" version)))) (file-name (git-file-name name version)) (sha256 (base32 "0p3wp6xcvpb4jzw4fsf6554qy91iblmq9y50ph3iy29m19q6nznb")))) (build-system cmake-build-system) (arguments ;; Tests are run as part of the normal build step '(#:tests? #f)) (home-page "https://github.com/intel/gmmlib") (synopsis "Intel Graphics Memory Management Library") (description "This package provides device specific and buffer management for the Intel Graphics Compute Runtime for OpenCL and the Intel Media Driver for VAAPI.") (license license:expat))) (define-public intel-media-driver (package (name "intel-media-driver") (version "24.1.5") (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/intel/media-driver") (commit (string-append "intel-media-" version)))) (file-name (git-file-name name version)) (sha256 (base32 "1jm4imld48scj0j499wq5zbdjv4gg7hg2sawljqnjvy09dmp09bs")))) (build-system cmake-build-system) (inputs (list libva gmmlib)) (native-inputs (list pkg-config)) (arguments (list #:tests? #f ;Tests are run as part of the normal build step #:configure-flags #~(list "-DENABLE_NONFREE_KERNELS=OFF" (string-append "-DLIBVA_DRIVERS_PATH=" #$output "/lib/dri")))) ;; XXX Because of , we need to add ;; this to all VA-API back ends instead of once to libva. (native-search-paths (list (search-path-specification (variable "LIBVA_DRIVERS_PATH") (files '("lib/dri"))))) (supported-systems '("i686-linux" "x86_64-linux")) (home-page "https://github.com/intel/media-driver") (synopsis "Intel Media Driver for VAAPI") (description "This package provides a VA-API user mode driver supporting hardware accelerated decoding, encoding, and video post processing for the GEN based graphics hardware.") (license (list license:expat license:bsd-3)))) (define-public intel-media-driver/nonfree (package (inherit intel-media-driver) (name "intel-media-driver-nonfree") (arguments (substitute-keyword-arguments (package-arguments intel-media-driver) ((#:configure-flags flags #~'()) #~(cons "-DENABLE_NONFREE_KERNELS=ON" (delete "-DENABLE_NONFREE_KERNELS=OFF" #$flags))))) (synopsis (string-append (package-synopsis intel-media-driver) " with nonfree kernels")) (description (string-append (package-description intel-media-driver) " This build of intel-media-driver includes nonfree blobs to fully enable the video decode capabilities of supported Intel GPUs.")))) (define-public obs-with-cef (package (inherit obs) (name "obs-with-cef") (inputs (append (package-inputs obs) `(("chromium-embedded-framework" ,chromium-embedded-framework)))) (arguments (substitute-keyword-arguments (package-arguments obs) ((#:configure-flags flags) #~(append #$flags '("-DBUILD_BROWSER=ON" "-DCEF_ROOT_DIR=../source/cef"))) ((#:phases phases) #~(modify-phases #$phases (add-before 'configure 'add-cef (lambda* (#:key inputs #:allow-other-keys) (let ((chromium-embedded-framework #$(this-package-input "chromium-embedded-framework"))) (mkdir-p "cef/Release") (mkdir-p "cef/Resources") (for-each (lambda (file) (symlink file (string-append "cef/Release/" (basename file))) (symlink file (string-append "cef/Resources/" (basename file)))) (filter (lambda (file) (not (string= (basename (dirname file)) "locales"))) (find-files (string-append chromium-embedded-framework "/share/cef")))) (symlink (string-append chromium-embedded-framework "/lib/libcef.so") "cef/Release/libcef.so") (mkdir-p "cef/libcef_dll_wrapper") (symlink (string-append chromium-embedded-framework "/lib/libcef_dll_wrapper.a") "cef/libcef_dll_wrapper/libcef_dll_wrapper.a") (symlink (string-append chromium-embedded-framework "/include") "cef/include")))) (add-after 'install 'symlink-obs-browser ;; Required for lib/obs-plugins/obs-browser.so file. (lambda* (#:key outputs #:allow-other-keys) (symlink (string-append #$output "/lib/libobs-frontend-api.so.0") (string-append #$output "/lib/obs-plugins/libobs-frontend-api.so.0")) (symlink (string-append #$output "/lib/libobs.so.0") (string-append #$output "/lib/obs-plugins/libobs.so.0")))))))) (description (string-append (package-description obs) " This build of OBS includes embeded Chromium-based browser to enable Browser source.")))) (define-public ndi (package (name "ndi") (version "5.6.1") ;NDI SDK version from Linux/Version.txt file. (source (local-file "/tmp/Install_NDI_SDK_v5_Linux.tar.gz")) (build-system trivial-build-system) (inputs (list bash-minimal tar findutils coreutils gawk gzip tar glibc patchelf `(,gcc "lib") avahi)) (native-inputs `(("source" ,source))) (arguments (list #:modules '((guix build utils)) #:builder #~(begin (use-modules (guix build utils)) (setenv "PATH" (string-append #$(this-package-input "gzip") "/bin" ":" #$(this-package-input "tar") "/bin" ":" #$(this-package-input "avahi") "/bin" ":" #$(this-package-input "bash-minimal") "/bin" ":" #$(this-package-input "gawk") "/bin" ":" #$(this-package-input "findutils") "/bin" ":" #$(this-package-input "tar") "/bin" ":" #$(this-package-input "coreutils") "/bin" ":" #$(this-package-input "patchelf") "/bin")) (invoke "tar" "-xf" #$(this-package-native-input "source")) (system "echo y | bash -x ./Install_NDI_SDK_v5_Linux.sh") ;; Install binaries. (mkdir-p (string-append #$output "/bin")) (for-each (lambda (file) (invoke "patchelf" "--set-interpreter" (string-append #$(this-package-input "glibc") "/lib/ld-linux-x86-64.so.2") (string-append "NDI SDK for Linux/bin/x86_64-linux-gnu/" file)) (copy-file (string-append "NDI SDK for Linux/bin/x86_64-linux-gnu/" file) (string-append #$output "/bin/" file))) '("ndi-benchmark" "ndi-free-audio" "ndi-directory-service")) (invoke "patchelf" "--set-interpreter" (string-append #$(this-package-input "glibc") "/lib/ld-linux-x86-64.so.2") "--set-rpath" (string-append #$(this-package-input "avahi") "/lib") (string-append "NDI SDK for Linux/bin/x86_64-linux-gnu/ndi-record")) (copy-file "NDI SDK for Linux/bin/x86_64-linux-gnu/ndi-record" (string-append #$output "/bin/ndi-record")) ;; Install libraries. (mkdir-p (string-append #$output "/lib")) (for-each (lambda (file) (invoke "patchelf" "--set-rpath" (string-append #$(this-package-input "avahi") "/lib") (string-append "NDI SDK for Linux/lib/x86_64-linux-gnu/" file)) (copy-file (string-append "NDI SDK for Linux/lib/x86_64-linux-gnu/" file) (string-append #$output "/lib/" file))) '("libndi.so.5.6.1")) (with-directory-excursion (string-append #$output "/lib") (for-each (lambda (file) (symlink "libndi.so.5.6.1" file)) '("libndi.so.5" "libndi.so"))) ;; Install misc. (for-each (lambda (directory) (mkdir-p (string-append #$output "/" directory)) (copy-recursively (string-append "NDI SDK for Linux/" directory) (string-append #$output "/" directory))) '("include" "examples")) (mkdir-p (string-append #$output "/doc")) (for-each (lambda (directory) (mkdir-p (string-append #$output "/doc/" directory)) (copy-recursively (string-append "NDI SDK for Linux/" directory) (string-append #$output "/doc/" directory))) '("licenses")) (copy-recursively (string-append "NDI SDK for Linux/documentation") (string-append #$output "/doc"))))) (home-page "https://ndi.video/for-developers/ndi-sdk/") (synopsis "NDI Software Developer Kit") (description "The NDI (Network Device Interface) SDK enables the development of applications that can transmit and receive high-quality video and audio over standard Ethernet networks. Designed for real-time production environments, the NDI SDK provides a simple and efficient API for handling video streaming, discovery of sources, and communication between devices. With support for multiple platforms, including Linux, NDI offers features such as low latency, high bandwidth efficiency, and multi-channel audio support, making it ideal for broadcast, live streaming, and video conferencing applications. Lightweight and easy to integrate, the NDI SDK empowers developers to create powerful multimedia solutions that leverage the full potential of networked audio and video. In order to use NDI SDK version, you need to comply with NewTek's license and download the appropriate Linux tarball from: https://downloads.ndi.tv/SDK/NDI_SDK_Linux/Install_NDI_SDK_v5_Linux.tar.gz Once you have downloaded the file, re-run the installation.") (license (nonguix-license:nonfree "https://downloads.ndi.tv/SDK/NDI_SDK/NDI%20License%20Agreement.pdf"))))