diff --git a/nongnu/packages/video.scm b/nongnu/packages/video.scm index e5af3a1..c4734cb 100644 --- a/nongnu/packages/video.scm +++ b/nongnu/packages/video.scm @@ -3,15 +3,26 @@ ;;; Copyright © 2024 Oleg Pykhalov (define-module (nongnu packages video) + #:use-module (gnu packages) + #: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 qt) #: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 @@ -156,3 +167,170 @@ video decode capabilities of supported Intel GPUs.")))) (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")))) + +(define-public obs-ndi + (package + (name "obs-ndi") + (version "4.11.1") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/DistroAV/DistroAV") + (commit version))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "1wsb1k0jilcn6gqgpq5kq8hjiwnb6mi2w32fsqgb88iicwj1qa3y")) + (patches (append (search-patches "obs-ndi-hardcode-path.patch"))))) + (build-system cmake-build-system) + (inputs (list ndi obs qtbase-5)) + (arguments + (list + #:tests? #f ;no tests + #:phases + #~(modify-phases %standard-phases + (add-before 'configure 'ndi + (lambda* (#:key inputs #:allow-other-keys) + (let ((ndi #$(this-package-input "ndi"))) + (substitute* "src/obs-ndi.cpp" + (("@NDI@") ndi)) + (delete-file-recursively "lib/ndi") + (symlink (string-append ndi "/include") + "lib/ndi")))) + (add-after 'install 'obs-plugins + (lambda* (#:key outputs #:allow-other-keys) + (mkdir-p (string-append #$output "/lib/obs-plugins")) + (symlink + (string-append #$output + "/obs-plugins/64bit/obs-ndi.so") + (string-append #$output + "/lib/obs-plugins/obs-ndi.so"))))))) + (home-page "https://github.com/DistroAV/DistroAV") + (synopsis "Network Audio/Video in OBS-Studio using NDI technology") + (description "This packages provides a network A/V plugin for OBS Studio. + +Features: +@itemize +@item NDI Source: Receive NDI video and audio in OBS. +@item NDI Output: Transmit OBS video and audio to NDI. +@item NDI Filter (a.k.a. NDI Dedicated Output): Transmit a single OBS source +or scene audio to NDI. +@end itemize\n") + (license license:gpl2))) diff --git a/obs-ndi-hardcode-path.patch b/obs-ndi-hardcode-path.patch new file mode 100644 index 0000000..00daa40 --- /dev/null +++ b/obs-ndi-hardcode-path.patch @@ -0,0 +1,14 @@ +--- a/src/obs-ndi.cpp 1970-01-01 03:00:01.000000000 +0300 ++++ b/src/obs-ndi.cpp 2024-08-04 03:58:33.271766959 +0300 +@@ -229,10 +229,7 @@ + if (!path.isEmpty()) { + locations << path; + } +-#if defined(__linux__) || defined(__APPLE__) +- locations << "/usr/lib"; +- locations << "/usr/local/lib"; +-#endif ++ locations << "@NDI@/lib"; + for (QString location : locations) { + path = QDir::cleanPath( + QDir(location).absoluteFilePath(NDILIB_LIBRARY_NAME));