From e769ba7a8c3fb71e1de7b933ce2586dd7e963740 Mon Sep 17 00:00:00 2001 From: Rami Mouro Date: Mon, 29 Jun 2026 18:58:24 -0600 Subject: [PATCH 1/2] feat(detectors): add Qualcomm Hexagon NPU support (community board) Add a community-supported board build for Qualcomm SoCs with a Hexagon NPU, accelerating TFLite object detection through the QNN TFLite delegate on the Hexagon Tensor Processor (HTP). Supported boards: - IQ9100 (IQ-9075 EVK) - QCS6490 (RB3 Gen 2 Vision Kit / Rubik Pi 3) - detector: new `qualcomm_tfl` plugin loading libQnnTFLiteDelegate.so on the HTP backend, reusing the shared TFLite delegate helpers - docker: `docker/qualcomm` board build (Dockerfile, qualcomm.hcl, qualcomm.mk) producing the arm64 `-qualcomm` image - cdi: per-board Container Device Interface descriptors and an install helper exposing the NPU device nodes and QNN libraries to the container - ci/codeowners: register the qualcomm build target and code owner - docs: installation, hardware, and object detector documentation, using the shared model config dropdown component - i18n: add the Qualcomm detector label and description to the generated en config locale Signed-off-by: Rami Mouro --- .github/workflows/ci.yml | 25 + CODEOWNERS | 1 + docker/qualcomm/Dockerfile | 21 + docker/qualcomm/cdi/cdi-hw-acc-6490.json | 1586 +++++++++++++++++ docker/qualcomm/cdi/cdi-hw-acc-9100.json | 1724 +++++++++++++++++++ docker/qualcomm/cdi/install_cdi.py | 51 + docker/qualcomm/qualcomm.hcl | 27 + docker/qualcomm/qualcomm.mk | 15 + docs/data/object_detectors_models.json | 13 + docs/docs/configuration/object_detectors.md | 19 + docs/docs/frigate/hardware.md | 15 + docs/docs/frigate/installation.md | 112 ++ frigate/detectors/plugins/qualcomm_tfl.py | 48 + web/public/locales/en/config/global.json | 4 + 14 files changed, 3661 insertions(+) create mode 100644 docker/qualcomm/Dockerfile create mode 100644 docker/qualcomm/cdi/cdi-hw-acc-6490.json create mode 100644 docker/qualcomm/cdi/cdi-hw-acc-9100.json create mode 100644 docker/qualcomm/cdi/install_cdi.py create mode 100644 docker/qualcomm/qualcomm.hcl create mode 100644 docker/qualcomm/qualcomm.mk create mode 100644 frigate/detectors/plugins/qualcomm_tfl.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 41080be5d9..84ff16dcdb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -197,6 +197,31 @@ jobs: set: | synaptics.tags=${{ steps.setup.outputs.image-name }}-synaptics *.cache-from=type=gha + qualcomm_build: + runs-on: ubuntu-22.04-arm + name: Qualcomm Build + needs: + - arm64_build + steps: + - name: Check out code + uses: actions/checkout@v6 + with: + persist-credentials: false + - name: Set up QEMU and Buildx + id: setup + uses: ./.github/actions/setup + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Build and push Qualcomm build + uses: docker/bake-action@v7 + with: + source: . + push: true + targets: qualcomm + files: docker/qualcomm/qualcomm.hcl + set: | + qualcomm.tags=${{ steps.setup.outputs.image-name }}-qualcomm + *.cache-from=type=gha # The majority of users running arm64 are rpi users, so the rpi # build should be the primary arm64 image assemble_default_build: diff --git a/CODEOWNERS b/CODEOWNERS index c37041c2c3..b1926d0ec6 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -5,3 +5,4 @@ /docker/rockchip/ @MarcA711 /docker/rocm/ @harakas /docker/hailo8l/ @spanner3003 +/docker/qualcomm/ @ramalamadingdong diff --git a/docker/qualcomm/Dockerfile b/docker/qualcomm/Dockerfile new file mode 100644 index 0000000000..d39ff2913c --- /dev/null +++ b/docker/qualcomm/Dockerfile @@ -0,0 +1,21 @@ +# syntax=docker/dockerfile:1.6 + +# https://askubuntu.com/questions/972516/debian-frontend-environment-variable +ARG DEBIAN_FRONTEND=noninteractive + +# Globally set pip break-system-packages option to avoid having to specify it every time +ARG PIP_BREAK_SYSTEM_PACKAGES=1 + +FROM wheels AS qualcomm-wheels +ARG TARGETARCH + +# No extra wheels needed — ai-edge-litert is already in the base image +# and the QNN delegate library (libQnnTFLiteDelegate.so) is provided +# by the host via CDI bind mounts at runtime. + +FROM deps AS qualcomm-deps +ARG TARGETARCH +ARG PIP_BREAK_SYSTEM_PACKAGES + +WORKDIR /opt/frigate/ +COPY --from=rootfs / / diff --git a/docker/qualcomm/cdi/cdi-hw-acc-6490.json b/docker/qualcomm/cdi/cdi-hw-acc-6490.json new file mode 100644 index 0000000000..1f1adcdd8a --- /dev/null +++ b/docker/qualcomm/cdi/cdi-hw-acc-6490.json @@ -0,0 +1,1586 @@ +{ + "cdiVersion": "0.6.0", + "kind": "qualcomm.com/device", + "devices": [ + { + "name": "cdi-hw-acc", + "containerEdits": { + "env": [ + "XDG_RUNTIME_DIR=/run/user/1000", + "WAYLAND_DISPLAY=wayland-0", + "GST_DEBUG_NO_COLOR=1", + "GST_DEBUG=2", + "GST_PLUGIN_SCANNER=\"/usr/lib/aarch64-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-plugin-scanner\"" + ], + "deviceNodes": [ + { + "path": "/dev/dri/card0" + }, + { + "path": "/dev/dri/renderD128" + }, + { + "path": "/dev/kgsl-3d0" + }, + { + "path": "/dev/video32" + }, + { + "path": "/dev/video33" + }, + { + "path": "/dev/dma_heap/system" + }, + { + "path": "/dev/dma_heap/qcom,system" + }, + { + "path": "/dev/fastrpc-cdsp" + } + ], + "mounts": [ + { + "hostPath": "/run/user/1000", + "containerPath": "/run/user/1000", + "options": [ + "bind" + ] + }, + { + "hostPath": "/tmp/socket/cam_server", + "containerPath": "/tmp/socket/cam_server", + "options": [ + "bind" + ] + }, + { + "hostPath": "/tmp/property-vault.socket", + "containerPath": "/tmp/property-vault.socket", + "options": [ + "bind" + ] + }, + { + "hostPath": "/etc/labels", + "containerPath": "/etc/labels", + "options": [ + "bind" + ] + }, + { + "hostPath": "/etc/media", + "containerPath": "/etc/media", + "options": [ + "bind" + ] + }, + { + "hostPath": "/etc/models", + "containerPath": "/etc/models", + "options": [ + "bind" + ] + }, + { + "hostPath": "/etc/configs", + "containerPath": "/etc/configs", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/meta", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/meta", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/ml", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/ml", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/mlmetaparser", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/mlmetaparser", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/pulseaudio", + "containerPath": "/usr/lib/aarch64-linux-gnu/pulseaudio", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-activate-deactivate-streams-runtime-example", + "containerPath": "/usr/bin/gst-activate-deactivate-streams-runtime-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-add-remove-streams-runtime", + "containerPath": "/usr/bin/gst-add-remove-streams-runtime", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-add-streams-as-bundle-example", + "containerPath": "/usr/bin/gst-add-streams-as-bundle-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-audio-classification", + "containerPath": "/usr/bin/gst-ai-audio-classification", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-classification", + "containerPath": "/usr/bin/gst-ai-classification", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-daisychain-detection-classification", + "containerPath": "/usr/bin/gst-ai-daisychain-detection-classification", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-daisychain-detection-pose", + "containerPath": "/usr/bin/gst-ai-daisychain-detection-pose", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-face-detection", + "containerPath": "/usr/bin/gst-ai-face-detection", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-face-recognition", + "containerPath": "/usr/bin/gst-ai-face-recognition", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-metadata-parser-example", + "containerPath": "/usr/bin/gst-ai-metadata-parser-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-monodepth", + "containerPath": "/usr/bin/gst-ai-monodepth", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-multi-input-output-object-detection", + "containerPath": "/usr/bin/gst-ai-multi-input-output-object-detection", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-multistream-batch-inference", + "containerPath": "/usr/bin/gst-ai-multistream-batch-inference", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-multistream-inference", + "containerPath": "/usr/bin/gst-ai-multistream-inference", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-object-detection", + "containerPath": "/usr/bin/gst-ai-object-detection", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-parallel-inference", + "containerPath": "/usr/bin/gst-ai-parallel-inference", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-pose-detection", + "containerPath": "/usr/bin/gst-ai-pose-detection", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-segmentation", + "containerPath": "/usr/bin/gst-ai-segmentation", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-smartcodec-example", + "containerPath": "/usr/bin/gst-ai-smartcodec-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-superresolution", + "containerPath": "/usr/bin/gst-ai-superresolution", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-usb-camera-app", + "containerPath": "/usr/bin/gst-ai-usb-camera-app", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-appsink-example", + "containerPath": "/usr/bin/gst-appsink-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-audio-decode-example", + "containerPath": "/usr/bin/gst-audio-decode-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-audio-encode-example", + "containerPath": "/usr/bin/gst-audio-encode-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-audio-video-encode", + "containerPath": "/usr/bin/gst-audio-video-encode", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-audio-video-playback", + "containerPath": "/usr/bin/gst-audio-video-playback", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-camera-burst-capture-example", + "containerPath": "/usr/bin/gst-camera-burst-capture-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-camera-metadata-example", + "containerPath": "/usr/bin/gst-camera-metadata-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-camera-shdr-ldc-eis-example", + "containerPath": "/usr/bin/gst-camera-shdr-ldc-eis-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-camera-single-stream-example", + "containerPath": "/usr/bin/gst-camera-single-stream-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-camera-switch-example", + "containerPath": "/usr/bin/gst-camera-switch-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-concurrent-videoplay-composition", + "containerPath": "/usr/bin/gst-concurrent-videoplay-composition", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-inspect-1.0", + "containerPath": "/usr/bin/gst-inspect-1.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-jpg-decode-example", + "containerPath": "/usr/bin/gst-jpg-decode-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-launch-1.0", + "containerPath": "/usr/bin/gst-launch-1.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-multi-camera-example", + "containerPath": "/usr/bin/gst-multi-camera-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-multi-stream-example", + "containerPath": "/usr/bin/gst-multi-stream-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-pipeline-app", + "containerPath": "/usr/bin/gst-pipeline-app", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-rtsp-server", + "containerPath": "/usr/bin/gst-rtsp-server", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-smartcodec-example", + "containerPath": "/usr/bin/gst-smartcodec-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-snapshot-stream-example", + "containerPath": "/usr/bin/gst-snapshot-stream-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-stats-1.0", + "containerPath": "/usr/bin/gst-stats-1.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-tester-1.0", + "containerPath": "/usr/bin/gst-tester-1.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-transform-example", + "containerPath": "/usr/bin/gst-transform-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-typefind-1.0", + "containerPath": "/usr/bin/gst-typefind-1.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-video-playback-example", + "containerPath": "/usr/bin/gst-video-playback-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-video-transcode-example", + "containerPath": "/usr/bin/gst-video-transcode-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-videocodec-concurrent-playback", + "containerPath": "/usr/bin/gst-videocodec-concurrent-playback", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-warmboot-app", + "containerPath": "/usr/bin/gst-warmboot-app", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-webrtc-sendrecv-example", + "containerPath": "/usr/bin/gst-webrtc-sendrecv-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-weston-composition-example", + "containerPath": "/usr/bin/gst-weston-composition-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/overlay_blit_bgra_kernel.cl", + "containerPath": "/usr/lib/aarch64-linux-gnu/overlay_blit_bgra_kernel.cl", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/overlay_blit_rgba_kernel.cl", + "containerPath": "/usr/lib/aarch64-linux-gnu/overlay_blit_rgba_kernel.cl", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/overlay_mask_kernel.cl", + "containerPath": "/usr/lib/aarch64-linux-gnu/overlay_mask_kernel.cl", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gbm/default_fmt_alignment.xml", + "containerPath": "/usr/lib/aarch64-linux-gnu/gbm/default_fmt_alignment.xml", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gbm/dri_gbm.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gbm/dri_gbm.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gbm/msm_gbm.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gbm/msm_gbm.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstcoreelements.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstcoreelements.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstpulseaudio.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstpulseaudio.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtibatch.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtibatch.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimetamux.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimetamux.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimetatransform.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimetatransform.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlaclassification.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlaclassification.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlaconverter.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlaconverter.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimldemux.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimldemux.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlmetaparser.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlmetaparser.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlqnn.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlqnn.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlsnpe.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlsnpe.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimltflite.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimltflite.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlvclassification.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlvclassification.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlvconverter.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlvconverter.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlvdetection.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlvdetection.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlvpose.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlvpose.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlvsegmentation.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlvsegmentation.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlvsuperresolution.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlvsuperresolution.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimsgpub.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimsgpub.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimsgsub.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimsgsub.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtiobjtracker.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtiobjtracker.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtiqmmfsrc.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtiqmmfsrc.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtirestrictedzonedbg.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtirestrictedzonedbg.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtirtspbin.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtirtspbin.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtismartvencbin.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtismartvencbin.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtivcomposer.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtivcomposer.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtivoverlay.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtivoverlay.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtivsplit.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtivsplit.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtivtransform.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtivtransform.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstvideo4linux2.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstvideo4linux2.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstwaylandsink.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstwaylandsink.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libqtioverlay.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libqtioverlay.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libqtiredissink.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libqtiredissink.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libqtisocketsink.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libqtisocketsink.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libqtisocketsrc.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libqtisocketsrc.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libCB.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libCB.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libEGL.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libEGL.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libEGL.so.1.0.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libEGL.so.1.0.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libEGL_adreno.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libEGL_adreno.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libGLESv1_CM.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libGLESv1_CM.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libGLESv1_CM.so.1.0.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libGLESv1_CM.so.1.0.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libGLESv1_CM_adreno.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libGLESv1_CM_adreno.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libGLESv2.so.2", + "containerPath": "/usr/lib/aarch64-linux-gnu/libGLESv2.so.2", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libGLESv2.so.2.0.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libGLESv2.so.2.0.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libGLESv2_adreno.so.2", + "containerPath": "/usr/lib/aarch64-linux-gnu/libGLESv2_adreno.so.2", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libIB2C.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libIB2C.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libOpenCL.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libOpenCL.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libOpenCL_adreno.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libOpenCL_adreno.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libVideoCtrl.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libVideoCtrl.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libadreno_utils.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libadreno_utils.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libadsprpc.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libadsprpc.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libatomic.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libatomic.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libcdsprpc.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libcdsprpc.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libdmabufheap.so.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libdmabufheap.so.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libeglSubDriverWayland.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libeglSubDriverWayland.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libenv_time.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/libenv_time.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libevaluation_proto.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/libevaluation_proto.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libfarmhash.so.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libfarmhash.so.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libfastcvdsp_stub.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libfastcvdsp_stub.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libfastcvopt.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libfastcvopt.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgallium-25.0.7-0ubuntu0.24.04.1.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgallium-25.0.7-0ubuntu0.24.04.1.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgbm.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgbm.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgsl.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgsl.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstappsutils.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstappsutils.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstbase-1.0.so.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstbase-1.0.so.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstqtiallocatorsbase.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstqtiallocatorsbase.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstqticvbase.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstqticvbase.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstqtimemorybase.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstqtimemorybase.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstqtimlbase.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstqtimlbase.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstqtimqttadaptor.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstqtimqttadaptor.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstqtimsgadaptor.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstqtimsgadaptor.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstqtiutilsbase.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstqtiutilsbase.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstqtivideobase.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstqtivideobase.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstreamer-1.0.so.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstreamer-1.0.so.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstvideo-1.0.so.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstvideo-1.0.so.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstwayland-1.0.so.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstwayland-1.0.so.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libimage_metrics.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/libimage_metrics.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libjpeg_internal.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/libjpeg_internal.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libllvm-glnext.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libllvm-glnext.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libllvm-qcom.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libllvm-qcom.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libllvm-qgl.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libllvm-qgl.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/liboverlay_lib.so.SOVERSION", + "containerPath": "/usr/lib/aarch64-linux-gnu/liboverlay_lib.so.SOVERSION", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libpropertyvault.so.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libpropertyvault.so.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libpulse-simple.so.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libpulse-simple.so.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libpulse.so.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libpulse.so.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libq3dtools_adreno.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libq3dtools_adreno.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libq3dtools_esx.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libq3dtools_esx.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libqtimlmeta.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libqtimlmeta.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libtensorflowlite_c.so.2", + "containerPath": "/usr/lib/aarch64-linux-gnu/libtensorflowlite_c.so.2", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libtf_logging.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/libtf_logging.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libvulkan_adreno.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libvulkan_adreno.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libwayland-client.so.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libwayland-client.so.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libwayland-egl.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libwayland-egl.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/dsp/cdsp/cv/v68/KODIAK/libfastcvadsp.so", + "containerPath": "/usr/lib/dsp/cdsp/cv/v68/KODIAK/libfastcvadsp.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/dsp/cdsp/cv/v68/KODIAK/libfastcvdsp_skel.so", + "containerPath": "/usr/lib/dsp/cdsp/cv/v68/KODIAK/libfastcvdsp_skel.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libPlatformValidatorShared.so", + "containerPath": "/usr/lib/libPlatformValidatorShared.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnChrometraceProfilingReader.so", + "containerPath": "/usr/lib/libQnnChrometraceProfilingReader.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnCpu.so", + "containerPath": "/usr/lib/libQnnCpu.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnDsp.so", + "containerPath": "/usr/lib/libQnnDsp.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnDspNetRunExtensions.so", + "containerPath": "/usr/lib/libQnnDspNetRunExtensions.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnGenAiTransformer.so", + "containerPath": "/usr/lib/libQnnGenAiTransformer.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnGenAiTransformerCpuOpPkg.so", + "containerPath": "/usr/lib/libQnnGenAiTransformerCpuOpPkg.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnGenAiTransformerModel.so", + "containerPath": "/usr/lib/libQnnGenAiTransformerModel.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnGpu.so", + "containerPath": "/usr/lib/libQnnGpu.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnGpuNetRunExtensions.so", + "containerPath": "/usr/lib/libQnnGpuNetRunExtensions.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnGpuProfilingReader.so", + "containerPath": "/usr/lib/libQnnGpuProfilingReader.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnHta.so", + "containerPath": "/usr/lib/libQnnHta.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnHtaNetRunExtensions.so", + "containerPath": "/usr/lib/libQnnHtaNetRunExtensions.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnHtp.so", + "containerPath": "/usr/lib/libQnnHtp.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnHtpNetRunExtensions.so", + "containerPath": "/usr/lib/libQnnHtpNetRunExtensions.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnHtpOptraceProfilingReader.so", + "containerPath": "/usr/lib/libQnnHtpOptraceProfilingReader.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnHtpPrepare.so", + "containerPath": "/usr/lib/libQnnHtpPrepare.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnHtpProfilingReader.so", + "containerPath": "/usr/lib/libQnnHtpProfilingReader.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnHtpV68CalculatorStub.so", + "containerPath": "/usr/lib/libQnnHtpV68CalculatorStub.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnHtpV68Stub.so", + "containerPath": "/usr/lib/libQnnHtpV68Stub.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnIr.so", + "containerPath": "/usr/lib/libQnnIr.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnJsonProfilingReader.so", + "containerPath": "/usr/lib/libQnnJsonProfilingReader.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnModelDlc.so", + "containerPath": "/usr/lib/libQnnModelDlc.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnSaver.so", + "containerPath": "/usr/lib/libQnnSaver.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnSystem.so", + "containerPath": "/usr/lib/libQnnSystem.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnTFLiteDelegate.so", + "containerPath": "/usr/lib/libQnnTFLiteDelegate.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libSNPE.so", + "containerPath": "/usr/lib/libSNPE.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libSnpeDspStub.so", + "containerPath": "/usr/lib/libSnpeDspStub.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libSnpeHta.so", + "containerPath": "/usr/lib/libSnpeHta.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libSnpeHtpPrepare.so", + "containerPath": "/usr/lib/libSnpeHtpPrepare.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libSnpeHtpV68CalculatorStub.so", + "containerPath": "/usr/lib/libSnpeHtpV68CalculatorStub.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libSnpeHtpV68Stub.so", + "containerPath": "/usr/lib/libSnpeHtpV68Stub.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libcamera_metadata.so.0", + "containerPath": "/usr/lib/libcamera_metadata.so.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libhta_hexagon_runtime.so", + "containerPath": "/usr/lib/libhta_hexagon_runtime.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libhta_hexagon_runtime_snpe.so", + "containerPath": "/usr/lib/libhta_hexagon_runtime_snpe.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libqmmf_camera_metadata.so.1", + "containerPath": "/usr/lib/libqmmf_camera_metadata.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libqmmf_propertyvault.so", + "containerPath": "/usr/lib/libqmmf_propertyvault.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libqmmf_proto.so.1", + "containerPath": "/usr/lib/libqmmf_proto.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libqmmf_recorder_client.so.1", + "containerPath": "/usr/lib/libqmmf_recorder_client.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libqmmf_utils.so.1", + "containerPath": "/usr/lib/libqmmf_utils.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/qcm6490/libcamera_metadata.so.0", + "containerPath": "/usr/lib/qcm6490/libcamera_metadata.so.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/qcm6490/libqmmf_camera_metadata.so.1", + "containerPath": "/usr/lib/qcm6490/libqmmf_camera_metadata.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/qcm6490/libqmmf_propertyvault.so", + "containerPath": "/usr/lib/qcm6490/libqmmf_propertyvault.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/qcm6490/libqmmf_proto.so.1", + "containerPath": "/usr/lib/qcm6490/libqmmf_proto.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/qcm6490/libqmmf_recorder_client.so.1", + "containerPath": "/usr/lib/qcm6490/libqmmf_recorder_client.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/qcm6490/libqmmf_utils.so.1", + "containerPath": "/usr/lib/qcm6490/libqmmf_utils.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/rfsa/adsp/hexagon-v68/libCalculator_skel.so", + "containerPath": "/usr/lib/rfsa/adsp/hexagon-v68/libCalculator_skel.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/rfsa/adsp/hexagon-v68/libQnnSaver.so", + "containerPath": "/usr/lib/rfsa/adsp/hexagon-v68/libQnnSaver.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/rfsa/adsp/hexagon-v68/libQnnSystem.so", + "containerPath": "/usr/lib/rfsa/adsp/hexagon-v68/libQnnSystem.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/rfsa/adsp/libCalculator_skel.so", + "containerPath": "/usr/lib/rfsa/adsp/libCalculator_skel.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/rfsa/adsp/libQnnHtpV68.so", + "containerPath": "/usr/lib/rfsa/adsp/libQnnHtpV68.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/rfsa/adsp/libQnnHtpV68Skel.so", + "containerPath": "/usr/lib/rfsa/adsp/libQnnHtpV68Skel.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/rfsa/adsp/libQnnSaver.so", + "containerPath": "/usr/lib/rfsa/adsp/libQnnSaver.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/rfsa/adsp/libQnnSystem.so", + "containerPath": "/usr/lib/rfsa/adsp/libQnnSystem.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/rfsa/adsp/libSnpeHtpV68Skel.so", + "containerPath": "/usr/lib/rfsa/adsp/libSnpeHtpV68Skel.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libcdsprpc.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/libcdsprpc.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libadsprpc.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/libadsprpc.so", + "options": [ + "bind" + ] + } + ] + } + } + ] +} diff --git a/docker/qualcomm/cdi/cdi-hw-acc-9100.json b/docker/qualcomm/cdi/cdi-hw-acc-9100.json new file mode 100644 index 0000000000..4df55b5e3a --- /dev/null +++ b/docker/qualcomm/cdi/cdi-hw-acc-9100.json @@ -0,0 +1,1724 @@ +{ + "cdiVersion": "0.6.0", + "kind": "qualcomm.com/device", + "devices": [ + { + "name": "cdi-hw-acc", + "containerEdits": { + "env": [ + "XDG_RUNTIME_DIR=/run/user/1000", + "WAYLAND_DISPLAY=wayland-0", + "GST_DEBUG_NO_COLOR=1", + "GST_DEBUG=2", + "ADSP_LIBRARY_PATH=\"/usr/lib/dsp/cdsp;/usr/lib/dsp/cdsp1;${ADSP_LIBRARY_PATH}\"", + "GST_PLUGIN_SCANNER=\"/usr/lib/aarch64-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-plugin-scanner\"" + ], + "deviceNodes": [ + { + "path": "/dev/dri/card0" + }, + { + "path": "/dev/dri/renderD128" + }, + { + "path": "/dev/video32" + }, + { + "path": "/dev/video33" + }, + { + "path": "/dev/dma_heap/system" + }, + { + "path": "/dev/dma_heap/qcom,system" + }, + { + "path": "/dev/fastrpc-cdsp" + } + ], + "mounts": [ + { + "hostPath": "/run/user/1000", + "containerPath": "/run/user/1000", + "options": [ + "bind" + ] + }, + { + "hostPath": "/tmp/socket/cam_server", + "containerPath": "/tmp/socket/cam_server", + "options": [ + "bind" + ] + }, + { + "hostPath": "/tmp/property-vault.socket", + "containerPath": "/tmp/property-vault.socket", + "options": [ + "bind" + ] + }, + { + "hostPath": "/etc/labels", + "containerPath": "/etc/labels", + "options": [ + "bind" + ] + }, + { + "hostPath": "/etc/media", + "containerPath": "/etc/media", + "options": [ + "bind" + ] + }, + { + "hostPath": "/etc/models", + "containerPath": "/etc/models", + "options": [ + "bind" + ] + }, + { + "hostPath": "/etc/configs", + "containerPath": "/etc/configs", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/meta", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/meta", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/ml", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/ml", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/mlmetaparser", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/mlmetaparser", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/pulseaudio", + "containerPath": "/usr/lib/aarch64-linux-gnu/pulseaudio", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-activate-deactivate-streams-runtime-example", + "containerPath": "/usr/bin/gst-activate-deactivate-streams-runtime-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-add-remove-streams-runtime", + "containerPath": "/usr/bin/gst-add-remove-streams-runtime", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-add-streams-as-bundle-example", + "containerPath": "/usr/bin/gst-add-streams-as-bundle-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-audio-classification", + "containerPath": "/usr/bin/gst-ai-audio-classification", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-classification", + "containerPath": "/usr/bin/gst-ai-classification", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-daisychain-detection-classification", + "containerPath": "/usr/bin/gst-ai-daisychain-detection-classification", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-daisychain-detection-pose", + "containerPath": "/usr/bin/gst-ai-daisychain-detection-pose", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-face-detection", + "containerPath": "/usr/bin/gst-ai-face-detection", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-face-recognition", + "containerPath": "/usr/bin/gst-ai-face-recognition", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-metadata-parser-example", + "containerPath": "/usr/bin/gst-ai-metadata-parser-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-monodepth", + "containerPath": "/usr/bin/gst-ai-monodepth", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-multi-input-output-object-detection", + "containerPath": "/usr/bin/gst-ai-multi-input-output-object-detection", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-multistream-batch-inference", + "containerPath": "/usr/bin/gst-ai-multistream-batch-inference", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-multistream-inference", + "containerPath": "/usr/bin/gst-ai-multistream-inference", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-object-detection", + "containerPath": "/usr/bin/gst-ai-object-detection", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-object-detection.py", + "containerPath": "/usr/bin/gst-ai-object-detection.py", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-parallel-inference", + "containerPath": "/usr/bin/gst-ai-parallel-inference", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-pose-detection", + "containerPath": "/usr/bin/gst-ai-pose-detection", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-segmentation", + "containerPath": "/usr/bin/gst-ai-segmentation", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-smartcodec-example", + "containerPath": "/usr/bin/gst-ai-smartcodec-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-superresolution", + "containerPath": "/usr/bin/gst-ai-superresolution", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-ai-usb-camera-app", + "containerPath": "/usr/bin/gst-ai-usb-camera-app", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-appsink-example", + "containerPath": "/usr/bin/gst-appsink-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-audio-decode-example", + "containerPath": "/usr/bin/gst-audio-decode-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-audio-encode-example", + "containerPath": "/usr/bin/gst-audio-encode-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-audio-video-encode", + "containerPath": "/usr/bin/gst-audio-video-encode", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-audio-video-playback", + "containerPath": "/usr/bin/gst-audio-video-playback", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-camera-burst-capture-example", + "containerPath": "/usr/bin/gst-camera-burst-capture-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-camera-encode.py", + "containerPath": "/usr/bin/gst-camera-encode.py", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-camera-metadata-example", + "containerPath": "/usr/bin/gst-camera-metadata-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-camera-opencv-resize.py", + "containerPath": "/usr/bin/gst-camera-opencv-resize.py", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-camera-rotate-downscale-file.py", + "containerPath": "/usr/bin/gst-camera-rotate-downscale-file.py", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-camera-shdr-ldc-eis-example", + "containerPath": "/usr/bin/gst-camera-shdr-ldc-eis-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-camera-single-stream-example", + "containerPath": "/usr/bin/gst-camera-single-stream-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-camera-switch-example", + "containerPath": "/usr/bin/gst-camera-switch-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-camera-three-stream-encode-file-detection-display-classification-rtsp.py", + "containerPath": "/usr/bin/gst-camera-three-stream-encode-file-detection-display-classification-rtsp.py", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-camera-two-stream-detection-and-classification-side-by-side.py", + "containerPath": "/usr/bin/gst-camera-two-stream-detection-and-classification-side-by-side.py", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-camera-two-stream-encode-file-detection-display.py", + "containerPath": "/usr/bin/gst-camera-two-stream-encode-file-detection-display.py", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-concurrent-videoplay-composition", + "containerPath": "/usr/bin/gst-concurrent-videoplay-composition", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-concurrent-videoplay-composition.py", + "containerPath": "/usr/bin/gst-concurrent-videoplay-composition.py", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-daisychain-detection-pose.py", + "containerPath": "/usr/bin/gst-daisychain-detection-pose.py", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-filesrc-2detection-classification-segmentation-side-by-side.py", + "containerPath": "/usr/bin/gst-filesrc-2detection-classification-segmentation-side-by-side.py", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-gui-launcher-app.py", + "containerPath": "/usr/bin/gst-gui-launcher-app.py", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-inspect-1.0", + "containerPath": "/usr/bin/gst-inspect-1.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-jpg-decode-example", + "containerPath": "/usr/bin/gst-jpg-decode-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-jpg-image-decode.py", + "containerPath": "/usr/bin/gst-jpg-image-decode.py", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-launch-1.0", + "containerPath": "/usr/bin/gst-launch-1.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-multi-camera-example", + "containerPath": "/usr/bin/gst-multi-camera-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-multi-camera-stream-example.py", + "containerPath": "/usr/bin/gst-multi-camera-stream-example.py", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-multi-stream-example", + "containerPath": "/usr/bin/gst-multi-stream-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-opencv-transform.py", + "containerPath": "/usr/bin/gst-opencv-transform.py", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-parallel-inference.py", + "containerPath": "/usr/bin/gst-parallel-inference.py", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-pipeline-app", + "containerPath": "/usr/bin/gst-pipeline-app", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-rtsp-server", + "containerPath": "/usr/bin/gst-rtsp-server", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-rtspsrc-detection-display.py", + "containerPath": "/usr/bin/gst-rtspsrc-detection-display.py", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-smartcodec-example", + "containerPath": "/usr/bin/gst-smartcodec-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-snapshot-stream-example", + "containerPath": "/usr/bin/gst-snapshot-stream-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-stats-1.0", + "containerPath": "/usr/bin/gst-stats-1.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-tester-1.0", + "containerPath": "/usr/bin/gst-tester-1.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-transform-example", + "containerPath": "/usr/bin/gst-transform-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-typefind-1.0", + "containerPath": "/usr/bin/gst-typefind-1.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-video-playback-example", + "containerPath": "/usr/bin/gst-video-playback-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-video-transcode-example", + "containerPath": "/usr/bin/gst-video-transcode-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-videocodec-concurrent-playback", + "containerPath": "/usr/bin/gst-videocodec-concurrent-playback", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-warmboot-app", + "containerPath": "/usr/bin/gst-warmboot-app", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-webrtc-sendrecv-example", + "containerPath": "/usr/bin/gst-webrtc-sendrecv-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/bin/gst-weston-composition-example", + "containerPath": "/usr/bin/gst-weston-composition-example", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/overlay_blit_bgra_kernel.cl", + "containerPath": "/usr/lib/aarch64-linux-gnu/overlay_blit_bgra_kernel.cl", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/overlay_blit_rgba_kernel.cl", + "containerPath": "/usr/lib/aarch64-linux-gnu/overlay_blit_rgba_kernel.cl", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/overlay_mask_kernel.cl", + "containerPath": "/usr/lib/aarch64-linux-gnu/overlay_mask_kernel.cl", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gbm/default_fmt_alignment.xml", + "containerPath": "/usr/lib/aarch64-linux-gnu/gbm/default_fmt_alignment.xml", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gbm/dri_gbm.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gbm/dri_gbm.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gbm/msm_gbm.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gbm/msm_gbm.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstcoreelements.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstcoreelements.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstpulseaudio.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstpulseaudio.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtibatch.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtibatch.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimetamux.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimetamux.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimetatransform.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimetatransform.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlaclassification.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlaclassification.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlaconverter.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlaconverter.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimldemux.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimldemux.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlmetaparser.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlmetaparser.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlqnn.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlqnn.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlsnpe.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlsnpe.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimltflite.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimltflite.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlvclassification.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlvclassification.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlvconverter.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlvconverter.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlvdetection.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlvdetection.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlvpose.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlvpose.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlvsegmentation.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlvsegmentation.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlvsuperresolution.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimlvsuperresolution.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimsgpub.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimsgpub.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimsgsub.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtimsgsub.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtiobjtracker.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtiobjtracker.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtiqmmfsrc.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtiqmmfsrc.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtirestrictedzonedbg.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtirestrictedzonedbg.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtirtspbin.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtirtspbin.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtismartvencbin.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtismartvencbin.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtivcomposer.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtivcomposer.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtivoverlay.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtivoverlay.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtivsplit.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtivsplit.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtivtransform.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstqtivtransform.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstvideo4linux2.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstvideo4linux2.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstwaylandsink.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libgstwaylandsink.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libqtioverlay.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libqtioverlay.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libqtiredissink.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libqtiredissink.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libqtisocketsink.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libqtisocketsink.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libqtisocketsrc.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/gstreamer-1.0/libqtisocketsrc.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libCB.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libCB.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libEGL.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libEGL.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libEGL.so.1.0.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libEGL.so.1.0.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libEGL_adreno.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libEGL_adreno.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libGLESv1_CM.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libGLESv1_CM.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libGLESv1_CM.so.1.0.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libGLESv1_CM.so.1.0.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libGLESv1_CM_adreno.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libGLESv1_CM_adreno.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libGLESv2.so.2", + "containerPath": "/usr/lib/aarch64-linux-gnu/libGLESv2.so.2", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libGLESv2.so.2.0.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libGLESv2.so.2.0.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libGLESv2_adreno.so.2", + "containerPath": "/usr/lib/aarch64-linux-gnu/libGLESv2_adreno.so.2", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libIB2C.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libIB2C.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libOpenCL.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libOpenCL.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libOpenCL_adreno.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libOpenCL_adreno.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libVideoCtrl.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libVideoCtrl.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libadreno_utils.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libadreno_utils.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libadsprpc.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libadsprpc.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libatomic.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libatomic.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libcdsprpc.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libcdsprpc.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libdmabufheap.so.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libdmabufheap.so.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libeglSubDriverWayland.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libeglSubDriverWayland.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libenv_time.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/libenv_time.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libevaluation_proto.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/libevaluation_proto.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libfarmhash.so.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libfarmhash.so.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libfastcvdsp_stub.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libfastcvdsp_stub.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libfastcvopt.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libfastcvopt.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgallium-25.0.7-0ubuntu0.24.04.1.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgallium-25.0.7-0ubuntu0.24.04.1.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgbm.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgbm.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgsl.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgsl.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstappsutils.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstappsutils.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstbase-1.0.so.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstbase-1.0.so.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstqtiallocatorsbase.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstqtiallocatorsbase.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstqticvbase.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstqticvbase.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstqtimemorybase.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstqtimemorybase.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstqtimlbase.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstqtimlbase.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstqtimqttadaptor.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstqtimqttadaptor.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstqtimsgadaptor.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstqtimsgadaptor.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstqtiutilsbase.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstqtiutilsbase.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstqtivideobase.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstqtivideobase.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstreamer-1.0.so.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstreamer-1.0.so.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstvideo-1.0.so.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstvideo-1.0.so.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libgstwayland-1.0.so.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libgstwayland-1.0.so.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libimage_metrics.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/libimage_metrics.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libjpeg_internal.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/libjpeg_internal.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libllvm-glnext.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libllvm-glnext.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libllvm-qcom.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libllvm-qcom.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libllvm-qgl.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libllvm-qgl.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/liboverlay_lib.so.SOVERSION", + "containerPath": "/usr/lib/aarch64-linux-gnu/liboverlay_lib.so.SOVERSION", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libpropertyvault.so.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libpropertyvault.so.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libpulse-simple.so.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libpulse-simple.so.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libpulse.so.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libpulse.so.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libq3dtools_adreno.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libq3dtools_adreno.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libq3dtools_esx.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libq3dtools_esx.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libqtimlmeta.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libqtimlmeta.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libtensorflowlite_c.so.2", + "containerPath": "/usr/lib/aarch64-linux-gnu/libtensorflowlite_c.so.2", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libtf_logging.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/libtf_logging.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libvulkan_adreno.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libvulkan_adreno.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libwayland-client.so.0", + "containerPath": "/usr/lib/aarch64-linux-gnu/libwayland-client.so.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libwayland-egl.so.1", + "containerPath": "/usr/lib/aarch64-linux-gnu/libwayland-egl.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/dsp/cdsp/cv/v73/LEMANS/libfastcvadsp.so", + "containerPath": "/usr/lib/dsp/cdsp/cv/v73/LEMANS/libfastcvadsp.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/dsp/cdsp/cv/v73/LEMANS/libfastcvdsp_skel.so", + "containerPath": "/usr/lib/dsp/cdsp/cv/v73/LEMANS/libfastcvdsp_skel.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libPlatformValidatorShared.so", + "containerPath": "/usr/lib/libPlatformValidatorShared.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnChrometraceProfilingReader.so", + "containerPath": "/usr/lib/libQnnChrometraceProfilingReader.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnCpu.so", + "containerPath": "/usr/lib/libQnnCpu.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnCpuNetRunExtensions.so", + "containerPath": "/usr/lib/libQnnCpuNetRunExtensions.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnDsp.so", + "containerPath": "/usr/lib/libQnnDsp.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnDspNetRunExtensions.so", + "containerPath": "/usr/lib/libQnnDspNetRunExtensions.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnGenAiTransformer.so", + "containerPath": "/usr/lib/libQnnGenAiTransformer.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnGenAiTransformerCpuOpPkg.so", + "containerPath": "/usr/lib/libQnnGenAiTransformerCpuOpPkg.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnGenAiTransformerModel.so", + "containerPath": "/usr/lib/libQnnGenAiTransformerModel.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnGpu.so", + "containerPath": "/usr/lib/libQnnGpu.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnGpuNetRunExtensions.so", + "containerPath": "/usr/lib/libQnnGpuNetRunExtensions.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnGpuProfilingReader.so", + "containerPath": "/usr/lib/libQnnGpuProfilingReader.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnHta.so", + "containerPath": "/usr/lib/libQnnHta.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnHtaNetRunExtensions.so", + "containerPath": "/usr/lib/libQnnHtaNetRunExtensions.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnHtp.so", + "containerPath": "/usr/lib/libQnnHtp.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnHtpNetRunExtensions.so", + "containerPath": "/usr/lib/libQnnHtpNetRunExtensions.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnHtpOptraceProfilingReader.so", + "containerPath": "/usr/lib/libQnnHtpOptraceProfilingReader.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnHtpPrepare.so", + "containerPath": "/usr/lib/libQnnHtpPrepare.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnHtpProfilingReader.so", + "containerPath": "/usr/lib/libQnnHtpProfilingReader.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnHtpV73CalculatorStub.so", + "containerPath": "/usr/lib/libQnnHtpV73CalculatorStub.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnHtpV73Stub.so", + "containerPath": "/usr/lib/libQnnHtpV73Stub.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnIr.so", + "containerPath": "/usr/lib/libQnnIr.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnJsonProfilingReader.so", + "containerPath": "/usr/lib/libQnnJsonProfilingReader.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnModelDlc.so", + "containerPath": "/usr/lib/libQnnModelDlc.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnSaver.so", + "containerPath": "/usr/lib/libQnnSaver.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnSystem.so", + "containerPath": "/usr/lib/libQnnSystem.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libQnnTFLiteDelegate.so", + "containerPath": "/usr/lib/libQnnTFLiteDelegate.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libSNPE.so", + "containerPath": "/usr/lib/libSNPE.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libSnpeDspStub.so", + "containerPath": "/usr/lib/libSnpeDspStub.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libSnpeHta.so", + "containerPath": "/usr/lib/libSnpeHta.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libSnpeHtpPrepare.so", + "containerPath": "/usr/lib/libSnpeHtpPrepare.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libSnpeHtpV73CalculatorStub.so", + "containerPath": "/usr/lib/libSnpeHtpV73CalculatorStub.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libSnpeHtpV73Stub.so", + "containerPath": "/usr/lib/libSnpeHtpV73Stub.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libcamera_metadata.so.0", + "containerPath": "/usr/lib/libcamera_metadata.so.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libhta_hexagon_runtime.so", + "containerPath": "/usr/lib/libhta_hexagon_runtime.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libhta_hexagon_runtime_snpe.so", + "containerPath": "/usr/lib/libhta_hexagon_runtime_snpe.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libqmmf_camera_metadata.so.1", + "containerPath": "/usr/lib/libqmmf_camera_metadata.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libqmmf_propertyvault.so", + "containerPath": "/usr/lib/libqmmf_propertyvault.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libqmmf_proto.so.1", + "containerPath": "/usr/lib/libqmmf_proto.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libqmmf_recorder_client.so.1", + "containerPath": "/usr/lib/libqmmf_recorder_client.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/libqmmf_utils.so.1", + "containerPath": "/usr/lib/libqmmf_utils.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/qcs9100/libcamera_metadata.so.0", + "containerPath": "/usr/lib/qcs9100/libcamera_metadata.so.0", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/qcs9100/libqmmf_camera_metadata.so.1", + "containerPath": "/usr/lib/qcs9100/libqmmf_camera_metadata.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/qcs9100/libqmmf_propertyvault.so", + "containerPath": "/usr/lib/qcs9100/libqmmf_propertyvault.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/qcs9100/libqmmf_proto.so.1", + "containerPath": "/usr/lib/qcs9100/libqmmf_proto.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/qcs9100/libqmmf_recorder_client.so.1", + "containerPath": "/usr/lib/qcs9100/libqmmf_recorder_client.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/qcs9100/libqmmf_utils.so.1", + "containerPath": "/usr/lib/qcs9100/libqmmf_utils.so.1", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/rfsa/adsp/hexagon-v73/libCalculator_skel.so", + "containerPath": "/usr/lib/rfsa/adsp/hexagon-v73/libCalculator_skel.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/rfsa/adsp/hexagon-v73/libQnnSaver.so", + "containerPath": "/usr/lib/rfsa/adsp/hexagon-v73/libQnnSaver.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/rfsa/adsp/hexagon-v73/libQnnSystem.so", + "containerPath": "/usr/lib/rfsa/adsp/hexagon-v73/libQnnSystem.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/rfsa/adsp/libCalculator_skel.so", + "containerPath": "/usr/lib/rfsa/adsp/libCalculator_skel.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/rfsa/adsp/libQnnHtpV73.so", + "containerPath": "/usr/lib/rfsa/adsp/libQnnHtpV73.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/rfsa/adsp/libQnnHtpV73QemuDriver.so", + "containerPath": "/usr/lib/rfsa/adsp/libQnnHtpV73QemuDriver.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/rfsa/adsp/libQnnHtpV73Skel.so", + "containerPath": "/usr/lib/rfsa/adsp/libQnnHtpV73Skel.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/rfsa/adsp/libQnnSaver.so", + "containerPath": "/usr/lib/rfsa/adsp/libQnnSaver.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/rfsa/adsp/libQnnSystem.so", + "containerPath": "/usr/lib/rfsa/adsp/libQnnSystem.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/rfsa/adsp/libSnpeHtpV73Skel.so", + "containerPath": "/usr/lib/rfsa/adsp/libSnpeHtpV73Skel.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/rfsa/adsp/libqnnhtpv73.cat", + "containerPath": "/usr/lib/rfsa/adsp/libqnnhtpv73.cat", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/rfsa/adsp/libsnpehtpv73.cat", + "containerPath": "/usr/lib/rfsa/adsp/libsnpehtpv73.cat", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libcdsprpc.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/libcdsprpc.so", + "options": [ + "bind" + ] + }, + { + "hostPath": "/usr/lib/aarch64-linux-gnu/libadsprpc.so", + "containerPath": "/usr/lib/aarch64-linux-gnu/libadsprpc.so", + "options": [ + "bind" + ] + } + ] + } + } + ] +} diff --git a/docker/qualcomm/cdi/install_cdi.py b/docker/qualcomm/cdi/install_cdi.py new file mode 100644 index 0000000000..831d79f667 --- /dev/null +++ b/docker/qualcomm/cdi/install_cdi.py @@ -0,0 +1,51 @@ +import argparse +import json +import os + +parser = argparse.ArgumentParser(description="Install CDI on Dragonwing IoT boards") +parser.add_argument("--file", type=str, required=True, help="CDI input file") +args, unknown = parser.parse_known_args() + +if os.path.exists("/etc/cdi/cdi-hw-acc.json"): + print("/etc/cdi/cdi-hw-acc.json already exists. Remove it first before continuing.") + exit(1) + +if not os.path.exists(args.file): + print(f"{args.file} (via --file) does not exist") + exit(1) + +# Check if directory exists +if not os.path.exists("/etc/cdi"): + # Check if we can create it in /etc + if not os.access(os.path.dirname("/etc/cdi"), os.W_OK): + print( + f"{os.path.dirname('/etc/cdi')} is not writable. Re-run this script with sudo." + ) + exit(1) + os.mkdir("/etc/cdi") +else: + # Directory exists → check if writable + if not os.access("/etc/cdi", os.W_OK): + print("/etc/cdi is not writable. Re-run this script with sudo.") + exit(1) + +with open(args.file, "r") as f: + cdi = json.loads(f.read()) + +print("Finding missing mount paths...") +for device in cdi["devices"]: + new_mounts = [] + + for mount in device["containerEdits"]["mounts"]: + if not os.path.exists(mount["hostPath"]): + print(f" Missing {mount['hostPath']}") + else: + new_mounts.append(mount) + + device["containerEdits"]["mounts"] = new_mounts + +print("") +print("Writing to /etc/cdi/cdi-hw-acc.json...") +with open("/etc/cdi/cdi-hw-acc.json", "w") as f: + f.write(json.dumps(cdi, indent=4)) +print("Writing to /etc/cdi/cdi-hw-acc.json OK") diff --git a/docker/qualcomm/qualcomm.hcl b/docker/qualcomm/qualcomm.hcl new file mode 100644 index 0000000000..b3e74b74ac --- /dev/null +++ b/docker/qualcomm/qualcomm.hcl @@ -0,0 +1,27 @@ +target wheels { + dockerfile = "docker/main/Dockerfile" + platforms = ["linux/arm64"] + target = "wheels" +} + +target deps { + dockerfile = "docker/main/Dockerfile" + platforms = ["linux/arm64"] + target = "deps" +} + +target rootfs { + dockerfile = "docker/main/Dockerfile" + platforms = ["linux/arm64"] + target = "rootfs" +} + +target qualcomm { + dockerfile = "docker/qualcomm/Dockerfile" + contexts = { + wheels = "target:wheels", + deps = "target:deps", + rootfs = "target:rootfs" + } + platforms = ["linux/arm64"] +} diff --git a/docker/qualcomm/qualcomm.mk b/docker/qualcomm/qualcomm.mk new file mode 100644 index 0000000000..3490577bc9 --- /dev/null +++ b/docker/qualcomm/qualcomm.mk @@ -0,0 +1,15 @@ +BOARDS += qualcomm + +local-qualcomm: version + docker buildx bake --file=docker/qualcomm/qualcomm.hcl qualcomm \ + --set qualcomm.tags=frigate:latest-qualcomm \ + --load + +build-qualcomm: version + docker buildx bake --file=docker/qualcomm/qualcomm.hcl qualcomm \ + --set qualcomm.tags=$(IMAGE_REPO):${GITHUB_REF_NAME}-$(COMMIT_HASH)-qualcomm + +push-qualcomm: build-qualcomm + docker buildx bake --file=docker/qualcomm/qualcomm.hcl qualcomm \ + --set qualcomm.tags=$(IMAGE_REPO):${GITHUB_REF_NAME}-$(COMMIT_HASH)-qualcomm \ + --push diff --git a/docs/data/object_detectors_models.json b/docs/data/object_detectors_models.json index 31806a69ad..6ee5b6857f 100644 --- a/docs/data/object_detectors_models.json +++ b/docs/data/object_detectors_models.json @@ -265,6 +265,19 @@ } ] }, + "qualcomm": { + "title": "Qualcomm", + "models": [ + { + "key": "ssd_mobiledet", + "label": "SSD MobileDet", + "recommended": true, + "download": "The default SSD MobileDet TFLite model (`/cpu_model.tflite`) bundled with the Frigate container is used automatically. This model is INT8 quantized and compatible with the QNN HTP backend.\n\nOnly `.tflite` models are supported with this detector. A custom model must be INT8 quantized for the Hexagon NPU.", + "ui": "Navigate to **Settings > System > Detectors and model** and select **Qualcomm** from the detector type dropdown and click **Add**. The bundled SSD MobileDet model is used automatically.\n\nTo use a custom model, configure in the **Custom Model** tab:\n\n| Field | Value |\n| ---------------------------------------- | ---------------------------------- |\n| **Custom object detector model path** | `/config/your_custom_model.tflite` |\n| **Object detection model input width** | `320` |\n| **Object detection model input height** | `320` |\n| **Label map for custom object detector** | `/labelmap/coco-80.txt` |", + "yaml": "detectors:\n qualcomm_npu:\n type: qualcomm_tfl" + } + ] + }, "rknn": { "title": "RKNN", "models": [ diff --git a/docs/docs/configuration/object_detectors.md b/docs/docs/configuration/object_detectors.md index 51a9b213a0..aee98228a5 100644 --- a/docs/docs/configuration/object_detectors.md +++ b/docs/docs/configuration/object_detectors.md @@ -53,6 +53,10 @@ Frigate supports multiple different detectors that work on different types of ha - [RKNN](#rockchip-platform): RKNN models can run on Rockchip devices with included NPUs. +**Qualcomm** + +- [Qualcomm](#qualcomm): TFLite models can run on Qualcomm SoCs with a Hexagon NPU (e.g. IQ9100, QCS6490) via the QNN TFLite delegate. + **Synaptics** - [Synaptics](#synaptics): synap models can run on Synaptics devices(e.g astra machina) with included NPUs. @@ -652,6 +656,21 @@ When configuring the Synap detector, you have to specify the model: a local **pa +## Qualcomm + +Hardware accelerated object detection is supported on the following Qualcomm SoCs with a Hexagon NPU: + +- IQ9100 / IQ-9075 EVK +- QCS6490 / RB3 Gen 2 Vision Kit / Rubik Pi 3 + +This implementation uses the QNN TFLite delegate (`libQnnTFLiteDelegate.so`) to accelerate TFLite model inference on the Qualcomm Hexagon Tensor Processor (HTP / NPU). The delegate library and device drivers are provided by the host operating system and made available to the container via [CDI (Container Device Interface)](https://docs.docker.com/build/building/cdi/). + +See the [installation docs](../frigate/installation.md#qualcomm) for information on setting up CDI and configuring the hardware. + +### Configuration + + + ## Rockchip platform Hardware accelerated object detection is supported on the following SoCs: diff --git a/docs/docs/frigate/hardware.md b/docs/docs/frigate/hardware.md index abe4630653..4ed7c98c6b 100644 --- a/docs/docs/frigate/hardware.md +++ b/docs/docs/frigate/hardware.md @@ -107,6 +107,10 @@ Frigate supports multiple different detectors that work on different types of ha - [AXEngine](#axera): axera models can run on AXERA NPUs via AXEngine, delivering highly efficient object detection. +**Qualcomm** + +- [Qualcomm](#qualcomm): TFLite models can run on Qualcomm SoCs with a Hexagon NPU (e.g. IQ9100, QCS6490) via the QNN TFLite delegate. + ::: ### Hailo-8 @@ -295,6 +299,17 @@ The inference time of a rk3588 with all 3 cores enabled is typically 25-30 ms fo | Name | AXERA AX650N/AX8850N Inference Time | | ---------------- | ----------------------------------- | | yolov9-tiny | ~ 4 ms | +### Qualcomm + +Frigate supports hardware object detection on Qualcomm SoCs with a Hexagon NPU, including the IQ9100 and QCS6490 (RB3 Gen 2). The QNN TFLite delegate is used to accelerate inference on the HTP (Hexagon Tensor Processor). + +A single detector is typically sufficient for multiple camera streams. The default model is **SSD MobileDet** (INT8 quantized). + +| Name | IQ9100 Inference Time | QCS6490 Inference Time | +| ------------- | --------------------- | ---------------------- | +| ssd_mobiledet | ~ 0.8 ms | ~ 5.55 ms | + +Detailed information is available [in the detector docs](/configuration/object_detectors#qualcomm). ## What does Frigate use the CPU for and what does it use a detector for? (ELI5 Version) diff --git a/docs/docs/frigate/installation.md b/docs/docs/frigate/installation.md index f69218f780..e075db4dff 100644 --- a/docs/docs/frigate/installation.md +++ b/docs/docs/frigate/installation.md @@ -472,6 +472,117 @@ If you are using `docker run`, add this option to your command `--device /dev/ax #### Configuration Finally, configure [hardware object detection](/configuration/object_detectors#axera) to complete the setup. +### Qualcomm + +Hardware accelerated object detection is supported on the following Qualcomm SoCs: + +| Board | SoC | CDI Config File | +| ----- | --- | --------------- | +| IQ-9075 EVK | IQ9100 | `cdi-hw-acc-9100.json` | +| RB3 Gen 2 Vision Kit / Rubik Pi 3 | QCS6490 | `cdi-hw-acc-6490.json` | + +The Qualcomm integration uses [CDI (Container Device Interface)](https://docs.docker.com/build/building/cdi/) to provide the container with access to the NPU device nodes and the QNN delegate libraries from the host. + +#### Prerequisites + +- **Qualcomm Linux BSP**: Your board must be running the official Qualcomm Linux Board Support Package image. The QNN runtime libraries (including `libQnnTFLiteDelegate.so` and `libQnnHtp.so`) and NPU device nodes (`/dev/fastrpc-cdsp`) are provided by the BSP and are bind-mounted into the container via CDI. +- **Docker 25.0+**: CDI device support requires Docker 25.0 or later. Check with `docker --version`. +- **arm64 architecture**: The Qualcomm Docker image is built for `linux/arm64` only. If building locally, you must run the build on the target board itself. + +#### CDI Installation + +1. Download or copy the CDI setup files from the [Frigate repository](https://github.com/blakeblackshear/frigate/tree/dev/docker/qualcomm/cdi). + +2. Install the CDI configuration for your board: + + ```bash + # IQ9100 / IQ-9075 EVK + sudo python3 install_cdi.py --file cdi-hw-acc-9100.json + + # QCS6490 / RB3 Gen 2 Vision Kit / Rubik Pi 3 + sudo python3 install_cdi.py --file cdi-hw-acc-6490.json + ``` + + This writes a CDI descriptor to `/etc/cdi/cdi-hw-acc.json`. The script will automatically skip any host paths that do not exist on your system. + +3. Verify CDI is set up by checking the file exists: + + ```bash + ls -l /etc/cdi/cdi-hw-acc.json + ``` + +#### Setup + +Follow Frigate's default installation instructions, but use a docker image with `-qualcomm` suffix, for example `ghcr.io/blakeblackshear/frigate:stable-qualcomm`. + +:::note + +The pre-built `stable-qualcomm` image is not yet published. Until it is available, you must build the image locally: + +```bash +git clone https://github.com/blakeblackshear/frigate.git +cd frigate +make local-qualcomm +``` + +This builds `frigate:latest-qualcomm` on your device. Use `frigate:latest-qualcomm` as the image name in the examples below instead of the `ghcr.io` URL. + +::: + +Grant Docker access to your Qualcomm hardware by passing the CDI device. In your `docker-compose.yml`: + +```yaml +services: + frigate: + container_name: frigate + restart: unless-stopped + image: ghcr.io/blakeblackshear/frigate:stable-qualcomm + devices: + - qualcomm.com/device=cdi-hw-acc + volumes: + - /etc/localtime:/etc/localtime:ro + - /path/to/your/config:/config + - /path/to/your/storage:/media/frigate + - type: tmpfs + target: /tmp/cache + tmpfs: + size: 1000000000 + ports: + - "8971:8971" + - "8554:8554" + - "8555:8555/tcp" + - "8555:8555/udp" +``` + +If using `docker run`, pass the CDI device with: + +```bash +docker run -d \ + --name frigate \ + --restart=unless-stopped \ + --device qualcomm.com/device=cdi-hw-acc \ + --mount type=tmpfs,target=/tmp/cache,tmpfs-size=1000000000 \ + --shm-size=256m \ + -v /path/to/your/storage:/media/frigate \ + -v /path/to/your/config:/config \ + -v /etc/localtime:/etc/localtime:ro \ + -e FRIGATE_RTSP_PASSWORD='password' \ + -p 8971:8971 \ + -p 8554:8554 \ + -p 8555:8555/tcp \ + -p 8555:8555/udp \ + ghcr.io/blakeblackshear/frigate:stable-qualcomm +``` + +:::tip + +Unlike other hardware integrations that pass individual `/dev/` device nodes, the Qualcomm CDI approach bundles all required device nodes, library bind mounts, and environment variables into a single `--device qualcomm.com/device=cdi-hw-acc` flag. + +::: + +#### Configuration + +Next, you should configure [hardware object detection](/configuration/object_detectors#qualcomm). ## Docker @@ -558,6 +669,7 @@ The community supported docker image tags for the current stable version are: - `stable-tensorrt-jp6` - Frigate build optimized for Nvidia Jetson devices running Jetpack 6 - `stable-rk` - Frigate build for SBCs with Rockchip SoC +- `stable-qualcomm` - Frigate build for Qualcomm SoCs with Hexagon NPU (IQ9100, QCS6490) ## Home Assistant App diff --git a/frigate/detectors/plugins/qualcomm_tfl.py b/frigate/detectors/plugins/qualcomm_tfl.py new file mode 100644 index 0000000000..d9a754b890 --- /dev/null +++ b/frigate/detectors/plugins/qualcomm_tfl.py @@ -0,0 +1,48 @@ +"""Qualcomm QNN TFLite delegate detector for Qualcomm NPU acceleration.""" + +import logging + +from pydantic import ConfigDict +from typing_extensions import Literal + +from frigate.detectors.detection_api import DetectionApi +from frigate.detectors.detector_config import BaseDetectorConfig + +from ..detector_utils import ( + tflite_detect_raw, + tflite_init, + tflite_load_delegate_interpreter, +) + +logger = logging.getLogger(__name__) + +# Use _tfl suffix to default to the bundled tflite model +DETECTOR_KEY = "qualcomm_tfl" + + +class QualcommDetectorConfig(BaseDetectorConfig): + """Qualcomm NPU detector using the QNN TFLite delegate to accelerate inference on Qualcomm SoCs with a Hexagon NPU (e.g. IQ9100, QCS6490).""" + + model_config = ConfigDict( + title="Qualcomm", + ) + + type: Literal[DETECTOR_KEY] + + +class QualcommTfl(DetectionApi): + type_key = DETECTOR_KEY + + def __init__(self, detector_config: QualcommDetectorConfig): + # The QNN TFLite delegate library is provided by the host via CDI bind mounts + delegate_library = "libQnnTFLiteDelegate.so" + # Use the Hexagon Tensor Processor (HTP / NPU) backend + device_config = {"backend_type": "htp"} + + interpreter = tflite_load_delegate_interpreter( + delegate_library, detector_config, device_config + ) + tflite_init(self, interpreter) + + def detect_raw(self, tensor_input): + return tflite_detect_raw(self, tensor_input) diff --git a/web/public/locales/en/config/global.json b/web/public/locales/en/config/global.json index e3b7c65c68..eee963028a 100644 --- a/web/public/locales/en/config/global.json +++ b/web/public/locales/en/config/global.json @@ -413,6 +413,10 @@ "description": "The device to use for OpenVINO inference (e.g. 'CPU', 'GPU', 'NPU')." } }, + "qualcomm_tfl": { + "label": "Qualcomm", + "description": "Qualcomm NPU detector using the QNN TFLite delegate to accelerate inference on Qualcomm SoCs with a Hexagon NPU (e.g. IQ9100, QCS6490)." + }, "rknn": { "label": "RKNN", "description": "RKNN detector for Rockchip NPUs; runs compiled RKNN models on Rockchip hardware.", From 8a40ea5c8715ff53df938af3e8745467975bd1ec Mon Sep 17 00:00:00 2001 From: Rami Mouro Date: Tue, 30 Jun 2026 10:33:24 -0600 Subject: [PATCH 2/2] fix(qualcomm): make install_cdi resolve QNN skels across BSP and Ubuntu/QAIRT layouts The bundled CDI descriptors assume the Qualcomm Linux BSP filesystem layout (/usr/lib/rfsa/adsp). On the equally-official Ubuntu image for RB3 Gen 2 / Rubik Pi 3, the QAIRT apt packages board-select the Hexagon skels into /usr/lib/dsp/cdsp and leave /usr/lib/rfsa/adsp as self-referential symlink loops, so install_cdi silently dropped the skel mounts and NPU offload failed silently at runtime (or a host-symlink workaround broke on reboot with an ELOOP CDI mount error). install_cdi.py now resolves each missing/broken mount from a fallback library dir and rewrites it to the real file, injects ADSP_LIBRARY_PATH so the DSP loader finds the skels, and warns loudly (with an optional --strict) when a critical QNN/HTP library cannot be found instead of failing silently. Docs updated to cover both images and a stronger verify step. Co-Authored-By: Claude Opus 4.8 --- docker/qualcomm/cdi/install_cdi.py | 112 +++++++++++++++++++++++++++-- docs/docs/frigate/installation.md | 9 ++- 2 files changed, 112 insertions(+), 9 deletions(-) diff --git a/docker/qualcomm/cdi/install_cdi.py b/docker/qualcomm/cdi/install_cdi.py index 831d79f667..b701dc3716 100644 --- a/docker/qualcomm/cdi/install_cdi.py +++ b/docker/qualcomm/cdi/install_cdi.py @@ -2,8 +2,62 @@ import argparse import json import os +# The CDI descriptor is authored against the Qualcomm Linux BSP filesystem layout, +# where the QNN/HTP runtime libraries and the Hexagon "skel" files live under +# /usr/lib and /usr/lib/rfsa/adsp. On other officially-supported images for the +# same boards -- notably Ubuntu for RB3 Gen 2 / Rubik Pi 3 with the QAIRT apt +# packages (qairt-libs/qairt-tools) -- the same files are board-selected into a +# different directory, and /usr/lib/rfsa/adsp may even contain self-referential +# symlink loops. When a mount's authored hostPath is missing (or a broken/looping +# symlink), look the file up by name in these fallback directories and rewrite the +# mount to the real, resolved file so NPU offload works on both layouts. +FALLBACK_LIB_DIRS = [ + "/usr/lib/dsp/cdsp", # QAIRT apt packages (board-selected from /usr/share/qcom/.../dsp/cdsp) +] + +# Libraries without which HTP/NPU offload cannot work. If any of these cannot be +# resolved we warn prominently (and abort under --strict) instead of silently +# producing a CDI that starts fine but never offloads to the NPU. +CRITICAL_BASENAMES = { + "libQnnTFLiteDelegate.so", + "libQnnHtp.so", + "libQnnHtpV68Skel.so", + "libQnnHtpV73Skel.so", + "libQnnHtpV75Skel.so", + "libQnnSystem.so", +} + + +def resolve_host_path(host_path): + """Resolve a mount's hostPath to a usable, real file/dir on this host. + + Returns the original path when it already resolves (the Qualcomm Linux BSP + layout). If it is missing or a broken/looping symlink, search FALLBACK_LIB_DIRS + by basename and return the real (symlink-resolved) path, so the rewritten mount + is stable across reboots / apt reconfigures. Returns None if not found anywhere. + """ + # os.path.exists() follows symlinks and returns False for a broken link or an + # ELOOP ("too many levels of symbolic links") -- exactly the treat-as-missing + # behavior we want before falling back. + if os.path.exists(host_path): + return host_path + + basename = os.path.basename(host_path) + for fallback_dir in FALLBACK_LIB_DIRS: + candidate = os.path.join(fallback_dir, basename) + if candidate != host_path and os.path.exists(candidate): + return os.path.realpath(candidate) + + return None + + parser = argparse.ArgumentParser(description="Install CDI on Dragonwing IoT boards") parser.add_argument("--file", type=str, required=True, help="CDI input file") +parser.add_argument( + "--strict", + action="store_true", + help="Exit non-zero if any critical QNN/HTP library cannot be resolved", +) args, unknown = parser.parse_known_args() if os.path.exists("/etc/cdi/cdi-hw-acc.json"): @@ -32,18 +86,64 @@ else: with open(args.file, "r") as f: cdi = json.loads(f.read()) -print("Finding missing mount paths...") +print("Resolving mount paths...") +relocated = [] +missing = [] for device in cdi["devices"]: new_mounts = [] - for mount in device["containerEdits"]["mounts"]: - if not os.path.exists(mount["hostPath"]): - print(f" Missing {mount['hostPath']}") - else: - new_mounts.append(mount) + for mount in device["containerEdits"].get("mounts", []): + resolved = resolve_host_path(mount["hostPath"]) + + if resolved is None: + missing.append(mount["hostPath"]) + print(f" Missing {mount['hostPath']}") + continue + + if resolved != mount["hostPath"]: + relocated.append((mount["hostPath"], resolved)) + print(f" Resolved {mount['hostPath']} -> {resolved}") + # Keep containerPath as authored; only the host source moves. + mount["hostPath"] = resolved + + new_mounts.append(mount) device["containerEdits"]["mounts"] = new_mounts + # The QNN HTP backend (libcdsprpc) locates the Hexagon skel purely via + # ADSP_LIBRARY_PATH. Point it at the in-container directory where the skels are + # mounted so offload works regardless of the host's on-disk layout. + container_edits = device["containerEdits"] + env = container_edits.setdefault("env", []) + if not any(e.startswith("ADSP_LIBRARY_PATH=") for e in env): + env.append("ADSP_LIBRARY_PATH=/usr/lib/rfsa/adsp") + +print("") +if relocated: + print( + f"Resolved {len(relocated)} mount(s) from a fallback library directory " + "(non-BSP image layout)." + ) + +critical_missing = [m for m in missing if os.path.basename(m) in CRITICAL_BASENAMES] +if missing: + print(f"WARNING: {len(missing)} expected host path(s) were missing and skipped.") +if critical_missing: + print("") + print( + "WARNING: critical QNN/HTP libraries could not be found on this host -- NPU " + "offload will NOT work and detection would fall back to CPU:" + ) + for path in critical_missing: + print(f" {path}") + print( + "Confirm the QAIRT runtime is installed (e.g. the qairt-libs/qairt-tools " + "packages) and that the Hexagon skels exist as real files." + ) + if args.strict: + print("Aborting due to --strict.") + exit(1) + print("") print("Writing to /etc/cdi/cdi-hw-acc.json...") with open("/etc/cdi/cdi-hw-acc.json", "w") as f: diff --git a/docs/docs/frigate/installation.md b/docs/docs/frigate/installation.md index e075db4dff..246b8fa191 100644 --- a/docs/docs/frigate/installation.md +++ b/docs/docs/frigate/installation.md @@ -485,7 +485,9 @@ The Qualcomm integration uses [CDI (Container Device Interface)](https://docs.do #### Prerequisites -- **Qualcomm Linux BSP**: Your board must be running the official Qualcomm Linux Board Support Package image. The QNN runtime libraries (including `libQnnTFLiteDelegate.so` and `libQnnHtp.so`) and NPU device nodes (`/dev/fastrpc-cdsp`) are provided by the BSP and are bind-mounted into the container via CDI. +- **QNN runtime on the host**: The QNN runtime libraries (including `libQnnTFLiteDelegate.so` and `libQnnHtp.so`), the Hexagon "skel" files, and the NPU device nodes (`/dev/fastrpc-cdsp`) must be present on the host; they are bind-mounted into the container via CDI. Both officially-supported images for these boards provide them: + - **Qualcomm Linux BSP** — ships them under the layout the bundled CDI descriptors target (`/usr/lib`, `/usr/lib/rfsa/adsp`). + - **Ubuntu for RB3 Gen 2 / Rubik Pi 3** — install the `qairt-libs` and `qairt-tools` packages from the Qualcomm IoT PPA. These board-select the Hexagon skels into a different directory (`/usr/lib/dsp/cdsp`), and `/usr/lib/rfsa/adsp` may contain self-referential symlink loops; `install_cdi.py` detects this and rewrites the affected mounts to the real files automatically (see below). - **Docker 25.0+**: CDI device support requires Docker 25.0 or later. Check with `docker --version`. - **arm64 architecture**: The Qualcomm Docker image is built for `linux/arm64` only. If building locally, you must run the build on the target board itself. @@ -503,12 +505,13 @@ The Qualcomm integration uses [CDI (Container Device Interface)](https://docs.do sudo python3 install_cdi.py --file cdi-hw-acc-6490.json ``` - This writes a CDI descriptor to `/etc/cdi/cdi-hw-acc.json`. The script will automatically skip any host paths that do not exist on your system. + This writes a CDI descriptor to `/etc/cdi/cdi-hw-acc.json`. For any mount whose default (BSP) path is absent or a broken symlink, the script first tries to resolve the file from the QAIRT layout (e.g. `/usr/lib/dsp/cdsp`) and rewrites the mount to the real file; paths it cannot resolve anywhere are skipped with a warning. If a **critical** QNN/HTP library is missing it prints a prominent warning — and, with `--strict`, exits non-zero — so a misconfigured host fails at install time instead of silently falling back to CPU at runtime. -3. Verify CDI is set up by checking the file exists: +3. Verify the descriptor was written and that it contains the QNN delegate and Hexagon skel mounts (their absence means the QNN runtime is not installed on the host): ```bash ls -l /etc/cdi/cdi-hw-acc.json + grep -oE 'libQnn(TFLiteDelegate|HtpV[0-9]+Skel|System)\.so' /etc/cdi/cdi-hw-acc.json | sort -u ``` #### Setup