diff --git a/flake.nix b/flake.nix index 8fc4b73..3da5acb 100644 --- a/flake.nix +++ b/flake.nix @@ -70,7 +70,7 @@ overlays = [ agenix.overlays.default (import ./overlays/gnome.nix) - (import ./overlays/default.nix) + (import ./overlays/libcamera.nix) ( final: prev: { unstable = import inputs.nixpkgs-unstable { system = final.system; }; diff --git a/hosts/skycam/default.nix b/hosts/skycam/default.nix index bea0112..e8e2a9f 100644 --- a/hosts/skycam/default.nix +++ b/hosts/skycam/default.nix @@ -6,7 +6,10 @@ ../server.nix ]; - raspberry-pi-nix.board = "bcm2711"; + raspberry-pi-nix = { + board = "bcm2711"; + libcamera-overlay.enable = false; + }; networking = { hostId = "731d1660"; @@ -25,9 +28,31 @@ services.openssh.settings.PermitRootLogin = lib.mkForce "prohibit-password"; + systemd.services.ustreamer = { + enable = true; + description = "uStreamer service"; + unitConfig = { + Type = "simple"; + ConditionPathExists = "/sys/bus/i2c/drivers/imx708/10-001a/video4linux"; + }; + serviceConfig = { + ExecStart = ''${pkgs.libcamera}/bin/libcamerify ${pkgs.unstable.ustreamer}/bin/ustreamer \ + --host=0.0.0.0 \ + --resolution=4608x2592 + ''; + DynamicUser = "yes"; + SupplementaryGroups = [ "video" "i2c" ]; + Restart = "always"; + RestartSec = 10; + }; + wantedBy = [ "network-online.target" ]; + confinement.mode = "chroot-only"; + }; + environment.systemPackages = with pkgs; [ git neovim + libcamera libraspberrypi raspberrypi-eeprom v4l-utils diff --git a/overlays/0001-Remove-relative-config-lookups.patch b/overlays/0001-Remove-relative-config-lookups.patch new file mode 100644 index 0000000..61a6e92 --- /dev/null +++ b/overlays/0001-Remove-relative-config-lookups.patch @@ -0,0 +1,142 @@ +From 57128bb78f56cadf9e2dcca5ba4d710c3bd478a7 Mon Sep 17 00:00:00 2001 +From: Jordan Holt +Date: Mon, 5 Aug 2024 21:53:09 +0100 +Subject: [PATCH] Remove relative config lookups + +--- + src/libcamera/ipa_manager.cpp | 16 ---------- + src/libcamera/ipa_proxy.cpp | 48 ++---------------------------- + src/libcamera/pipeline_handler.cpp | 21 ++----------- + 3 files changed, 4 insertions(+), 81 deletions(-) + +diff --git a/src/libcamera/ipa_manager.cpp b/src/libcamera/ipa_manager.cpp +index f4e0b633..6d5bbd05 100644 +--- a/src/libcamera/ipa_manager.cpp ++++ b/src/libcamera/ipa_manager.cpp +@@ -131,22 +131,6 @@ IPAManager::IPAManager() + << "No IPA found in '" << modulePaths << "'"; + } + +- /* +- * When libcamera is used before it is installed, load IPAs from the +- * same build directory as the libcamera library itself. +- */ +- std::string root = utils::libcameraBuildPath(); +- if (!root.empty()) { +- std::string ipaBuildPath = root + "src/ipa"; +- constexpr int maxDepth = 2; +- +- LOG(IPAManager, Info) +- << "libcamera is not installed. Adding '" +- << ipaBuildPath << "' to the IPA search path"; +- +- ipaCount += addDir(ipaBuildPath.c_str(), maxDepth); +- } +- + /* Finally try to load IPAs from the installed system path. */ + ipaCount += addDir(IPA_MODULE_DIR); + +diff --git a/src/libcamera/ipa_proxy.cpp b/src/libcamera/ipa_proxy.cpp +index 69975d8f..cd9284a3 100644 +--- a/src/libcamera/ipa_proxy.cpp ++++ b/src/libcamera/ipa_proxy.cpp +@@ -122,33 +122,11 @@ std::string IPAProxy::configurationFile(const std::string &name, + } + } + +- std::string root = utils::libcameraSourcePath(); +- if (!root.empty()) { +- /* +- * When libcamera is used before it is installed, load +- * configuration files from the source directory. The +- * configuration files are then located in the 'data' +- * subdirectory of the corresponding IPA module. +- */ +- std::string ipaConfDir = root + "src/ipa/" + ipaName + "/data"; +- +- LOG(IPAProxy, Info) +- << "libcamera is not installed. Loading IPA configuration from '" +- << ipaConfDir << "'"; +- +- std::string confPath = ipaConfDir + "/" + name; ++ for (const auto &dir : utils::split(IPA_CONFIG_DIR, ":")) { ++ std::string confPath = dir + "/" + ipaName + "/" + name; + ret = stat(confPath.c_str(), &statbuf); + if (ret == 0 && (statbuf.st_mode & S_IFMT) == S_IFREG) + return confPath; +- +- } else { +- /* Else look in the system locations. */ +- for (const auto &dir : utils::split(IPA_CONFIG_DIR, ":")) { +- std::string confPath = dir + "/" + ipaName + "/" + name; +- ret = stat(confPath.c_str(), &statbuf); +- if (ret == 0 && (statbuf.st_mode & S_IFMT) == S_IFREG) +- return confPath; +- } + } + + if (fallbackName.empty()) { +@@ -197,28 +175,6 @@ std::string IPAProxy::resolvePath(const std::string &file) const + } + } + +- /* +- * When libcamera is used before it is installed, load proxy workers +- * from the same build directory as the libcamera directory itself. +- * This requires identifying the path of the libcamera.so, and +- * referencing a relative path for the proxy workers from that point. +- */ +- std::string root = utils::libcameraBuildPath(); +- if (!root.empty()) { +- std::string ipaProxyDir = root + "src/libcamera/proxy/worker"; +- +- LOG(IPAProxy, Info) +- << "libcamera is not installed. Loading proxy workers from '" +- << ipaProxyDir << "'"; +- +- std::string proxyPath = ipaProxyDir + proxyFile; +- if (!access(proxyPath.c_str(), X_OK)) +- return proxyPath; +- +- return std::string(); +- } +- +- /* Else try finding the exec target from the install directory. */ + std::string proxyPath = std::string(IPA_PROXY_DIR) + proxyFile; + if (!access(proxyPath.c_str(), X_OK)) + return proxyPath; +diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp +index 5ea2ca78..fd8555ca 100644 +--- a/src/libcamera/pipeline_handler.cpp ++++ b/src/libcamera/pipeline_handler.cpp +@@ -561,25 +561,8 @@ std::string PipelineHandler::configurationFile(const std::string &subdir, + struct stat statbuf; + int ret; + +- std::string root = utils::libcameraSourcePath(); +- if (!root.empty()) { +- /* +- * When libcamera is used before it is installed, load +- * configuration files from the source directory. The +- * configuration files are then located in the 'data' +- * subdirectory of the corresponding pipeline handler. +- */ +- std::string confDir = root + "src/libcamera/pipeline/"; +- confPath = confDir + subdir + "/data/" + name; +- +- LOG(Pipeline, Info) +- << "libcamera is not installed. Loading platform configuration file from '" +- << confPath << "'"; +- } else { +- /* Else look in the system locations. */ +- confPath = std::string(LIBCAMERA_DATA_DIR) +- + "/pipeline/" + subdir + '/' + name; +- } ++ confPath = std::string(LIBCAMERA_DATA_DIR) ++ + "/pipeline/" + subdir + '/' + name; + + ret = stat(confPath.c_str(), &statbuf); + if (ret == 0 && (statbuf.st_mode & S_IFMT) == S_IFREG) +-- +2.44.1 + diff --git a/overlays/libcamera.nix b/overlays/libcamera.nix index 4ed9aa3..cdbb7ec 100644 --- a/overlays/libcamera.nix +++ b/overlays/libcamera.nix @@ -1,48 +1,25 @@ -{ libcamera-src -, libpisp-src -, ... -}: final: prev: { - libpisp = final.stdenv.mkDerivation { - name = "libpisp"; - version = "1.0.6"; - src = libpisp-src; - nativeBuildInputs = with final; [ pkg-config meson ninja ]; - buildInputs = with final; [ nlohmann_json boost ]; - # Meson is no longer able to pick up Boost automatically. - # https://github.com/NixOS/nixpkgs/issues/86131 - BOOST_INCLUDEDIR = "${prev.lib.getDev final.boost}/include"; - BOOST_LIBRARYDIR = "${prev.lib.getLib final.boost}/lib"; - }; - libcamera = prev.libcamera.overrideAttrs (old: { - version = "0.2.0"; - src = libcamera-src; - buildInputs = old.buildInputs ++ (with final; [ - libpisp openssl libtiff - (python3.withPackages (ps: with ps; [ - python3-gnutls pybind11 pyyaml ply - ])) - libglibutil gst_all_1.gst-plugins-base - ]); - patches = [ ./0001-Always-installed.patch ]; postPatch = '' - patchShebangs utils/ - patchShebangs src/py/ + patchShebangs utils/ src/py/ ''; - mesonFlags = [ + + patches = [ + ./0001-Remove-relative-config-lookups.patch + ]; + + mesonFlags = old.mesonFlags ++ [ "--buildtype=release" - "-Dpipelines=rpi/vc4,rpi/pisp" - "-Dipas=rpi/vc4,rpi/pisp" - "-Dv4l2=true" + "-Dpipelines=rpi/vc4" + "-Dipas=rpi/vc4" "-Dgstreamer=enabled" "-Dtest=false" - "-Dlc-compliance=disabled" - "-Dcam=disabled" - "-Dqcam=disabled" - "-Ddocumentation=enabled" - "-Dpycamera=enabled" + "-Dcam=enabled" ]; }); + + camera-streamer = prev.callPackage ../pkgs/camera-streamer/package.nix { + libcamera = final.libcamera; + }; }