├── .clang-format ├── .github ├── ISSUE_TEMPLATE │ ├── 1_feature_request.yml │ ├── 2_bug_report.yml │ └── config.yml └── workflows │ └── stale_issues.yml ├── .gitignore ├── .vscode ├── c_cpp_properties.json ├── launch.json └── settings.json ├── CHANGELOG.rst ├── CMakeLists.txt ├── README.md ├── cmake └── modules │ ├── FindGLEW.cmake │ ├── FindGLIB2.cmake │ ├── FindGObject.cmake │ ├── FindGStreamer.cmake │ ├── FindGStreamerPluginsBase.cmake │ ├── FindNVTegraRelease.cmake │ ├── MacroFindGStreamerLibrary.cmake │ └── MacroLogFeature.cmake ├── gst-zed-data-csv-sink ├── CMakeLists.txt ├── gstzeddatacsvsink.cpp └── gstzeddatacsvsink.h ├── gst-zed-data-mux ├── CMakeLists.txt ├── gstzeddatamux.cpp └── gstzeddatamux.h ├── gst-zed-demux ├── CMakeLists.txt ├── gstzeddemux.cpp └── gstzeddemux.h ├── gst-zed-meta ├── CMakeLists.txt ├── gstzedmeta.cpp └── gstzedmeta.h ├── gst-zed-od-overlay ├── CMakeLists.txt ├── gstzedodoverlay.cpp └── gstzedodoverlay.h ├── gst-zed-rtsp-server ├── CMakeLists.txt └── zed-rtsp-launch.cpp ├── gst-zed-src ├── CMakeLists.txt ├── gstzedsrc.cpp └── gstzedsrc.h ├── gst-zedxone-src ├── CMakeLists.txt ├── gstzedxonesrc.cpp └── gstzedxonesrc.h └── scripts ├── jetson ├── jetson-simple-view.sh ├── local-od-fps_overlay.sh ├── local-rgb-depth-sens-csv.sh ├── local-rgb-od_multi-overlay.sh ├── local-rgb-rescale-od-overlay.sh ├── local-rgb-skel_accurate-overlay.sh ├── local-rgb-skel_fast-overlay.sh ├── local-rgb_left_depth-fps_rendering.sh ├── local-rgb_left_right-fps_rendering.sh ├── network-rgb-h264-receiver.sh ├── network-rgb-h264-sender.sh ├── rtsp-h264-receiver.sh ├── rtsp-rgb-h264-sender.sh ├── simple-depth-fps_rendering.sh ├── simple-fps_rendering.sh ├── zedxone-4k-simple-fps_rendering.sh ├── zedxone-sens-csv.sh ├── zedxone-simple-60-fps_rendering.sh └── zedxone-simple-fps_rendering.sh ├── linux ├── local-od-fps_overlay.sh ├── local-rgb-depth-sens-csv.sh ├── local-rgb-od_multi-overlay.sh ├── local-rgb-rescale-od-overlay.sh ├── local-rgb-skel-and-object-overlay.sh ├── local-rgb-skel_accurate-overlay.sh ├── local-rgb-skel_fast-overlay.sh ├── local-rgb_left_depth-fps_rendering.sh ├── local-rgb_left_right-fps_rendering.sh ├── network-rgb-h264-receiver.sh ├── network-rgb-h264-sender.sh ├── rtsp-h264-receiver.sh ├── rtsp-rgb-h264-sender.sh ├── simple-depth-fps_rendering.sh └── simple-fps_rendering.sh └── windows ├── local-od-fps_overlay.bat ├── local-rgb-depth-sens-csv.bat ├── local-rgb-od_multi-overlay.bat ├── local-rgb-rescale-od-overlay.bat ├── local-rgb-skel_accurate-overlay.bat ├── local-rgb-skel_fast-overlay.bat ├── local-rgb_left_depth-fps_rendering.bat ├── local-rgb_left_right-fps_rendering.bat ├── simple-depth-fps_rendering.bat └── simple-fps_rendering.bat /.clang-format: -------------------------------------------------------------------------------- 1 | --- 2 | # options: https://clang.llvm.org/docs/ClangFormatStyleOptions.html 3 | BasedOnStyle: LLVM 4 | IndentWidth: 4 5 | # Must be 80 characters or less! 6 | ColumnLimit: 100 7 | # does (int) x instead of (int)x 8 | SpaceAfterCStyleCast: true 9 | # spaces, not tabs! 10 | UseTab: Never 11 | # if (x) doStuff() is not allowed, bad style 12 | AllowShortIfStatementsOnASingleLine: false 13 | # 14 | AlignTrailingComments: true 15 | SpacesBeforeTrailingComments: 3 16 | # change the next line to All for Alistair's textbook style 17 | AlwaysBreakAfterReturnType: None 18 | # #define SHORT_NAME 42 19 | # #define LONGER_NAME 0x007f # does nice spacing for macros 20 | #AlignConsecutiveMacros: Consecutive 21 | # use \n instead of \r\n 22 | UseCRLF: false 23 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/1_feature_request.yml: -------------------------------------------------------------------------------- 1 | name: Feature request 🧭 2 | description: Suggest an idea for this project. 3 | labels: "feature_request" 4 | body: 5 | - type: markdown 6 | attributes: 7 | value: | 8 | # Welcome 👋 9 | 10 | Thanks for taking the time to fill out this feature request module. 11 | Please fill out each section below. This info allows Stereolabs developers to correctly evaluate your request. 12 | 13 | Useful Links: 14 | - Documentation: https://www.stereolabs.com/docs/ 15 | - Stereolabs support: https://support.stereolabs.com/hc/en-us/ 16 | - type: checkboxes 17 | attributes: 18 | label: Preliminary Checks 19 | description: Please make sure that you verify each checkbox and follow the instructions for them. 20 | options: 21 | - label: "This issue is not a duplicate. Before opening a new issue, please search existing issues." 22 | required: true 23 | - label: "This issue is not a question, bug report, or anything other than a feature request directly related to this project." 24 | required: true 25 | - type: textarea 26 | attributes: 27 | label: Proposal 28 | description: "What would you like to have as a new feature?" 29 | placeholder: "A clear and concise description of what you want to happen." 30 | validations: 31 | required: true 32 | - type: textarea 33 | attributes: 34 | label: Use-Case 35 | description: "How would this help you?" 36 | placeholder: "Tell us more what you'd like to achieve." 37 | validations: 38 | required: false 39 | - type: textarea 40 | id: anything-else 41 | attributes: 42 | label: Anything else? 43 | description: "Let us know if you have anything else to share" 44 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/2_bug_report.yml: -------------------------------------------------------------------------------- 1 | name: Bug Report 🐛 2 | description: Something isn't working as expected? Report your bugs here. 3 | labels: "bug" 4 | body: 5 | - type: markdown 6 | attributes: 7 | value: | 8 | # Welcome 👋 9 | 10 | Thanks for taking the time to fill out this bug report. 11 | Please fill out each section below. This info allows Stereolabs developers to diagnose (and fix!) your issue as quickly as possible. Otherwise we might need to close the issue without e.g. clear reproduction steps. 12 | 13 | Bug reports also shoulnd't be used for generic questions, please use the [Stereolabs Community forum](https://community.stereolabs.com/) instead. 14 | 15 | Useful Links: 16 | - Documentation: https://www.stereolabs.com/docs/ 17 | - Stereolabs support: https://support.stereolabs.com/hc/en-us/ 18 | - type: checkboxes 19 | attributes: 20 | label: Preliminary Checks 21 | description: Please make sure that you verify each checkbox and follow the instructions for them. 22 | options: 23 | - label: "This issue is not a duplicate. Before opening a new issue, please search existing issues." 24 | required: true 25 | - label: "This issue is not a question, feature request, or anything other than a bug report directly related to this project." 26 | required: true 27 | - type: textarea 28 | attributes: 29 | label: Description 30 | description: Describe the issue that you're seeing. 31 | placeholder: Be as precise as you can. Feel free to share screenshots, videos, or data. The more information you provide the easier will be to provide you with a fast solution. 32 | validations: 33 | required: true 34 | - type: textarea 35 | attributes: 36 | label: Steps to Reproduce 37 | description: Clear steps describing how to reproduce the issue. 38 | value: | 39 | 1. 40 | 2. 41 | 3. 42 | ... 43 | validations: 44 | required: true 45 | - type: textarea 46 | attributes: 47 | label: Expected Result 48 | description: Describe what you expected to happen. 49 | validations: 50 | required: true 51 | - type: textarea 52 | attributes: 53 | label: Actual Result 54 | description: Describe what actually happened. 55 | validations: 56 | required: true 57 | - type: dropdown 58 | attributes: 59 | label: ZED Camera model 60 | description: What model of ZED camera are you using? 61 | options: 62 | - "ZED" 63 | - "ZED Mini" 64 | - "ZED2" 65 | - "ZED2i" 66 | validations: 67 | required: true 68 | - type: textarea 69 | attributes: 70 | label: Environment 71 | render: shell 72 | description: Useful information about your system. 73 | placeholder: | 74 | OS: Operating System 75 | CPU: e.g. ARM 76 | GPU: Nvidia Jetson Xavier NX 77 | ZED SDK version: e.g. v3.5.3 78 | Other info: e.g. ROS Melodic 79 | validations: 80 | required: true 81 | - type: textarea 82 | attributes: 83 | label: Anything else? 84 | description: Please add any other information or comment that you think may be useful for solving the problem 85 | placeholder: 86 | validations: 87 | required: false 88 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Online Documentation 4 | url: https://www.stereolabs.com/docs/ 5 | about: Check out the Stereolabs documentation for answers to common questions. 6 | - name: Stereolabs Community 7 | url: https://community.stereolabs.com/ 8 | about: Ask questions, request features & discuss with other users and developers. 9 | - name: Stereolabs Twitter 10 | url: https://twitter.com/Stereolabs3D 11 | about: The official Stereolabs Twitter account to ask questions, comment our products and share your projects with the ZED community. 12 | 13 | -------------------------------------------------------------------------------- /.github/workflows/stale_issues.yml: -------------------------------------------------------------------------------- 1 | name: 'Stale issue handler' 2 | on: 3 | workflow_dispatch: 4 | schedule: 5 | - cron: '00 00 * * *' 6 | 7 | jobs: 8 | stale: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/stale@main 12 | id: stale 13 | with: 14 | stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment otherwise it will be automatically closed in 5 days' 15 | stale-pr-message: 'This PR is stale because it has been open 30 days with no activity. Remove stale label or comment otherwise it will be automatically closed in 5 days' 16 | days-before-stale: 30 17 | days-before-close: 5 18 | operations-per-run: 1500 19 | exempt-issue-labels: 'feature_request' 20 | exempt-pr-labels: 'feature_request' 21 | enable-statistics: 'true' 22 | close-issue-label: 'closed_for_stale' 23 | close-pr-label: 'closed_for_stale' 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | aclocal.m4 2 | autom4te.cache 3 | autoregen.sh 4 | config.* 5 | configure 6 | libtool 7 | INSTALL 8 | Makefile.in 9 | depcomp 10 | install-sh 11 | ltmain.sh 12 | missing 13 | stamp-* 14 | my-plugin-*.tar.* 15 | *~ 16 | *.autosave 17 | *.user 18 | *.user.* 19 | <<<<<<< HEAD 20 | *build* 21 | ======= 22 | >>>>>>> master 23 | 24 | -------------------------------------------------------------------------------- /.vscode/c_cpp_properties.json: -------------------------------------------------------------------------------- 1 | { 2 | "configurations": [ 3 | { 4 | "name": "CMake", 5 | "compileCommands": "${workspaceFolder}/build/compile_commands.json", 6 | "configurationProvider": "ms-vscode.cmake-tools" 7 | } 8 | ], 9 | "version": 4 10 | } -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "(gdb) Launch", 6 | "type": "cppdbg", 7 | "request": "launch", 8 | // Resolved by CMake Tools: 9 | "program": "${command:cmake.launchTargetPath}", 10 | "args": ["${workspaceFolder}/example_config.json"], 11 | "stopAtEntry": false, 12 | "cwd": "${workspaceFolder}", 13 | "environment": [ 14 | { 15 | // add the directory where our target was built to the PATHs 16 | // it gets resolved by CMake Tools: 17 | "name": "PATH", 18 | "value": "$PATH:${command:cmake.launchTargetDirectory}" 19 | }, 20 | { 21 | "name": "OTHER_VALUE", 22 | "value": "Something something" 23 | } 24 | ], 25 | "externalConsole": true, 26 | "MIMode": "gdb", 27 | "setupCommands": [ 28 | { 29 | "description": "Enable pretty-printing for gdb", 30 | "text": "-enable-pretty-printing", 31 | "ignoreFailures": true 32 | } 33 | ] 34 | } 35 | ] 36 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "C_Cpp.default.compilerPath": "/usr/bin/g++-9", 3 | "editor.formatOnSave": true, 4 | "editor.formatOnPaste": false, 5 | "cmake.debugConfig": { 6 | "stopAtEntry": false, 7 | "args": [], 8 | "MIMode": "gdb", 9 | "externalConsole": false, 10 | }, 11 | "files.associations": { 12 | "cctype": "cpp", 13 | "clocale": "cpp", 14 | "cmath": "cpp", 15 | "csignal": "cpp", 16 | "cstdarg": "cpp", 17 | "cstddef": "cpp", 18 | "cstdio": "cpp", 19 | "cstdlib": "cpp", 20 | "cstring": "cpp", 21 | "ctime": "cpp", 22 | "cwchar": "cpp", 23 | "cwctype": "cpp", 24 | "any": "cpp", 25 | "array": "cpp", 26 | "atomic": "cpp", 27 | "strstream": "cpp", 28 | "bit": "cpp", 29 | "*.tcc": "cpp", 30 | "bitset": "cpp", 31 | "cfenv": "cpp", 32 | "chrono": "cpp", 33 | "cinttypes": "cpp", 34 | "codecvt": "cpp", 35 | "compare": "cpp", 36 | "complex": "cpp", 37 | "concepts": "cpp", 38 | "condition_variable": "cpp", 39 | "cstdint": "cpp", 40 | "deque": "cpp", 41 | "forward_list": "cpp", 42 | "list": "cpp", 43 | "map": "cpp", 44 | "set": "cpp", 45 | "string": "cpp", 46 | "unordered_map": "cpp", 47 | "unordered_set": "cpp", 48 | "vector": "cpp", 49 | "exception": "cpp", 50 | "algorithm": "cpp", 51 | "functional": "cpp", 52 | "iterator": "cpp", 53 | "memory": "cpp", 54 | "memory_resource": "cpp", 55 | "numeric": "cpp", 56 | "optional": "cpp", 57 | "random": "cpp", 58 | "ratio": "cpp", 59 | "string_view": "cpp", 60 | "system_error": "cpp", 61 | "tuple": "cpp", 62 | "type_traits": "cpp", 63 | "utility": "cpp", 64 | "fstream": "cpp", 65 | "future": "cpp", 66 | "initializer_list": "cpp", 67 | "iomanip": "cpp", 68 | "iosfwd": "cpp", 69 | "iostream": "cpp", 70 | "istream": "cpp", 71 | "limits": "cpp", 72 | "mutex": "cpp", 73 | "new": "cpp", 74 | "numbers": "cpp", 75 | "ostream": "cpp", 76 | "semaphore": "cpp", 77 | "shared_mutex": "cpp", 78 | "sstream": "cpp", 79 | "stdexcept": "cpp", 80 | "stop_token": "cpp", 81 | "streambuf": "cpp", 82 | "thread": "cpp", 83 | "typeindex": "cpp", 84 | "typeinfo": "cpp", 85 | "valarray": "cpp", 86 | "variant": "cpp", 87 | "__nullptr": "cpp", 88 | "core": "cpp", 89 | "__hash_table": "cpp", 90 | "__split_buffer": "cpp", 91 | "__tree": "cpp", 92 | "queue": "cpp", 93 | "stack": "cpp", 94 | "locale": "cpp", 95 | "*.ipp": "cpp", 96 | "ranges": "cpp", 97 | "__node_handle": "cpp", 98 | "filesystem": "cpp", 99 | "__bit_reference": "cpp", 100 | "__functional_03": "cpp", 101 | "__mutex_base": "cpp" 102 | }, 103 | "C_Cpp.errorSquiggles": "disabled", 104 | "editor.tabSize": 4 105 | } -------------------------------------------------------------------------------- /CHANGELOG.rst: -------------------------------------------------------------------------------- 1 | LATEST CHANGES 2 | ============== 3 | 4 | 2025-04-24 5 | ---------- 6 | - Fix build issues with SDK 5.0 EA on Jetson 7 | 8 | 2025-04-18 9 | ---------- 10 | - Add support for ZED SDK v5.0 EA 11 | 12 | ZED SDK v4.2.5 13 | -------------- 14 | 15 | - Add ZED SDK v4.1 compatibility 16 | - Add support to `NEURAL_PLUS` depth mode 17 | - Add runtime update of Gain and Exposure. Thx @ryanppeters 18 | - Add new property `positional-tracking-mode` to select `GEN_1` and `GEN_2` 19 | - Add new `zedxonesrc` element to get ZED X One color stream and control the camera 20 | - The `zedxonesrc` element now uses the ZED SDK object `sl::CameraOne` instead of the `zedx-one-capture` library 21 | * ZED X One images are now automatically rectified 22 | * ZED X One IMU data can be retrieved as image metadata 23 | * ZED X One 4K supports HDR mode 24 | 25 | ZED SDK v4.0.8 26 | -------------- 27 | 28 | * Compatible with ZED SDK v4.0.y 29 | * Add support for ZED X and ZED X Mini cameras 30 | * Update `camera-resolution` and `camera-fps` parameters to match the new options 31 | * Add new `jetson` script folder 32 | * `sdk-verbose` is now an integer [0,1000] parameter 33 | * `depth-stabilization` is now an integer [0,100] parameter 34 | * Add new property `od-detection-filter-mode` 35 | * Add new property `od-conf-person` 36 | * Add new property `od-conf-vehicle` 37 | * Add new property `od-conf-bag` 38 | * Add new property `od-conf-animal` 39 | * Add new property `od-conf-electronics` 40 | * Add new property `od-conf-fruit-vegetables` 41 | * Add new property `od-conf-electronics` 42 | * Add new property `od-conf-sport` 43 | * Change `sensing-mode` to `fill-mode` 44 | * Add new property `bt-allow-red-prec` 45 | * Add new property `bt-body-fitting` 46 | * Add new property `bt-body-tracking` 47 | * Add new property `bt-confidence ` 48 | * Add new property `bt-detection-model` 49 | * Add new property `bt-enabled` 50 | * Add new property `bt-format` 51 | * Add new property `bt-image-sync` 52 | * Add new property `bt-max-range` 53 | * Add new property `bt-min-keypoints` 54 | * Add new property `bt-prediction-timeout-s` 55 | * Add new property `bt-smoothing` 56 | * Change `aec-agc` to `ctrl-aec-agc` 57 | * Change `aec-agc-roi-h` to `ctrl-aec-agc-roi-h` 58 | * Change `aec-agc-roi-side` to `ctrl-aec-agc-roi-side` 59 | * Change `aec-agc-roi-w` to `ctrl-aec-agc-roi-w` 60 | * Change `aec-agc-roi-x` to `ctrl-aec-agc-roi-x` 61 | * Change `aec-agc-roi-y` to `ctrl-aec-agc-roi-y` 62 | * Change `brightness` to `ctrl-brightness` 63 | * Change `contrast` to `ctrl-contrast` 64 | * Change `exposure` to `ctrl-exposure` 65 | * Change `gain` to `ctrl-gain` 66 | * Change `gamma` to `ctrl-gamma` 67 | * Change `hue` to `ctrl-hue` 68 | * Change `led-status` to `ctrl-led-status` 69 | * Change `saturation` to `ctrl-saturation` 70 | * Change `sharpness` to `ctrl-sharpness` 71 | * Change `whitebalance-auto` to `ctrl-whitebalance-auto` 72 | * Change `whitebalance-temperature` to `ctrl-whitebalance-temperature` 73 | 74 | ZED SDK v3.8 75 | ------------- 76 | 77 | - Add support for Region of Interest [Thx @ryanppeters] 78 | * Add `roi` parameter 79 | * Add `roi-x` parameter 80 | * Add `roi-y` parameter 81 | * Add `roi-w` parameter 82 | * Add `roi-h` parameter 83 | - Add `set-gravity-as-origin` property [Thx @ryanppeters] 84 | - Add `od-prediction-timeout-s` property [Thx @ryanppeters] 85 | - Add `od-allow-reduced-precision-inference` property [Thx @ryanppeters] 86 | - Add new field `frame_id` to `GstZedSrcMeta` in order to track the meta/buffer throughout the GStreamer pipeline (when working with source code) [Thx @ryanppeters] 87 | - Add support for new Object Detection models in `od-detection-model` (Person Head and Person Head ACCURATE) 88 | 89 | ZED SDK v3.7 90 | ------------- 91 | 92 | - Fix issue with texture confidence threshold invalidating the depth map 93 | - Add support for NEURAL depth mode 94 | 95 | ZED SDK v3.5 96 | ------------- 97 | 98 | - Add compatibility fix for ZED SDK v3.5 99 | - Add support for new camera model "ZED 2i" 100 | - Improve Depth Handling and new `zedsrc` parameters 101 | - Depth mode has now a default value of NONE. 102 | To disable the depth elaboration it is also necessary to disable the positional tracking and the object detection, 103 | so the values of the relative activation options have been set to false as default. 104 | The zedsrc element now starts without performing any depth elaboration with the default settings. 105 | - Add new object detection models: 106 | * GST_ZEDSRC_OD_MULTI_CLASS_BOX_MEDIUM 107 | * GST_ZEDSRC_OD_HUMAN_BODY_MEDIUM 108 | - Add support for object subclasses 109 | - New Positional Tracking parameters 110 | * area-file-path 111 | * enable-area-memory 112 | * enable-imu-fusion 113 | * enable-pos 114 | * set-floor-as-origine-smoothing 115 | * initial-world-transform-x 116 | * initial-world-transform-y 117 | * initial-world-transform-z 118 | * initial-world-transform-roll 119 | * initial-world-transform-pitch 120 | * initial-world-transform-yaw 121 | - New Runtime parameters 122 | * confidence-threshold 123 | * sensing-mode 124 | * texture-confidence-threshold 125 | * measure3D-reference-frame 126 | - New Object Detection parameters 127 | * od-max-range 128 | * od-body-fitting 129 | - Change parameters names in `zedsrc` to match the names in the ZED SDK: 130 | * resolution -> camera-resolution 131 | * framerate -> camera-fps 132 | * camera-is-static -> set-as-static 133 | * object-detection-image-sync -> od-image-sync 134 | * object-detection-tracking -> od-enable-tracking 135 | * object-detection-confidence -> od-confidence 136 | 137 | ZED SDK v3.4 138 | ------------- 139 | 140 | - Add compatibility fix for ZED SDK v3.4 141 | - Add support for UINT16 Depth map 142 | 143 | ZED SDK v3.3 (2020-11-27) 144 | -------------------------- 145 | 146 | - Add compatibility fix for ZED SDK v3.3 147 | - Add support for multiple OD class 148 | - Add support for MULTICLASS ACCURATE 149 | 150 | Release v0.1 (2020-08-24) 151 | -------------------------- 152 | 153 | - ZED GStreamer package for Linux and Windows 154 | - zedsrc: acquires camera color image and depth map and pushes them in a GStreamer pipeline. 155 | - zedmeta: GStreamer library to define and handle the ZED metadata (Positional Tracking data, Sensors data, Detected Object data, Detected Skeletons data). 156 | - zeddemux: receives a composite zedsrc stream (color left + color right data or color left + depth map + metadata), processes the eventual depth data and pushes them in two separated new streams named src_left and src_aux. A third source pad is created for metadata to be externally processed. 157 | - zeddatamux: receive a video stream compatible with ZED caps and a ZED Data Stream generated by the zeddemux and adds metadata to the video stream. This is useful if metadata are removed by a filter that does not automatically propagate metadata 158 | - zeddatacsvsink: example sink plugin that receives ZED metadata, extracts the Positional Tracking and the Sensors Data and save them in a CSV file. 159 | - zedodoverlay: example transform filter plugin that receives ZED combined stream with metadata, extracts Object Detection information and draws the overlays on the oncoming filter 160 | - RTSP Server: application for Linux that instantiates an RTSP server from a text launch pipeline "gst-launch" like. 161 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION "3.6") 2 | 3 | project(gst-plugins-zed) 4 | 5 | ################################################ 6 | ## Generate symbols for IDE indexer (VSCode) 7 | set(CMAKE_EXPORT_COMPILE_COMMANDS ON) 8 | 9 | # Default to C99 10 | if(NOT CMAKE_C_STANDARD) 11 | set(CMAKE_C_STANDARD 99) 12 | endif() 13 | 14 | # Default to C++14 15 | if(NOT CMAKE_CXX_STANDARD) 16 | set(CMAKE_CXX_STANDARD 14) 17 | endif() 18 | 19 | add_definitions(-Werror=return-type) 20 | 21 | set(CMAKE_SHARED_MODULE_PREFIX "lib") 22 | set(CMAKE_SHARED_LIBRARY_PREFIX "lib") 23 | 24 | # add local cmake modules 25 | list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules) 26 | 27 | include(FindNVTegraRelease) 28 | FindNVTegraRelease() 29 | 30 | if(L4T_FOUND) 31 | message("Running on NVIDIA Jetson") 32 | message(" * Found L4T v${L4T_RELEASE}.${L4T_REVISION}.${L4T_PATCH}") 33 | endif() 34 | 35 | include(MacroLogFeature) 36 | 37 | find_package(GStreamer REQUIRED COMPONENTS base) 38 | macro_log_feature(GSTREAMER_FOUND "GStreamer" "Required to build ${proj_name}" "http://gstreamer.freedesktop.org/" TRUE "1.2.0") 39 | macro_log_feature(GSTREAMER_BASE_LIBRARY_FOUND "GStreamer base library" "Required to build ${proj_name}" "http://gstreamer.freedesktop.org/" TRUE "1.2.0") 40 | 41 | find_package(GStreamerPluginsBase COMPONENTS video) 42 | macro_log_feature(GSTREAMER_VIDEO_LIBRARY_FOUND "GStreamer video library" "Required to build ${proj_name}" "http://gstreamer.freedesktop.org/" TRUE "1.2.0") 43 | 44 | find_package(GLIB2 REQUIRED) 45 | macro_log_feature(GLIB2_FOUND "GLib" "Required to build ${proj_name}" "http://www.gtk.org/" TRUE) 46 | 47 | find_package(GObject REQUIRED) 48 | macro_log_feature(GOBJECT_FOUND "GObject" "Required to build ${proj_name}" "http://www.gtk.org/" TRUE) 49 | 50 | find_package(ZED 3) 51 | macro_log_feature(ZED_FOUND "ZED SDK" "Required to build 'gstzed'" "https://www.stereolabs.com" FALSE "3") 52 | 53 | find_package(CUDA ${ZED_CUDA_VERSION} EXACT) 54 | macro_log_feature(CUDA_FOUND "Nvidia CUDA library" "Required to build 'gstzed'" "http://www.nvidia.com" FALSE "${ZED_CUDA_VERSION}") 55 | 56 | find_package(OpenCV) 57 | macro_log_feature(OpenCV_FOUND "OpenCV library" "Required to build 'gstzedodoverlay'" "http://www.opencv.org" FALSE) 58 | 59 | if(NOT WIN32) 60 | pkg_check_modules(GSTRTSPSERVER gstreamer-rtsp-server-1.0>=1.14.5) 61 | macro_log_feature(GSTRTSPSERVER_FOUND "GSTREAMER RTSP SERVER library" "Required to build 'gstrtspserver'" "http://gstreamer.freedesktop.org/" FALSE "1.14.5") 62 | endif() 63 | 64 | # Setup common environment 65 | include_directories( 66 | . 67 | ${GSTREAMER_INCLUDE_DIR} 68 | ${GLIB2_INCLUDE_DIR} 69 | ) 70 | 71 | # values used when registering plugins 72 | add_definitions(-DGST_PACKAGE_VERSION="5.0") 73 | add_definitions(-DGST_PACKAGE_LICENSE="LGPL") 74 | add_definitions(-DGST_PACKAGE_ORIGIN="https://github.com/stereolabs/zed-gstreamer") 75 | add_definitions(-DGST_PACKAGE_NAME="${CMAKE_PROJECT_NAME}") 76 | add_definitions(-DPACKAGE="${CMAKE_PROJECT_NAME} package") 77 | 78 | add_definitions(-Werror=return-type) 79 | 80 | if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) 81 | if(WIN32) 82 | get_filename_component(_PREFIX "${GSTREAMER_PLUGIN_DIR}/../../" REALPATH) 83 | else() 84 | # set(_PREFIX "/usr/lib") 85 | get_filename_component(_PREFIX "${GSTREAMER_PLUGIN_DIR}/../" REALPATH) 86 | endif () 87 | set(CMAKE_INSTALL_PREFIX "${_PREFIX}" 88 | CACHE PATH "Common prefix for all installed files (e.g., plugins will be installed under CMAKE_INSTALL_PREFIX/gstreamer-1.0)" FORCE) 89 | endif() 90 | 91 | if(NOT LIBRARY_INSTALL_DIR) 92 | set(LIBRARY_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/" 93 | CACHE PATH "Location to install libraries (e.g., libgstklv-1.0-0.so/dll)") 94 | endif() 95 | if(NOT PLUGIN_INSTALL_DIR) 96 | if(WIN32) 97 | set(PLUGIN_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib/gstreamer-1.0/" 98 | CACHE PATH "Location to install plugins (e.g., libgstpylon.so/dll)") 99 | else() 100 | set(PLUGIN_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/gstreamer-1.0/" 101 | CACHE PATH "Location to install plugins (e.g., libgstpylon.so/dll)") 102 | endif() 103 | endif() 104 | if (WIN32 AND NOT PDB_INSTALL_DIR) 105 | set(PDB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib/gstreamer-1.0/" 106 | CACHE PATH "Location to install PDB debug files (e.g., libgstpylon.pdb)") 107 | endif() 108 | if(NOT INCLUDE_INSTALL_DIR) 109 | if(WIN32) 110 | set(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include/gstreamer-1.0/gst/zed/" 111 | CACHE PATH "Location to install include headers" FORCE) 112 | else() 113 | get_filename_component(INC_PREFIX "${GSTREAMER_PLUGIN_DIR}/../../../" REALPATH) 114 | set(INCLUDE_INSTALL_DIR "${INC_PREFIX}/include/gstreamer-1.0/gst/zed/" 115 | CACHE PATH "Location to install include headers" FORCE) 116 | endif() 117 | endif() 118 | if(NOT EXE_INSTALL_DIR) 119 | if(WIN32) 120 | set(EXE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/bin" 121 | CACHE PATH "Location to install executables" FORCE) 122 | else() 123 | set(EXE_INSTALL_DIR "/usr/bin" 124 | CACHE PATH "Location to install executables" FORCE) 125 | endif() 126 | endif() 127 | 128 | message("") 129 | message("Plugin install dir:") 130 | message(${PLUGIN_INSTALL_DIR}) 131 | message("") 132 | message("Library install dir:") 133 | message(${LIBRARY_INSTALL_DIR}) 134 | message("") 135 | message("Include install dir:") 136 | message(${INCLUDE_INSTALL_DIR}) 137 | message("") 138 | message("Executable install dir:") 139 | message(${EXE_INSTALL_DIR}) 140 | message("") 141 | 142 | add_subdirectory(gst-zed-meta) 143 | if(ZED_FOUND) 144 | add_subdirectory(gst-zed-src) 145 | else() 146 | message( "ZED SDK not available. 'zedsrc' will not be installed") 147 | endif() 148 | if(L4T_FOUND) 149 | if(${L4T_RELEASE} EQUAL "35") 150 | if(${L4T_REVISION} EQUAL "3" OR ${L4T_REVISION} EQUAL "4" ) 151 | add_subdirectory(gst-zedxone-src) 152 | endif() 153 | elseif(${L4T_RELEASE} EQUAL "36") 154 | if(${L4T_REVISION} GREATER_EQUAL "3") 155 | add_subdirectory(gst-zedxone-src) 156 | endif() 157 | endif() 158 | endif() 159 | add_subdirectory(gst-zed-demux) 160 | add_subdirectory(gst-zed-data-mux) 161 | add_subdirectory(gst-zed-data-csv-sink) 162 | if(OpenCV_FOUND) 163 | add_subdirectory(gst-zed-od-overlay) 164 | else() 165 | message( "OpenCV not available. 'gstzedodoverlay' will not be installed") 166 | endif() 167 | if(GSTRTSPSERVER_FOUND) 168 | add_subdirectory(gst-zed-rtsp-server) 169 | else() 170 | message( "GstRTSPServer not available. 'gst-zed-rtsp-launch' will not be installed") 171 | endif() 172 | 173 | #################################################################### 174 | # USEFUL FILES 175 | FILE(GLOB_RECURSE doc_files ${CMAKE_SOURCE_DIR}/*.md ${CMAKE_SOURCE_DIR}/*.rst) 176 | add_custom_target("DOCS" SOURCES ${doc_files}) 177 | FILE(GLOB_RECURSE script_files ${CMAKE_SOURCE_DIR}/scripts/*) 178 | add_custom_target("SCRIPTS" SOURCES ${script_files}) 179 | #################################################################### 180 | 181 | macro_display_feature_log() 182 | -------------------------------------------------------------------------------- /cmake/modules/FindGLEW.cmake: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2009 Boudewijn Rempt 2 | # 3 | # Redistribution and use is allowed according to the terms of the BSD license. 4 | # For details see the accompanying COPYING-CMAKE-SCRIPTS file. 5 | # 6 | # - try to find glew library and include files 7 | # GLEW_INCLUDE_DIR, where to find GL/glew.h, etc. 8 | # GLEW_LIBRARIES, the libraries to link against 9 | # GLEW_FOUND, If false, do not try to use GLEW. 10 | # Also defined, but not for general use are: 11 | # GLEW_GLEW_LIBRARY = the full path to the glew library. 12 | 13 | IF (WIN32) 14 | 15 | IF(CYGWIN) 16 | 17 | FIND_PATH( GLEW_INCLUDE_DIR GL/glew.h) 18 | 19 | FIND_LIBRARY( GLEW_GLEW_LIBRARY glew32 20 | ${OPENGL_LIBRARY_DIR} 21 | /usr/lib/w32api 22 | /usr/X11R6/lib 23 | ) 24 | 25 | 26 | ELSE(CYGWIN) 27 | 28 | FIND_PATH( GLEW_INCLUDE_DIR GL/glew.h 29 | $ENV{GLEW_ROOT_PATH}/include 30 | ) 31 | 32 | FIND_LIBRARY( GLEW_GLEW_LIBRARY 33 | NAMES glew glew32 34 | PATHS 35 | $ENV{GLEW_ROOT_PATH}/lib 36 | ${OPENGL_LIBRARY_DIR} 37 | ) 38 | 39 | ENDIF(CYGWIN) 40 | 41 | ELSE (WIN32) 42 | 43 | IF (APPLE) 44 | # These values for Apple could probably do with improvement. 45 | FIND_PATH( GLEW_INCLUDE_DIR glew.h 46 | /System/Library/Frameworks/GLEW.framework/Versions/A/Headers 47 | ${OPENGL_LIBRARY_DIR} 48 | ) 49 | SET(GLEW_GLEW_LIBRARY "-framework GLEW" CACHE STRING "GLEW library for OSX") 50 | SET(GLEW_cocoa_LIBRARY "-framework Cocoa" CACHE STRING "Cocoa framework for OSX") 51 | ELSE (APPLE) 52 | 53 | FIND_PATH( GLEW_INCLUDE_DIR GL/glew.h 54 | /usr/include/GL 55 | /usr/openwin/share/include 56 | /usr/openwin/include 57 | /usr/X11R6/include 58 | /usr/include/X11 59 | /opt/graphics/OpenGL/include 60 | /opt/graphics/OpenGL/contrib/libglew 61 | ) 62 | 63 | FIND_LIBRARY( GLEW_GLEW_LIBRARY GLEW 64 | /usr/openwin/lib 65 | /usr/X11R6/lib 66 | ) 67 | 68 | ENDIF (APPLE) 69 | 70 | ENDIF (WIN32) 71 | 72 | SET( GLEW_FOUND "NO" ) 73 | IF(GLEW_INCLUDE_DIR) 74 | IF(GLEW_GLEW_LIBRARY) 75 | # Is -lXi and -lXmu required on all platforms that have it? 76 | # If not, we need some way to figure out what platform we are on. 77 | SET( GLEW_LIBRARIES 78 | ${GLEW_GLEW_LIBRARY} 79 | ${GLEW_cocoa_LIBRARY} 80 | ) 81 | SET( GLEW_FOUND "YES" ) 82 | 83 | #The following deprecated settings are for backwards compatibility with CMake1.4 84 | SET (GLEW_LIBRARY ${GLEW_LIBRARIES}) 85 | SET (GLEW_INCLUDE_PATH ${GLEW_INCLUDE_DIR}) 86 | 87 | ENDIF(GLEW_GLEW_LIBRARY) 88 | ENDIF(GLEW_INCLUDE_DIR) 89 | 90 | IF(GLEW_FOUND) 91 | IF(NOT GLEW_FIND_QUIETLY) 92 | MESSAGE(STATUS "Found Glew: ${GLEW_LIBRARIES}") 93 | ENDIF(NOT GLEW_FIND_QUIETLY) 94 | ELSE(GLEW_FOUND) 95 | IF(GLEW_FIND_REQUIRED) 96 | MESSAGE(FATAL_ERROR "Could not find Glew") 97 | ENDIF(GLEW_FIND_REQUIRED) 98 | ENDIF(GLEW_FOUND) 99 | 100 | MARK_AS_ADVANCED( 101 | GLEW_INCLUDE_DIR 102 | GLEW_GLEW_LIBRARY 103 | GLEW_Xmu_LIBRARY 104 | GLEW_Xi_LIBRARY 105 | ) 106 | -------------------------------------------------------------------------------- /cmake/modules/FindGLIB2.cmake: -------------------------------------------------------------------------------- 1 | # - Try to find the GLIB2 libraries 2 | # Once done this will define 3 | # 4 | # GLIB2_FOUND - system has glib2 5 | # GLIB2_INCLUDE_DIR - the glib2 include directory 6 | # GLIB2_LIBRARIES - glib2 library 7 | 8 | # Copyright (c) 2008 Laurent Montel, 9 | # 10 | # Redistribution and use is allowed according to the terms of the BSD license. 11 | # For details see the accompanying COPYING-CMAKE-SCRIPTS file. 12 | 13 | 14 | if(GLIB2_INCLUDE_DIR AND GLIB2_LIBRARIES) 15 | # Already in cache, be silent 16 | set(GLIB2_FIND_QUIETLY TRUE) 17 | endif(GLIB2_INCLUDE_DIR AND GLIB2_LIBRARIES) 18 | 19 | if (NOT WIN32) 20 | find_package(PkgConfig REQUIRED) 21 | pkg_check_modules(PKG_GLIB REQUIRED glib-2.0) 22 | endif(NOT WIN32) 23 | 24 | if (NOT GSTREAMER_ROOT) 25 | if (CMAKE_SIZEOF_VOID_P MATCHES "8") 26 | set(GSTREAMER_ROOT $ENV{GSTREAMER_1_0_ROOT_X86_64}) 27 | else () 28 | set(GSTREAMER_ROOT $ENV{GSTREAMER_1_0_ROOT_X86}) 29 | endif () 30 | endif () 31 | 32 | find_path(GLIB2_MAIN_INCLUDE_DIR glib.h 33 | PATH_SUFFIXES glib-2.0 34 | HINTS ${PKG_GLIB_INCLUDE_DIRS} ${PKG_GLIB_INCLUDEDIR} ${GSTREAMER_ROOT}/include) 35 | 36 | # search the glibconfig.h include dir under the same root where the library is found 37 | find_library(GLIB2_LIBRARIES 38 | NAMES glib-2.0 39 | HINTS ${PKG_GLIB_LIBRARY_DIRS} ${PKG_GLIB_LIBDIR} ${GSTREAMER_ROOT}/lib) 40 | 41 | find_path(GLIB2_INTERNAL_INCLUDE_DIR glibconfig.h 42 | PATH_SUFFIXES glib-2.0/include ../lib/glib-2.0/include 43 | HINTS ${PKG_GLIB_INCLUDE_DIRS} ${PKG_GLIB_LIBRARIES} ${CMAKE_SYSTEM_LIBRARY_PATH} ${GSTREAMER_ROOT}/lib) 44 | 45 | set(GLIB2_INCLUDE_DIR ${GLIB2_MAIN_INCLUDE_DIR}) 46 | 47 | # not sure if this include dir is optional or required 48 | # for now it is optional 49 | if(GLIB2_INTERNAL_INCLUDE_DIR) 50 | set(GLIB2_INCLUDE_DIR ${GLIB2_INCLUDE_DIR} ${GLIB2_INTERNAL_INCLUDE_DIR}) 51 | endif(GLIB2_INTERNAL_INCLUDE_DIR) 52 | 53 | include(FindPackageHandleStandardArgs) 54 | find_package_handle_standard_args(GLIB2 DEFAULT_MSG GLIB2_LIBRARIES GLIB2_MAIN_INCLUDE_DIR) 55 | 56 | mark_as_advanced(GLIB2_INCLUDE_DIR GLIB2_LIBRARIES) 57 | 58 | 59 | find_program(GLIB2_GENMARSHAL_UTIL glib-genmarshal) 60 | 61 | macro(glib2_genmarshal output_name) 62 | file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/genmarshal_tmp) 63 | foreach(_declaration ${ARGN}) 64 | file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/genmarshal_tmp "${_declaration}\n") 65 | endforeach() 66 | add_custom_command( 67 | OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${output_name}.h ${CMAKE_CURRENT_BINARY_DIR}/${output_name}.c 68 | COMMAND ${GLIB2_GENMARSHAL_UTIL} --header genmarshal_tmp > ${output_name}.h 69 | COMMAND ${GLIB2_GENMARSHAL_UTIL} --body genmarshal_tmp > ${output_name}.c 70 | WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} 71 | ) 72 | endmacro() 73 | -------------------------------------------------------------------------------- /cmake/modules/FindGObject.cmake: -------------------------------------------------------------------------------- 1 | # - Try to find GObject 2 | # Once done this will define 3 | # 4 | # GOBJECT_FOUND - system has GObject 5 | # GOBJECT_INCLUDE_DIR - the GObject include directory 6 | # GOBJECT_LIBRARIES - the libraries needed to use GObject 7 | # GOBJECT_DEFINITIONS - Compiler switches required for using GObject 8 | 9 | # Copyright (c) 2006, Tim Beaulen 10 | # Copyright (c) 2008 Helio Chissini de Castro, 11 | # 12 | # Redistribution and use is allowed according to the terms of the BSD license. 13 | # For details see the accompanying COPYING-CMAKE-SCRIPTS file. 14 | 15 | 16 | IF (GOBJECT_INCLUDE_DIR AND GOBJECT_LIBRARIES) 17 | # in cache already 18 | SET(GObject_FIND_QUIETLY TRUE) 19 | ELSE (GOBJECT_INCLUDE_DIR AND GOBJECT_LIBRARIES) 20 | SET(GObject_FIND_QUIETLY FALSE) 21 | ENDIF (GOBJECT_INCLUDE_DIR AND GOBJECT_LIBRARIES) 22 | 23 | IF (NOT WIN32) 24 | FIND_PACKAGE(PkgConfig REQUIRED) 25 | # use pkg-config to get the directories and then use these values 26 | # in the FIND_PATH() and FIND_LIBRARY() calls 27 | PKG_CHECK_MODULES(PKG_GOBJECT2 REQUIRED gobject-2.0) 28 | SET(GOBJECT_DEFINITIONS ${PKG_GOBJECT2_CFLAGS}) 29 | ENDIF (NOT WIN32) 30 | 31 | if (NOT GSTREAMER_ROOT) 32 | if (CMAKE_SIZEOF_VOID_P MATCHES "8") 33 | set(GSTREAMER_ROOT $ENV{GSTREAMER_1_0_ROOT_X86_64}) 34 | else () 35 | set(GSTREAMER_ROOT $ENV{GSTREAMER_1_0_ROOT_X86}) 36 | endif () 37 | endif () 38 | 39 | FIND_PATH(GOBJECT_INCLUDE_DIR gobject/gobject.h 40 | HINTS ${PKG_GOBJECT2_INCLUDE_DIRS} ${PKG_GOBJECT2_INCLUDEDIR} 41 | PATHS /usr/include/glib-2.0/ ${GSTREAMER_ROOT}/include 42 | PATH_SUFFIXES glib-2.0 43 | ) 44 | 45 | FIND_LIBRARY(_GObjectLibs NAMES gobject-2.0 46 | HINTS 47 | ${PKG_GOBJECT2_LIBRARY_DIRS} 48 | ${PKG_GOBJECT2_LIBDIR} 49 | ${GSTREAMER_ROOT}/lib 50 | ) 51 | FIND_LIBRARY(_GModuleLibs NAMES gmodule-2.0 52 | HINTS 53 | ${PKG_GOBJECT2_LIBRARY_DIRS} 54 | ${PKG_GOBJECT2_LIBDIR} 55 | ${GSTREAMER_ROOT}/lib 56 | ) 57 | FIND_LIBRARY(_GThreadLibs NAMES gthread-2.0 58 | HINTS 59 | ${PKG_GOBJECT2_LIBRARY_DIRS} 60 | ${PKG_GOBJECT2_LIBDIR} 61 | ${GSTREAMER_ROOT}/lib 62 | ) 63 | FIND_LIBRARY(_GLibs NAMES glib-2.0 64 | HINTS 65 | ${PKG_GOBJECT2_LIBRARY_DIRS} 66 | ${PKG_GOBJECT2_LIBDIR} 67 | ${GSTREAMER_ROOT}/lib 68 | ) 69 | FIND_LIBRARY(_GIOLibs NAMES gio-2.0 70 | HINTS 71 | ${PKG_GOBJECT2_LIBRARY_DIRS} 72 | ${PKG_GOBJECT2_LIBDIR} 73 | ${GSTREAMER_ROOT}/lib 74 | ) 75 | 76 | SET (GOBJECT_LIBRARIES ${_GObjectLibs} ${_GModuleLibs} ${_GThreadLibs} ${_GLibs} ${_GIOLibs}) 77 | 78 | MARK_AS_ADVANCED(GOBJECT_INCLUDE_DIR GOBJECT_LIBRARIES) 79 | 80 | INCLUDE(FindPackageHandleStandardArgs) 81 | FIND_PACKAGE_HANDLE_STANDARD_ARGS(GObject DEFAULT_MSG GOBJECT_INCLUDE_DIR GOBJECT_LIBRARIES) 82 | -------------------------------------------------------------------------------- /cmake/modules/FindGStreamer.cmake: -------------------------------------------------------------------------------- 1 | # - Try to find GStreamer 2 | # Once done this will define 3 | # 4 | # GSTREAMER_FOUND - system has GStreamer 5 | # GSTREAMER_INCLUDE_DIR - the GStreamer include directory 6 | # GSTREAMER_LIBRARY - the main GStreamer library 7 | # GSTREAMER_PLUGIN_DIR - the GStreamer plugin directory 8 | # 9 | # And for all the plugin libraries specified in the COMPONENTS 10 | # of find_package, this module will define: 11 | # 12 | # GSTREAMER__LIBRARY_FOUND - system has 13 | # GSTREAMER__LIBRARY - the library 14 | # GSTREAMER__INCLUDE_DIR - the include directory 15 | # 16 | # Copyright (c) 2010, Collabora Ltd. 17 | # @author George Kiagiadakis 18 | # 19 | # Redistribution and use is allowed according to the terms of the BSD license. 20 | # For details see the accompanying COPYING-CMAKE-SCRIPTS file. 21 | 22 | if (GSTREAMER_INCLUDE_DIR AND GSTREAMER_LIBRARY) 23 | set(GStreamer_FIND_QUIETLY TRUE) 24 | else() 25 | set(GStreamer_FIND_QUIETLY FALSE) 26 | endif() 27 | 28 | set(GSTREAMER_ABI_VERSION "1.0") 29 | 30 | 31 | # Find the main library 32 | find_package(PkgConfig) 33 | 34 | if (PKG_CONFIG_FOUND) 35 | pkg_check_modules(PKG_GSTREAMER gstreamer-${GSTREAMER_ABI_VERSION}) 36 | exec_program(${PKG_CONFIG_EXECUTABLE} 37 | ARGS --variable pluginsdir gstreamer-${GSTREAMER_ABI_VERSION} 38 | OUTPUT_VARIABLE PKG_GSTREAMER_PLUGIN_DIR) 39 | endif() 40 | 41 | if (NOT GSTREAMER_ROOT) 42 | if (CMAKE_SIZEOF_VOID_P MATCHES "8") 43 | set(GSTREAMER_ROOT $ENV{GSTREAMER_1_0_ROOT_X86_64}) 44 | else () 45 | set(GSTREAMER_ROOT $ENV{GSTREAMER_1_0_ROOT_X86}) 46 | endif () 47 | endif () 48 | 49 | find_library(GSTREAMER_LIBRARY 50 | NAMES gstreamer-${GSTREAMER_ABI_VERSION} 51 | HINTS ${PKG_GSTREAMER_LIBRARY_DIRS} ${PKG_GSTREAMER_LIBDIR} ${GSTREAMER_ROOT}/lib) 52 | 53 | find_path(GSTREAMER_INCLUDE_DIR 54 | gst/gst.h 55 | HINTS ${PKG_GSTREAMER_INCLUDE_DIRS} ${PKG_GSTREAMER_INCLUDEDIR} ${GSTREAMER_ROOT}/include 56 | PATH_SUFFIXES gstreamer-${GSTREAMER_ABI_VERSION}) 57 | 58 | find_path(GSTREAMER_INCLUDE_DIR_ARCH 59 | gst/gstconfig.h 60 | HINTS ${PKG_GSTREAMER_INCLUDE_DIRS} ${PKG_GSTREAMER_INCLUDEDIR} ${GSTREAMER_ROOT}/lib/gstreamer-1.0/include 61 | PATH_SUFFIXES gstreamer-${GSTREAMER_ABI_VERSION}) 62 | 63 | if (GSTREAMER_INCLUDE_DIR_ARCH) 64 | set(GSTREAMER_INCLUDE_DIR ${GSTREAMER_INCLUDE_DIR} ${GSTREAMER_INCLUDE_DIR_ARCH}) 65 | endif () 66 | 67 | if (PKG_GSTREAMER_PLUGIN_DIR) 68 | set(_GSTREAMER_PLUGIN_DIR ${PKG_GSTREAMER_PLUGIN_DIR}) 69 | else() 70 | get_filename_component(_GSTREAMER_LIB_DIR ${GSTREAMER_LIBRARY} PATH) 71 | set(_GSTREAMER_PLUGIN_DIR ${_GSTREAMER_LIB_DIR}/gstreamer-${GSTREAMER_ABI_VERSION}) 72 | endif() 73 | 74 | set(GSTREAMER_PLUGIN_DIR ${_GSTREAMER_PLUGIN_DIR} 75 | CACHE PATH "The path to the gstreamer plugins installation directory") 76 | 77 | mark_as_advanced(GSTREAMER_LIBRARY GSTREAMER_INCLUDE_DIR GSTREAMER_PLUGIN_DIR) 78 | 79 | 80 | # Find additional libraries 81 | include(MacroFindGStreamerLibrary) 82 | 83 | macro(_find_gst_component _name _header) 84 | find_gstreamer_library(${_name} ${_header} ${GSTREAMER_ABI_VERSION}) 85 | set(_GSTREAMER_EXTRA_VARIABLES ${_GSTREAMER_EXTRA_VARIABLES} 86 | GSTREAMER_${_name}_LIBRARY GSTREAMER_${_name}_INCLUDE_DIR) 87 | endmacro() 88 | 89 | foreach(_component ${GStreamer_FIND_COMPONENTS}) 90 | if (${_component} STREQUAL "base") 91 | _find_gst_component(BASE gstbasesink.h) 92 | elseif (${_component} STREQUAL "check") 93 | _find_gst_component(CHECK gstcheck.h) 94 | elseif (${_component} STREQUAL "controller") 95 | _find_gst_component(CONTROLLER gstcontroller.h) 96 | elseif (${_component} STREQUAL "dataprotocol") 97 | _find_gst_component(DATAPROTOCOL dataprotocol.h) 98 | elseif (${_component} STREQUAL "net") 99 | _find_gst_component(NET gstnet.h) 100 | else() 101 | message (AUTHOR_WARNING "FindGStreamerPluginsBase.cmake: Invalid component \"${_component}\" was specified") 102 | endif() 103 | endforeach() 104 | 105 | 106 | # Version check 107 | if (GStreamer_FIND_VERSION) 108 | if (PKG_GSTREAMER_FOUND) 109 | if("${PKG_GSTREAMER_VERSION}" VERSION_LESS "${GStreamer_FIND_VERSION}") 110 | message(STATUS "Found GStreamer version ${PKG_GSTREAMER_VERSION}, but at least version ${GStreamer_FIND_VERSION} is required") 111 | set(GSTREAMER_VERSION_COMPATIBLE FALSE) 112 | else() 113 | set(GSTREAMER_VERSION_COMPATIBLE TRUE) 114 | endif() 115 | elseif(GSTREAMER_INCLUDE_DIR) 116 | include(CheckCXXSourceCompiles) 117 | 118 | set(CMAKE_REQUIRED_INCLUDES ${GSTREAMER_INCLUDE_DIR}) 119 | string(REPLACE "." "," _comma_version ${GStreamer_FIND_VERSION}) 120 | # Hack to invalidate the cached value 121 | set(GSTREAMER_VERSION_COMPATIBLE GSTREAMER_VERSION_COMPATIBLE) 122 | 123 | check_cxx_source_compiles(" 124 | #define G_BEGIN_DECLS 125 | #define G_END_DECLS 126 | #include 127 | 128 | #if GST_CHECK_VERSION(${_comma_version}) 129 | int main() { return 0; } 130 | #else 131 | # error \"GStreamer version incompatible\" 132 | #endif 133 | " GSTREAMER_VERSION_COMPATIBLE) 134 | 135 | if (NOT GSTREAMER_VERSION_COMPATIBLE) 136 | message(STATUS "GStreamer ${GStreamer_FIND_VERSION} is required, but the version found is older") 137 | endif() 138 | else() 139 | # We didn't find gstreamer at all 140 | set(GSTREAMER_VERSION_COMPATIBLE FALSE) 141 | endif() 142 | else() 143 | # No version constrain was specified, thus we consider the version compatible 144 | set(GSTREAMER_VERSION_COMPATIBLE TRUE) 145 | endif() 146 | 147 | 148 | include(FindPackageHandleStandardArgs) 149 | find_package_handle_standard_args(GStreamer DEFAULT_MSG 150 | GSTREAMER_LIBRARY GSTREAMER_INCLUDE_DIR 151 | GSTREAMER_VERSION_COMPATIBLE ${_GSTREAMER_EXTRA_VARIABLES}) 152 | -------------------------------------------------------------------------------- /cmake/modules/FindGStreamerPluginsBase.cmake: -------------------------------------------------------------------------------- 1 | # - Try to find gst-plugins-base 2 | # Once done this will define 3 | # 4 | # GSTREAMER_PLUGINS_BASE_FOUND - system has gst-plugins-base 5 | # 6 | # And for all the plugin libraries specified in the COMPONENTS 7 | # of find_package, this module will define: 8 | # 9 | # GSTREAMER__LIBRARY_FOUND - system has 10 | # GSTREAMER__LIBRARY - the library 11 | # GSTREAMER__INCLUDE_DIR - the include directory 12 | # 13 | # Copyright (c) 2010, Collabora Ltd. 14 | # @author George Kiagiadakis 15 | # 16 | # Redistribution and use is allowed according to the terms of the BSD license. 17 | # For details see the accompanying COPYING-CMAKE-SCRIPTS file. 18 | 19 | set(GSTREAMER_ABI_VERSION "1.0") 20 | 21 | 22 | # Find the pkg-config file for doing the version check 23 | find_package(PkgConfig) 24 | 25 | if (PKG_CONFIG_FOUND) 26 | pkg_check_modules(PKG_GSTREAMER_PLUGINS_BASE gstreamer-plugins-base-${GSTREAMER_ABI_VERSION}) 27 | endif() 28 | 29 | 30 | # Find the plugin libraries 31 | include(MacroFindGStreamerLibrary) 32 | 33 | macro(_find_gst_plugins_base_component _name _header) 34 | find_gstreamer_library(${_name} ${_header} ${GSTREAMER_ABI_VERSION}) 35 | set(_GSTREAMER_PLUGINS_BASE_EXTRA_VARIABLES ${_GSTREAMER_PLUGINS_BASE_EXTRA_VARIABLES} 36 | GSTREAMER_${_name}_LIBRARY GSTREAMER_${_name}_INCLUDE_DIR) 37 | endmacro() 38 | 39 | foreach(_component ${GStreamerPluginsBase_FIND_COMPONENTS}) 40 | if (${_component} STREQUAL "app") 41 | _find_gst_plugins_base_component(APP gstappsrc.h) 42 | elseif (${_component} STREQUAL "audio") 43 | _find_gst_plugins_base_component(AUDIO audio.h) 44 | elseif (${_component} STREQUAL "cdda") 45 | _find_gst_plugins_base_component(CDDA gstcddabasesrc.h) 46 | elseif (${_component} STREQUAL "fft") 47 | _find_gst_plugins_base_component(FFT gstfft.h) 48 | elseif (${_component} STREQUAL "floatcast") 49 | _find_gst_plugins_base_component(FLOATCAST floatcast.h) 50 | elseif (${_component} STREQUAL "interfaces") 51 | _find_gst_plugins_base_component(INTERFACES xoverlay.h) 52 | elseif (${_component} STREQUAL "insertbin") 53 | _find_gst_plugins_base_component(INSERTBIN gstinsertbin.h) 54 | elseif (${_component} STREQUAL "netbuffer") 55 | _find_gst_plugins_base_component(NETBUFFER gstnetbuffer.h) 56 | elseif (${_component} STREQUAL "riff") 57 | _find_gst_plugins_base_component(RIFF riff-ids.h) 58 | elseif (${_component} STREQUAL "rtp") 59 | _find_gst_plugins_base_component(RTP gstrtpbuffer.h) 60 | elseif (${_component} STREQUAL "rtsp") 61 | _find_gst_plugins_base_component(RTSP gstrtspdefs.h) 62 | elseif (${_component} STREQUAL "sdp") 63 | _find_gst_plugins_base_component(SDP gstsdp.h) 64 | elseif (${_component} STREQUAL "tag") 65 | _find_gst_plugins_base_component(TAG tag.h) 66 | elseif (${_component} STREQUAL "pbutils") 67 | _find_gst_plugins_base_component(PBUTILS pbutils.h) 68 | elseif (${_component} STREQUAL "video") 69 | _find_gst_plugins_base_component(VIDEO video.h) 70 | else() 71 | message (AUTHOR_WARNING "FindGStreamer.cmake: Invalid component \"${_component}\" was specified") 72 | endif() 73 | endforeach() 74 | 75 | 76 | # Version check 77 | if (GStreamerPluginsBase_FIND_VERSION) 78 | if (PKG_GSTREAMER_PLUGINS_BASE_FOUND) 79 | if("${PKG_GSTREAMER_PLUGINS_BASE_VERSION}" VERSION_LESS "${GStreamerPluginsBase_FIND_VERSION}") 80 | message(STATUS "Found gst-plugins-base version ${PKG_GSTREAMER_PLUGINS_BASE_VERSION}, but at least version ${GStreamerPluginsBase_FIND_VERSION} is required") 81 | set(GSTREAMER_PLUGINS_BASE_VERSION_COMPATIBLE FALSE) 82 | else() 83 | set(GSTREAMER_PLUGINS_BASE_VERSION_COMPATIBLE TRUE) 84 | endif() 85 | else() 86 | # We can't make any version checks without pkg-config, just assume version is compatible and hope... 87 | set(GSTREAMER_PLUGINS_BASE_VERSION_COMPATIBLE TRUE) 88 | endif() 89 | else() 90 | # No version constrain was specified, thus we consider the version compatible 91 | set(GSTREAMER_PLUGINS_BASE_VERSION_COMPATIBLE TRUE) 92 | endif() 93 | 94 | 95 | include(FindPackageHandleStandardArgs) 96 | find_package_handle_standard_args(GStreamerPluginsBase DEFAULT_MSG 97 | GSTREAMER_PLUGINS_BASE_VERSION_COMPATIBLE 98 | ${_GSTREAMER_PLUGINS_BASE_EXTRA_VARIABLES}) 99 | -------------------------------------------------------------------------------- /cmake/modules/FindNVTegraRelease.cmake: -------------------------------------------------------------------------------- 1 | # FindNVTegraRelease.cmake - CMake module to parse /etc/nv_tegra_release 2 | 3 | function(FindNVTegraRelease) 4 | if (EXISTS "/etc/nv_tegra_release") 5 | # Read the contents of "/etc/nv_tegra_release" into a variable 6 | file(READ "/etc/nv_tegra_release" NV_TEGRA_RELEASE_CONTENTS) 7 | 8 | # Define a regular expression pattern to match the version information 9 | set(VERSION_REGEX "# R([0-9]+) \\(release\\), REVISION: ([0-9]+)\\.([0-9]+)") 10 | 11 | # Match the version information using the regular expression 12 | string(REGEX MATCH "${VERSION_REGEX}" MATCHED_VERSION "${NV_TEGRA_RELEASE_CONTENTS}") 13 | 14 | # Extract the release version and revision from the matched string 15 | if (MATCHED_VERSION) 16 | set(L4T_FOUND TRUE PARENT_SCOPE) 17 | set(L4T_RELEASE ${CMAKE_MATCH_1} PARENT_SCOPE) 18 | set(L4T_REVISION ${CMAKE_MATCH_2} PARENT_SCOPE) 19 | set(L4T_PATCH ${CMAKE_MATCH_3} PARENT_SCOPE) 20 | else() 21 | set(L4T_FOUND FALSE PARENT_SCOPE) 22 | endif() 23 | else() 24 | set(L4T_FOUND FALSE PARENT_SCOPE) 25 | endif() 26 | endfunction() 27 | 28 | -------------------------------------------------------------------------------- /cmake/modules/MacroFindGStreamerLibrary.cmake: -------------------------------------------------------------------------------- 1 | # - macro find_gstreamer_library 2 | # 3 | # Copyright (c) 2010, Collabora Ltd. 4 | # @author George Kiagiadakis 5 | # 6 | # Redistribution and use is allowed according to the terms of the BSD license. 7 | # For details see the accompanying COPYING-CMAKE-SCRIPTS file. 8 | 9 | macro(find_gstreamer_library _name _header _abi_version) 10 | string(TOLOWER ${_name} _lower_name) 11 | string(TOUPPER ${_name} _upper_name) 12 | 13 | if (GSTREAMER_${_upper_name}_LIBRARY AND GSTREAMER_${_upper_name}_INCLUDE_DIR) 14 | set(_GSTREAMER_${_upper_name}_QUIET TRUE) 15 | else() 16 | set(_GSTREAMER_${_upper_name}_QUIET FALSE) 17 | endif() 18 | 19 | if (PKG_CONFIG_FOUND) 20 | pkg_check_modules(PKG_GSTREAMER_${_upper_name} gstreamer-${_lower_name}-${_abi_version}) 21 | endif() 22 | 23 | if (NOT GSTREAMER_ROOT) 24 | if (CMAKE_SIZEOF_VOID_P MATCHES "8") 25 | set(GSTREAMER_ROOT $ENV{GSTREAMER_1_0_ROOT_X86_64}) 26 | else () 27 | set(GSTREAMER_ROOT $ENV{GSTREAMER_1_0_ROOT_X86}) 28 | endif () 29 | endif () 30 | 31 | find_library(GSTREAMER_${_upper_name}_LIBRARY 32 | NAMES gst${_lower_name}-${_abi_version} 33 | HINTS ${PKG_GSTREAMER_${_upper_name}_LIBRARY_DIRS} 34 | ${PKG_GSTREAMER_${_upper_name}_LIBDIR} 35 | ${GSTREAMER_ROOT}/lib 36 | ) 37 | 38 | find_path(GSTREAMER_${_upper_name}_INCLUDE_DIR 39 | gst/${_lower_name}/${_header} 40 | HINTS ${PKG_GSTREAMER_${_upper_name}_INCLUDE_DIRS} 41 | ${PKG_GSTREAMER_${_upper_name}_INCLUDEDIR} 42 | ${GSTREAMER_ROOT}/include 43 | PATH_SUFFIXES gstreamer-${_abi_version} 44 | ) 45 | 46 | if (GSTREAMER_${_upper_name}_LIBRARY AND GSTREAMER_${_upper_name}_INCLUDE_DIR) 47 | set(GSTREAMER_${_upper_name}_LIBRARY_FOUND TRUE) 48 | else() 49 | set(GSTREAMER_${_upper_name}_LIBRARY_FOUND FALSE) 50 | endif() 51 | 52 | if (NOT _GSTREAMER_${_upper_name}_QUIET) 53 | if (GSTREAMER_${_upper_name}_LIBRARY) 54 | message(STATUS "Found GSTREAMER_${_upper_name}_LIBRARY: ${GSTREAMER_${_upper_name}_LIBRARY}") 55 | else() 56 | message(STATUS "Could NOT find GSTREAMER_${_upper_name}_LIBRARY") 57 | endif() 58 | 59 | if (GSTREAMER_${_upper_name}_INCLUDE_DIR) 60 | message(STATUS "Found GSTREAMER_${_upper_name}_INCLUDE_DIR: ${GSTREAMER_${_upper_name}_INCLUDE_DIR}") 61 | else() 62 | message(STATUS "Could NOT find GSTREAMER_${_upper_name}_INCLUDE_DIR") 63 | endif() 64 | endif() 65 | 66 | mark_as_advanced(GSTREAMER_${_upper_name}_LIBRARY GSTREAMER_${_upper_name}_INCLUDE_DIR) 67 | endmacro() 68 | -------------------------------------------------------------------------------- /cmake/modules/MacroLogFeature.cmake: -------------------------------------------------------------------------------- 1 | # This file defines the Feature Logging macros. 2 | # 3 | # MACRO_LOG_FEATURE(VAR FEATURE DESCRIPTION URL [REQUIRED [MIN_VERSION [COMMENTS]]]) 4 | # Logs the information so that it can be displayed at the end 5 | # of the configure run 6 | # VAR : TRUE or FALSE, indicating whether the feature is supported 7 | # FEATURE: name of the feature, e.g. "libjpeg" 8 | # DESCRIPTION: description what this feature provides 9 | # URL: home page 10 | # REQUIRED: TRUE or FALSE, indicating whether the featue is required 11 | # MIN_VERSION: minimum version number. empty string if unneeded 12 | # COMMENTS: More info you may want to provide. empty string if unnecessary 13 | # 14 | # MACRO_DISPLAY_FEATURE_LOG() 15 | # Call this to display the collected results. 16 | # Exits CMake with a FATAL error message if a required feature is missing 17 | # 18 | # Example: 19 | # 20 | # INCLUDE(MacroLogFeature) 21 | # 22 | # FIND_PACKAGE(JPEG) 23 | # MACRO_LOG_FEATURE(JPEG_FOUND "libjpeg" "Support JPEG images" "http://www.ijg.org" TRUE "3.2a" "") 24 | # ... 25 | # MACRO_DISPLAY_FEATURE_LOG() 26 | 27 | # Copyright (c) 2006, Alexander Neundorf, 28 | # Copyright (c) 2006, Allen Winter, 29 | # Copyright (c) 2009, Sebastian Trueg, 30 | # 31 | # Redistribution and use is allowed according to the terms of the BSD license. 32 | # For details see the accompanying COPYING-CMAKE-SCRIPTS file. 33 | 34 | IF (NOT _macroLogFeatureAlreadyIncluded) 35 | SET(_file ${CMAKE_BINARY_DIR}/MissingRequirements.txt) 36 | IF (EXISTS ${_file}) 37 | FILE(REMOVE ${_file}) 38 | ENDIF (EXISTS ${_file}) 39 | 40 | SET(_file ${CMAKE_BINARY_DIR}/EnabledFeatures.txt) 41 | IF (EXISTS ${_file}) 42 | FILE(REMOVE ${_file}) 43 | ENDIF (EXISTS ${_file}) 44 | 45 | SET(_file ${CMAKE_BINARY_DIR}/DisabledFeatures.txt) 46 | IF (EXISTS ${_file}) 47 | FILE(REMOVE ${_file}) 48 | ENDIF (EXISTS ${_file}) 49 | 50 | SET(_macroLogFeatureAlreadyIncluded TRUE) 51 | ENDIF (NOT _macroLogFeatureAlreadyIncluded) 52 | 53 | 54 | MACRO(MACRO_LOG_FEATURE _var _package _description _url ) # _required _minvers _comments) 55 | 56 | STRING(TOUPPER "${ARGV4}" _required) 57 | SET(_minvers "${ARGV5}") 58 | SET(_comments "${ARGV6}") 59 | 60 | IF (${_var}) 61 | SET(_LOGFILENAME ${CMAKE_BINARY_DIR}/EnabledFeatures.txt) 62 | ELSE (${_var}) 63 | IF ("${_required}" STREQUAL "TRUE") 64 | SET(_LOGFILENAME ${CMAKE_BINARY_DIR}/MissingRequirements.txt) 65 | ELSE ("${_required}" STREQUAL "TRUE") 66 | SET(_LOGFILENAME ${CMAKE_BINARY_DIR}/DisabledFeatures.txt) 67 | ENDIF ("${_required}" STREQUAL "TRUE") 68 | ENDIF (${_var}) 69 | 70 | SET(_logtext " * ${_package}") 71 | 72 | IF (NOT ${_var}) 73 | IF (${_minvers} MATCHES ".*") 74 | SET(_logtext "${_logtext} (${_minvers} or higher)") 75 | ENDIF (${_minvers} MATCHES ".*") 76 | SET(_logtext "${_logtext} <${_url}>\n ") 77 | ELSE (NOT ${_var}) 78 | SET(_logtext "${_logtext} - ") 79 | ENDIF (NOT ${_var}) 80 | 81 | SET(_logtext "${_logtext}${_description}") 82 | 83 | IF (NOT ${_var}) 84 | IF (${_comments} MATCHES ".*") 85 | SET(_logtext "${_logtext}\n ${_comments}") 86 | ENDIF (${_comments} MATCHES ".*") 87 | # SET(_logtext "${_logtext}\n") #double-space missing features? 88 | ENDIF (NOT ${_var}) 89 | 90 | FILE(APPEND "${_LOGFILENAME}" "${_logtext}\n") 91 | 92 | ENDMACRO(MACRO_LOG_FEATURE) 93 | 94 | 95 | MACRO(MACRO_DISPLAY_FEATURE_LOG) 96 | 97 | SET(_missingFile ${CMAKE_BINARY_DIR}/MissingRequirements.txt) 98 | SET(_enabledFile ${CMAKE_BINARY_DIR}/EnabledFeatures.txt) 99 | SET(_disabledFile ${CMAKE_BINARY_DIR}/DisabledFeatures.txt) 100 | 101 | IF (EXISTS ${_missingFile} OR EXISTS ${_enabledFile} OR EXISTS ${_disabledFile}) 102 | SET(_printSummary TRUE) 103 | ENDIF (EXISTS ${_missingFile} OR EXISTS ${_enabledFile} OR EXISTS ${_disabledFile}) 104 | 105 | IF(_printSummary) 106 | SET(_missingDeps 0) 107 | IF (EXISTS ${_enabledFile}) 108 | FILE(READ ${_enabledFile} _enabled) 109 | FILE(REMOVE ${_enabledFile}) 110 | SET(_summary "${_summary}\n-----------------------------------------------------------------------------\n-- The following external packages were located on your system.\n-- This installation will have the extra features provided by these packages.\n-----------------------------------------------------------------------------\n${_enabled}") 111 | ENDIF (EXISTS ${_enabledFile}) 112 | 113 | 114 | IF (EXISTS ${_disabledFile}) 115 | SET(_missingDeps 1) 116 | FILE(READ ${_disabledFile} _disabled) 117 | FILE(REMOVE ${_disabledFile}) 118 | SET(_summary "${_summary}\n-----------------------------------------------------------------------------\n-- The following OPTIONAL packages could NOT be located on your system.\n-- Consider installing them to enable more features from this software.\n-----------------------------------------------------------------------------\n${_disabled}") 119 | ENDIF (EXISTS ${_disabledFile}) 120 | 121 | 122 | IF (EXISTS ${_missingFile}) 123 | SET(_missingDeps 1) 124 | FILE(READ ${_missingFile} _requirements) 125 | SET(_summary "${_summary}\n-----------------------------------------------------------------------------\n-- The following REQUIRED packages could NOT be located on your system.\n-- You must install these packages before continuing.\n-----------------------------------------------------------------------------\n${_requirements}") 126 | FILE(REMOVE ${_missingFile}) 127 | SET(_haveMissingReq 1) 128 | ENDIF (EXISTS ${_missingFile}) 129 | 130 | 131 | IF (NOT ${_missingDeps}) 132 | SET(_summary "${_summary}\n-----------------------------------------------------------------------------\n-- Congratulations! All external packages have been found.") 133 | ENDIF (NOT ${_missingDeps}) 134 | 135 | 136 | MESSAGE(${_summary}) 137 | MESSAGE("-----------------------------------------------------------------------------\n") 138 | 139 | 140 | IF(_haveMissingReq) 141 | MESSAGE(FATAL_ERROR "Exiting: Missing Requirements") 142 | ENDIF(_haveMissingReq) 143 | 144 | ENDIF(_printSummary) 145 | 146 | ENDMACRO(MACRO_DISPLAY_FEATURE_LOG) 147 | -------------------------------------------------------------------------------- /gst-zed-data-csv-sink/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | ################################################ 2 | ## Generate symbols for IDE indexer (VSCode) 3 | set(CMAKE_EXPORT_COMPILE_COMMANDS ON) 4 | 5 | # Default to C99 6 | if(NOT CMAKE_C_STANDARD) 7 | set(CMAKE_C_STANDARD 99) 8 | endif() 9 | 10 | # Default to C++14 11 | if(NOT CMAKE_CXX_STANDARD) 12 | set(CMAKE_CXX_STANDARD 14) 13 | endif() 14 | 15 | add_definitions(-Werror=return-type) 16 | 17 | set( SOURCES 18 | gstzeddatacsvsink.cpp 19 | ) 20 | 21 | set( HEADERS 22 | gstzeddatacsvsink.h 23 | ) 24 | 25 | set(libname gstzeddatacsvsink) 26 | 27 | message(" * ${libname} plugin added") 28 | 29 | link_directories(${LIBRARY_INSTALL_DIR}) 30 | 31 | add_library( ${libname} MODULE 32 | ${SOURCES} 33 | ${HEADERS} 34 | ) 35 | 36 | if(UNIX) 37 | message(" ${libname}: OS Unix") 38 | add_definitions(-std=c++11 -Wno-deprecated-declarations) 39 | endif(UNIX) 40 | 41 | if(CMAKE_BUILD_TYPE EQUAL "DEBUG") 42 | message(" ${libname}: Debug mode") 43 | add_definitions(-g) 44 | else() 45 | message(" ${libname}: Release mode") 46 | add_definitions(-O2) 47 | endif() 48 | 49 | add_dependencies (${libname} gstzedmeta) 50 | 51 | if(WIN32) 52 | target_link_libraries (${libname} LINK_PUBLIC 53 | ${GLIB2_LIBRARIES} 54 | ${GOBJECT_LIBRARIES} 55 | ${GSTREAMER_LIBRARY} 56 | ${GSTREAMER_BASE_LIBRARY} 57 | ${GSTREAMER_VIDEO_LIBRARY} 58 | gstzedmeta 59 | ) 60 | else() 61 | target_link_libraries (${libname} LINK_PUBLIC 62 | ${GLIB2_LIBRARIES} 63 | ${GOBJECT_LIBRARIES} 64 | ${GSTREAMER_LIBRARY} 65 | ${GSTREAMER_BASE_LIBRARY} 66 | ${GSTREAMER_VIDEO_LIBRARY} 67 | ${CMAKE_CURRENT_BINARY_DIR}/../gst-zed-meta/libgstzedmeta.so 68 | ) 69 | endif() 70 | 71 | if (WIN32) 72 | install (FILES $ DESTINATION ${PDB_INSTALL_DIR} COMPONENT pdb OPTIONAL) 73 | endif() 74 | install(TARGETS ${libname} LIBRARY DESTINATION ${PLUGIN_INSTALL_DIR}) 75 | -------------------------------------------------------------------------------- /gst-zed-data-csv-sink/gstzeddatacsvsink.cpp: -------------------------------------------------------------------------------- 1 | // ///////////////////////////////////////////////////////////////////////// 2 | 3 | // 4 | // Copyright (c) 2024, STEREOLABS. 5 | // 6 | // All rights reserved. 7 | // 8 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 9 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 10 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 11 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 12 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 13 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 14 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 15 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 16 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 17 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 18 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 19 | // 20 | // ///////////////////////////////////////////////////////////////////////// 21 | 22 | #include "gstzeddatacsvsink.h" 23 | 24 | #include 25 | #include 26 | #include 27 | 28 | #include "gst-zed-meta/gstzedmeta.h" 29 | 30 | static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", 31 | GST_PAD_SINK, 32 | GST_PAD_ALWAYS, 33 | GST_STATIC_CAPS ("application/data")); 34 | 35 | GST_DEBUG_CATEGORY_STATIC (gst_zeddatacsvsink_debug); 36 | #define GST_CAT_DEFAULT gst_zeddatacsvsink_debug 37 | 38 | #define DEFAULT_PROP_LOCATION "" 39 | #define DEFAULT_PROP_APPEND FALSE 40 | 41 | #define CSV_SEP "," 42 | 43 | enum 44 | { 45 | PROP_0, 46 | PROP_LOCATION, 47 | PROP_APPEND, 48 | PROP_LAST 49 | }; 50 | 51 | static void gst_zeddatacsvsink_dispose(GObject * object); 52 | 53 | static void gst_zeddatacsvsink_set_property (GObject * object, guint prop_id, 54 | const GValue * value, GParamSpec * pspec); 55 | static void gst_zeddatacsvsink_get_property (GObject * object, guint prop_id, 56 | GValue * value, GParamSpec * pspec); 57 | 58 | static gboolean gst_zeddatacsvsink_open_file(GstZedDataCsvSink* sink); 59 | static void gst_zeddatacsvsink_close_file(GstZedDataCsvSink* sink); 60 | 61 | static gboolean gst_zeddatacsvsink_start (GstBaseSink * sink); 62 | static gboolean gst_zeddatacsvsink_stop (GstBaseSink * sink); 63 | 64 | static gboolean gst_zeddatacsvsink_event (GstBaseSink * sink, GstEvent * event); 65 | static GstFlowReturn gst_zeddatacsvsink_render (GstBaseSink * sink, GstBuffer * buffer); 66 | 67 | G_DEFINE_TYPE( GstZedDataCsvSink, gst_zeddatacsvsink, GST_TYPE_BASE_SINK ); 68 | 69 | static void gst_zeddatacsvsink_class_init (GstZedDataCsvSinkClass * klass) 70 | { 71 | GObjectClass *gobject_class = G_OBJECT_CLASS (klass); 72 | GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); 73 | GstBaseSinkClass *gstbasesink_class = GST_BASE_SINK_CLASS (klass); 74 | 75 | gobject_class->dispose = gst_zeddatacsvsink_dispose; 76 | 77 | gobject_class->set_property = gst_zeddatacsvsink_set_property; 78 | gobject_class->get_property = gst_zeddatacsvsink_get_property; 79 | 80 | g_object_class_install_property (gobject_class, PROP_LOCATION, 81 | g_param_spec_string ("location", "CSVFile Location", 82 | "Location of the CSV file to write", DEFAULT_PROP_LOCATION, 83 | (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); 84 | 85 | g_object_class_install_property( gobject_class, PROP_APPEND, 86 | g_param_spec_boolean("append", "CSV append", 87 | "Append to an already existing CSV file", 88 | DEFAULT_PROP_APPEND, 89 | (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); 90 | 91 | gst_element_class_set_static_metadata (gstelement_class, 92 | "ZED CSV File Sink", 93 | "Sink/File", "Write data stream to a file", 94 | "Stereolabs "); 95 | gst_element_class_add_static_pad_template (gstelement_class, &sink_factory); 96 | 97 | gstbasesink_class->start = GST_DEBUG_FUNCPTR (gst_zeddatacsvsink_start); 98 | gstbasesink_class->stop = GST_DEBUG_FUNCPTR (gst_zeddatacsvsink_stop); 99 | gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_zeddatacsvsink_render); 100 | gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_zeddatacsvsink_event); 101 | } 102 | 103 | static void gst_zeddatacsvsink_init(GstZedDataCsvSink * csvsink) 104 | { 105 | GST_TRACE_OBJECT( csvsink, "Init" ); 106 | 107 | csvsink->filename = *g_string_new( DEFAULT_PROP_LOCATION ); 108 | csvsink->append = DEFAULT_PROP_APPEND; 109 | 110 | csvsink->out_file_ptr = NULL; 111 | 112 | gst_base_sink_set_sync(GST_BASE_SINK(csvsink), FALSE); 113 | } 114 | 115 | static void gst_zeddatacsvsink_dispose (GObject * object) 116 | { 117 | GstZedDataCsvSink* sink = GST_DATA_CSV_SINK(object); 118 | 119 | GST_TRACE_OBJECT( sink, "Dispose" ); 120 | 121 | if(sink->out_file_ptr) 122 | { 123 | delete sink->out_file_ptr; 124 | sink->out_file_ptr = NULL; 125 | } 126 | 127 | G_OBJECT_CLASS(gst_zeddatacsvsink_parent_class)->dispose(object); 128 | } 129 | 130 | void gst_zeddatacsvsink_set_property (GObject * object, guint prop_id, 131 | const GValue * value, GParamSpec * pspec) 132 | { 133 | GstZedDataCsvSink* sink = GST_DATA_CSV_SINK(object); 134 | 135 | GST_TRACE_OBJECT( sink, "Set property" ); 136 | 137 | const gchar* str; 138 | 139 | switch (prop_id) { 140 | case PROP_LOCATION: 141 | str = g_value_get_string(value); 142 | sink->filename = *g_string_new( str ); 143 | break; 144 | case PROP_APPEND: 145 | sink->append = g_value_get_boolean (value); 146 | break; 147 | default: 148 | G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); 149 | break; 150 | } 151 | } 152 | 153 | void gst_zeddatacsvsink_get_property (GObject * object, guint prop_id, 154 | GValue * value, GParamSpec * pspec) 155 | { 156 | GstZedDataCsvSink* sink = GST_DATA_CSV_SINK(object); 157 | 158 | GST_TRACE_OBJECT( sink, "Get property" ); 159 | 160 | switch (prop_id) { 161 | case PROP_LOCATION: 162 | g_value_set_string( value, sink->filename.str ); 163 | break; 164 | case PROP_APPEND: 165 | g_value_set_boolean (value, sink->append); 166 | break; 167 | default: 168 | G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); 169 | break; 170 | } 171 | } 172 | 173 | gboolean gst_zeddatacsvsink_open_file(GstZedDataCsvSink* sink) 174 | { 175 | GST_TRACE_OBJECT( sink, "Open file: %s", sink->filename.str ); 176 | 177 | if( sink->filename.len == 0 ) 178 | { 179 | GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND, 180 | ("No file name specified for writing"), (NULL)); 181 | return FALSE; 182 | } 183 | 184 | if(sink->append) 185 | { 186 | GST_TRACE_OBJECT( sink, "Opening in append mode..." ); 187 | sink->out_file_ptr = new std::ofstream( sink->filename.str, std::ios::out | std::ios::app ); 188 | GST_TRACE_OBJECT( sink, "... open." ); 189 | } 190 | else 191 | { 192 | GST_TRACE_OBJECT( sink, "Opening..." ); 193 | sink->out_file_ptr = new std::ofstream( sink->filename.str, std::ios::out | std::ios::trunc); 194 | GST_TRACE_OBJECT( sink, "... open." ); 195 | 196 | *sink->out_file_ptr << "TIMESTAMP,STREAM_TYPE,CAM_MODEL,GRAB_W,GRAB_H," << 197 | "POSE_VAL,POS_TRK_STATE,POS_X_[m],POS_Y_[m],POS_Z_[m],OR_X_[rad],OR_Y_[rad],OR_Z_[rad]," << 198 | "IMU_VAL,ACC_X_[m/s²],ACC_Y_[m/s²],ACC_Z_[m/s²],GYRO_X_[rad/s],GYROY_[rad/s],GYRO_Z_[rad/s]," << 199 | "MAG_VAL,MAG_X_[uT],MAG_Y_[uT],MAG_Z_[uT]," << 200 | "ENV_VAL,TEMP_[°C],PRESS_[hPa]," << 201 | "TEMP_VAL,TEMP_L_[°C],TEMP_R_[°C]" << 202 | std::endl; 203 | } 204 | 205 | if(!sink->out_file_ptr || !sink->out_file_ptr->good() ) 206 | { 207 | GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND, 208 | ("Error opening CSV file for writing"), (NULL)); 209 | return FALSE; 210 | } 211 | 212 | GST_TRACE_OBJECT( sink, "File opened: %s", sink->filename.str ); 213 | 214 | 215 | return TRUE; 216 | } 217 | 218 | void gst_zeddatacsvsink_close_file(GstZedDataCsvSink* sink) 219 | { 220 | GST_TRACE_OBJECT( sink, "Close File" ); 221 | 222 | if(sink->out_file_ptr && sink->out_file_ptr->is_open()) 223 | { 224 | sink->out_file_ptr->flush(); 225 | sink->out_file_ptr->close(); 226 | } 227 | } 228 | 229 | gboolean gst_zeddatacsvsink_start(GstBaseSink* sink) 230 | { 231 | GstZedDataCsvSink* csvsink = GST_DATA_CSV_SINK(sink); 232 | 233 | GST_TRACE_OBJECT( csvsink, "Start" ); 234 | 235 | return gst_zeddatacsvsink_open_file(csvsink); 236 | } 237 | 238 | gboolean gst_zeddatacsvsink_stop (GstBaseSink * sink) 239 | { 240 | GstZedDataCsvSink* csvsink = GST_DATA_CSV_SINK(sink); 241 | 242 | GST_TRACE_OBJECT( csvsink, "Stop" ); 243 | 244 | gst_zeddatacsvsink_close_file(csvsink); 245 | 246 | return TRUE; 247 | } 248 | 249 | gboolean gst_zeddatacsvsink_event (GstBaseSink * sink, GstEvent * event) 250 | { 251 | GstEventType type; 252 | GstZedDataCsvSink* csvsink = GST_DATA_CSV_SINK(sink); 253 | 254 | type = GST_EVENT_TYPE (event); 255 | 256 | GST_TRACE_OBJECT( csvsink, "Event " ); 257 | 258 | switch (type) { 259 | case GST_EVENT_EOS: 260 | if(csvsink->out_file_ptr && csvsink->out_file_ptr->is_open()) 261 | { 262 | csvsink->out_file_ptr->flush(); 263 | } 264 | break; 265 | default: 266 | break; 267 | } 268 | 269 | return GST_BASE_SINK_CLASS(gst_zeddatacsvsink_parent_class)->event( sink, event ); 270 | } 271 | 272 | 273 | GstFlowReturn gst_zeddatacsvsink_render( GstBaseSink * sink, GstBuffer* buf ) 274 | { 275 | GstZedDataCsvSink* csvsink = GST_DATA_CSV_SINK(sink); 276 | 277 | GstMapInfo map_in; 278 | 279 | GST_TRACE_OBJECT( csvsink, "Render" ); 280 | 281 | if(gst_buffer_map(buf, &map_in, GST_MAP_READ)) 282 | { 283 | // ----> Timestamp 284 | GstClockTime timestamp = GST_BUFFER_TIMESTAMP (buf); 285 | *csvsink->out_file_ptr << timestamp << CSV_SEP; 286 | // <--- Timestamp 287 | 288 | GST_TRACE_OBJECT( csvsink, "Input buffer size %lu B", map_in.size ); 289 | GST_TRACE_OBJECT( csvsink, "GstZedSrcMeta size %lu B", sizeof(GstZedSrcMeta) ); 290 | 291 | GstZedSrcMeta* meta = (GstZedSrcMeta*)map_in.data; 292 | 293 | // ----> Info 294 | *csvsink->out_file_ptr << meta->info.stream_type << CSV_SEP; 295 | *csvsink->out_file_ptr << meta->info.cam_model << CSV_SEP; 296 | *csvsink->out_file_ptr << meta->info.grab_single_frame_width << CSV_SEP; 297 | *csvsink->out_file_ptr << meta->info.grab_single_frame_height << CSV_SEP; 298 | 299 | GST_LOG (" * [META] Stream type: %d", meta->info.stream_type ); 300 | GST_LOG (" * [META] Camera model: %d", meta->info.cam_model ); 301 | GST_LOG (" * [META] Grab frame size: %d x %d", meta->info.grab_single_frame_width, meta->info.grab_single_frame_height ); 302 | // <---- Info 303 | 304 | // ----> Camera Pose 305 | 306 | *csvsink->out_file_ptr << meta->pose.pose_avail << CSV_SEP; 307 | *csvsink->out_file_ptr << meta->pose.pos_tracking_state << CSV_SEP; 308 | *csvsink->out_file_ptr << std::fixed << std::setprecision(6) << meta->pose.pos[0]/1000. << CSV_SEP; 309 | *csvsink->out_file_ptr << std::fixed << std::setprecision(6) << meta->pose.pos[1]/1000. << CSV_SEP; 310 | *csvsink->out_file_ptr << std::fixed << std::setprecision(6) << meta->pose.pos[2]/1000. << CSV_SEP; 311 | *csvsink->out_file_ptr << std::fixed << std::setprecision(6) << meta->pose.orient[0] << CSV_SEP; 312 | *csvsink->out_file_ptr << std::fixed << std::setprecision(6) << meta->pose.orient[1] << CSV_SEP; 313 | *csvsink->out_file_ptr << std::fixed << std::setprecision(6) << meta->pose.orient[2] << CSV_SEP; 314 | 315 | if( meta->pose.pose_avail==TRUE ) 316 | { 317 | GST_LOG (" * [META] Pos X: %g mm", meta->pose.pos[0] ); 318 | GST_LOG (" * [META] Pos Y: %g mm", meta->pose.pos[1] ); 319 | GST_LOG (" * [META] Pos Z: %g mm", meta->pose.pos[2] ); 320 | GST_LOG (" * [META] Orient X: %g rad", meta->pose.orient[0] ); 321 | GST_LOG (" * [META] Orient Y: %g rad", meta->pose.orient[1] ); 322 | GST_LOG (" * [META] Orient Z: %g rad", meta->pose.orient[2] ); 323 | } 324 | else 325 | { 326 | GST_LOG (" * [META] Positional tracking disabled" ); 327 | } 328 | // <---- Camera Pose 329 | 330 | // ----> Sensors 331 | *csvsink->out_file_ptr << meta->sens.imu.imu_avail << CSV_SEP; 332 | *csvsink->out_file_ptr << std::fixed << std::setprecision(6) << meta->sens.imu.acc[0] << CSV_SEP; 333 | *csvsink->out_file_ptr << std::fixed << std::setprecision(6) << meta->sens.imu.acc[1] << CSV_SEP; 334 | *csvsink->out_file_ptr << std::fixed << std::setprecision(6) << meta->sens.imu.acc[2] << CSV_SEP; 335 | *csvsink->out_file_ptr << std::fixed << std::setprecision(6) << meta->sens.imu.gyro[0] << CSV_SEP; 336 | *csvsink->out_file_ptr << std::fixed << std::setprecision(6) << meta->sens.imu.gyro[1] << CSV_SEP; 337 | *csvsink->out_file_ptr << std::fixed << std::setprecision(6) << meta->sens.imu.gyro[2] << CSV_SEP; 338 | 339 | *csvsink->out_file_ptr << meta->sens.mag.mag_avail << CSV_SEP; 340 | *csvsink->out_file_ptr << std::fixed << std::setprecision(6) << meta->sens.mag.mag[0] << CSV_SEP; 341 | *csvsink->out_file_ptr << std::fixed << std::setprecision(6) << meta->sens.mag.mag[1] << CSV_SEP; 342 | *csvsink->out_file_ptr << std::fixed << std::setprecision(6) << meta->sens.mag.mag[2] << CSV_SEP; 343 | 344 | *csvsink->out_file_ptr << meta->sens.env.env_avail << CSV_SEP; 345 | *csvsink->out_file_ptr << std::fixed << std::setprecision(2) << meta->sens.env.temp << CSV_SEP; 346 | *csvsink->out_file_ptr << std::fixed << std::setprecision(2) << meta->sens.env.press << CSV_SEP; 347 | 348 | *csvsink->out_file_ptr << meta->sens.temp.temp_avail << CSV_SEP; 349 | *csvsink->out_file_ptr << std::fixed << std::setprecision(2) << meta->sens.temp.temp_cam_left << CSV_SEP; 350 | *csvsink->out_file_ptr << std::fixed << std::setprecision(2) << meta->sens.temp.temp_cam_right; 351 | 352 | if( meta->sens.sens_avail==TRUE ) 353 | { 354 | GST_LOG (" * [META] IMU acc X: %g m/sec²", meta->sens.imu.acc[0] ); 355 | GST_LOG (" * [META] IMU acc Y: %g m/sec²", meta->sens.imu.acc[1] ); 356 | GST_LOG (" * [META] IMU acc Z: %g m/sec²", meta->sens.imu.acc[2] ); 357 | GST_LOG (" * [META] IMU gyro X: %g rad/sec", meta->sens.imu.gyro[0] ); 358 | GST_LOG (" * [META] IMU gyro Y: %g rad/sec", meta->sens.imu.gyro[1] ); 359 | GST_LOG (" * [META] IMU gyro Z: %g rad/sec", meta->sens.imu.gyro[2] ); 360 | GST_LOG (" * [META] MAG X: %g uT", meta->sens.mag.mag[0] ); 361 | GST_LOG (" * [META] MAG Y: %g uT", meta->sens.mag.mag[1] ); 362 | GST_LOG (" * [META] MAG Z: %g uT", meta->sens.mag.mag[2] ); 363 | GST_LOG (" * [META] Env Temp: %g °C", meta->sens.env.temp ); 364 | GST_LOG (" * [META] Pressure: %g hPa", meta->sens.env.press ); 365 | GST_LOG (" * [META] Temp left: %g °C", meta->sens.temp.temp_cam_left ); 366 | GST_LOG (" * [META] Temp right: %g °C", meta->sens.temp.temp_cam_right ); 367 | } 368 | else 369 | { 370 | GST_LOG (" * [META] Sensors data not available" ); 371 | } 372 | // <---- Sensors 373 | 374 | // endline 375 | *csvsink->out_file_ptr << std::endl; 376 | 377 | // Release incoming buffer 378 | gst_buffer_unmap( buf, &map_in ); 379 | } 380 | else 381 | { 382 | GST_ELEMENT_ERROR (sink, RESOURCE, FAILED, 383 | ("Failed to map buffer for reading" ), (NULL)); 384 | return GST_FLOW_ERROR; 385 | } 386 | 387 | return GST_FLOW_OK; 388 | } 389 | 390 | static gboolean plugin_init (GstPlugin * plugin) 391 | { 392 | GST_DEBUG_CATEGORY_INIT( gst_zeddatacsvsink_debug, "zeddatacsvsink", 0, 393 | "debug category for zeddatacsvsink element"); 394 | gst_element_register( plugin, "zeddatacsvsink", GST_RANK_NONE, 395 | gst_zeddatacsvsink_get_type()); 396 | 397 | return TRUE; 398 | } 399 | 400 | GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, 401 | GST_VERSION_MINOR, 402 | zeddatacsvsink, 403 | "ZED Data CSV sink", 404 | plugin_init, 405 | GST_PACKAGE_VERSION, 406 | GST_PACKAGE_LICENSE, 407 | GST_PACKAGE_NAME, 408 | GST_PACKAGE_ORIGIN) 409 | -------------------------------------------------------------------------------- /gst-zed-data-csv-sink/gstzeddatacsvsink.h: -------------------------------------------------------------------------------- 1 | // ///////////////////////////////////////////////////////////////////////// 2 | 3 | // 4 | // Copyright (c) 2024, STEREOLABS. 5 | // 6 | // All rights reserved. 7 | // 8 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 9 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 10 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 11 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 12 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 13 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 14 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 15 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 16 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 17 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 18 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 19 | // 20 | // ///////////////////////////////////////////////////////////////////////// 21 | 22 | #ifndef _GST_ZED_DATA_CSV_SINK_H 23 | #define _GST_ZED_DATA_CSV_SINK_H 24 | 25 | #include 26 | #include 27 | 28 | #ifdef __linux__ 29 | #include 30 | #endif 31 | 32 | #include 33 | #include 34 | #include 35 | 36 | G_BEGIN_DECLS 37 | 38 | #define GST_TYPE_ZED_DATA_CSV_SINK (gst_zeddatacsvsink_get_type()) 39 | #define GST_DATA_CSV_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ZED_DATA_CSV_SINK,GstZedDataCsvSink)) 40 | #define GST_DATA_CSV_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ZED_DATA_CSV_SINK,GstZedDataCsvSinkClass)) 41 | #define GST_IS_DATA_CSV_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ZED_DATA_CSV_SINK)) 42 | #define GST_IS_DATA_CSV_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ZED_DATA_CSV_SINK)) 43 | #define GST_DATA_CSV_SINK_CAST(obj) ((GstZedDataCsvSink *)(obj)) 44 | 45 | typedef struct _GstZedDataCsvSink GstZedDataCsvSink; 46 | typedef struct _GstZedDataCsvSinkClass GstZedDataCsvSinkClass; 47 | 48 | struct _GstZedDataCsvSink 49 | { 50 | GstBaseSink parent; 51 | 52 | std::ofstream* out_file_ptr; 53 | 54 | // Properties 55 | GString filename; 56 | gboolean append; 57 | }; 58 | 59 | struct _GstZedDataCsvSinkClass { 60 | GstBaseSinkClass parent_class; 61 | }; 62 | 63 | G_GNUC_INTERNAL GType gst_zeddatacsvsink_get_type (void); 64 | 65 | G_END_DECLS 66 | 67 | #endif // #ifndef _GST_ZED_DATA_CSV_SINK_H 68 | -------------------------------------------------------------------------------- /gst-zed-data-mux/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | ################################################ 2 | ## Generate symbols for IDE indexer (VSCode) 3 | set(CMAKE_EXPORT_COMPILE_COMMANDS ON) 4 | 5 | # Default to C99 6 | if(NOT CMAKE_C_STANDARD) 7 | set(CMAKE_C_STANDARD 99) 8 | endif() 9 | 10 | # Default to C++14 11 | if(NOT CMAKE_CXX_STANDARD) 12 | set(CMAKE_CXX_STANDARD 14) 13 | endif() 14 | 15 | add_definitions(-Werror=return-type) 16 | 17 | set(SOURCES 18 | gstzeddatamux.cpp 19 | ) 20 | 21 | set(HEADERS 22 | gstzeddatamux.h 23 | ) 24 | 25 | set(libname gstzeddatamux) 26 | 27 | message(" * ${libname} plugin added") 28 | 29 | link_directories(${LIBRARY_INSTALL_DIR}) 30 | 31 | add_library(${libname} MODULE 32 | ${SOURCES} 33 | ${HEADERS} 34 | ) 35 | 36 | if(UNIX) 37 | message(" ${libname}: OS Unix") 38 | add_definitions(-std=c++11 -Wno-deprecated-declarations) 39 | endif(UNIX) 40 | 41 | if(CMAKE_BUILD_TYPE EQUAL "DEBUG") 42 | message(" ${libname}: Debug mode") 43 | add_definitions(-g) 44 | else() 45 | message(" ${libname}: Release mode") 46 | add_definitions(-O2) 47 | endif() 48 | 49 | add_dependencies (${libname} gstzedmeta) 50 | 51 | if(WIN32) 52 | target_link_libraries (${libname} LINK_PUBLIC 53 | ${GLIB2_LIBRARIES} 54 | ${GOBJECT_LIBRARIES} 55 | ${GSTREAMER_LIBRARY} 56 | ${GSTREAMER_BASE_LIBRARY} 57 | ${GSTREAMER_VIDEO_LIBRARY} 58 | gstzedmeta 59 | ) 60 | else() 61 | target_link_libraries (${libname} LINK_PUBLIC 62 | ${GLIB2_LIBRARIES} 63 | ${GOBJECT_LIBRARIES} 64 | ${GSTREAMER_LIBRARY} 65 | ${GSTREAMER_BASE_LIBRARY} 66 | ${GSTREAMER_VIDEO_LIBRARY} 67 | ${CMAKE_CURRENT_BINARY_DIR}/../gst-zed-meta/libgstzedmeta.so 68 | ) 69 | endif() 70 | 71 | if(WIN32) 72 | install (FILES $ DESTINATION ${PDB_INSTALL_DIR} COMPONENT pdb OPTIONAL) 73 | endif() 74 | install(TARGETS ${libname} LIBRARY DESTINATION ${PLUGIN_INSTALL_DIR}) 75 | -------------------------------------------------------------------------------- /gst-zed-data-mux/gstzeddatamux.h: -------------------------------------------------------------------------------- 1 | // ///////////////////////////////////////////////////////////////////////// 2 | 3 | // 4 | // Copyright (c) 2024, STEREOLABS. 5 | // 6 | // All rights reserved. 7 | // 8 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 9 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 10 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 11 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 12 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 13 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 14 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 15 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 16 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 17 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 18 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 19 | // 20 | // ///////////////////////////////////////////////////////////////////////// 21 | 22 | #ifndef GST_ZEDDATAMUX_H 23 | #define GST_ZEDDATAMUX_H 24 | #include 25 | #include 26 | 27 | G_BEGIN_DECLS 28 | 29 | #define GST_TYPE_ZEDDATAMUX (gst_zeddatamux_get_type()) 30 | #define GST_ZEDDATAMUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_ZEDDATAMUX, GstZedDataMux)) 31 | #define GST_ZEDDATAMUX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_ZEDDATAMUX, GstZedDataMuxClass)) 32 | #define GST_IS_ZEDDATAMUX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_ZEDDATAMUX)) 33 | #define GST_IS_ZEDDATAMUX_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_ZEDDATAMUX)) 34 | 35 | typedef struct _GstZedDataMux GstZedDataMux; 36 | typedef struct _GstZedDataMuxClass GstZedDataMuxClass; 37 | 38 | struct _GstZedDataMux { 39 | GstElement element; 40 | 41 | GstPad *sinkpad_video; 42 | GstPad *sinkpad_data; 43 | GstPad *srcpad; 44 | 45 | GstCaps *caps; 46 | 47 | GstClockTime last_data_ts; 48 | GstClockTime last_video_ts; 49 | 50 | GstBuffer *last_video_buf; 51 | gsize last_video_buf_size; 52 | GstBuffer *last_data_buf; 53 | gsize last_data_buf_size; 54 | }; 55 | 56 | struct _GstZedDataMuxClass { 57 | GstElementClass base_zeddatamux_class; 58 | }; 59 | 60 | GType gst_zeddatamux_get_type(void); 61 | 62 | G_END_DECLS 63 | 64 | #endif /* GST_ZEDDATAMUX_H */ 65 | -------------------------------------------------------------------------------- /gst-zed-demux/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | ################################################ 2 | ## Generate symbols for IDE indexer (VSCode) 3 | set(CMAKE_EXPORT_COMPILE_COMMANDS ON) 4 | 5 | # Default to C99 6 | if(NOT CMAKE_C_STANDARD) 7 | set(CMAKE_C_STANDARD 99) 8 | endif() 9 | 10 | # Default to C++14 11 | if(NOT CMAKE_CXX_STANDARD) 12 | set(CMAKE_CXX_STANDARD 14) 13 | endif() 14 | 15 | add_definitions(-Werror=return-type) 16 | 17 | set( SOURCES 18 | gstzeddemux.cpp 19 | ) 20 | 21 | set( HEADERS 22 | gstzeddemux.h 23 | ) 24 | 25 | set(libname gstzeddemux) 26 | 27 | message( " * ${libname} plugin added") 28 | 29 | link_directories(${LIBRARY_INSTALL_DIR}) 30 | 31 | add_library( ${libname} MODULE 32 | ${SOURCES} 33 | ${HEADERS} 34 | ) 35 | 36 | if(UNIX) 37 | message(" ${libname}: OS Unix") 38 | add_definitions(-std=c++11 -Wno-deprecated-declarations) 39 | endif(UNIX) 40 | 41 | if (CMAKE_BUILD_TYPE EQUAL "DEBUG") 42 | message(" ${libname}: Debug mode") 43 | add_definitions(-g) 44 | else() 45 | message(" ${libname}: Release mode") 46 | add_definitions(-O2) 47 | endif() 48 | 49 | add_dependencies (${libname} gstzedmeta) 50 | 51 | if(WIN32) 52 | target_link_libraries (${libname} LINK_PUBLIC 53 | ${GLIB2_LIBRARIES} 54 | ${GOBJECT_LIBRARIES} 55 | ${GSTREAMER_LIBRARY} 56 | ${GSTREAMER_BASE_LIBRARY} 57 | ${GSTREAMER_VIDEO_LIBRARY} 58 | gstzedmeta 59 | ) 60 | else() 61 | target_link_libraries (${libname} LINK_PUBLIC 62 | ${GLIB2_LIBRARIES} 63 | ${GOBJECT_LIBRARIES} 64 | ${GSTREAMER_LIBRARY} 65 | ${GSTREAMER_BASE_LIBRARY} 66 | ${GSTREAMER_VIDEO_LIBRARY} 67 | ${CMAKE_CURRENT_BINARY_DIR}/../gst-zed-meta/libgstzedmeta.so 68 | ) 69 | endif() 70 | 71 | if(WIN32) 72 | install (FILES $ DESTINATION ${PDB_INSTALL_DIR} COMPONENT pdb OPTIONAL) 73 | endif () 74 | install(TARGETS ${libname} LIBRARY DESTINATION ${PLUGIN_INSTALL_DIR}) 75 | -------------------------------------------------------------------------------- /gst-zed-demux/gstzeddemux.h: -------------------------------------------------------------------------------- 1 | // ///////////////////////////////////////////////////////////////////////// 2 | 3 | // 4 | // Copyright (c) 2024, STEREOLABS. 5 | // 6 | // All rights reserved. 7 | // 8 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 9 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 10 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 11 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 12 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 13 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 14 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 15 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 16 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 17 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 18 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 19 | // 20 | // ///////////////////////////////////////////////////////////////////////// 21 | 22 | #ifndef GST_ZEDDEMUX_H 23 | #define GST_ZEDDEMUX_H 24 | #include 25 | #include 26 | 27 | G_BEGIN_DECLS 28 | 29 | #define GST_TYPE_ZEDDEMUX (gst_zeddemux_get_type()) 30 | #define GST_ZEDDEMUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_ZEDDEMUX, GstZedDemux)) 31 | #define GST_ZEDDEMUX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_ZEDDEMUX, GstZedDemuxClass)) 32 | #define GST_IS_ZEDDEMUX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_ZEDDEMUX)) 33 | #define GST_IS_ZEDDEMUX_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_ZEDDEMUX)) 34 | 35 | typedef struct _GstZedDemux GstZedDemux; 36 | typedef struct _GstZedDemuxClass GstZedDemuxClass; 37 | 38 | struct _GstZedDemux { 39 | GstElement element; 40 | 41 | GstPad *sinkpad; 42 | GstPad *srcpad_left; 43 | GstPad *srcpad_mono; 44 | GstPad *srcpad_aux; 45 | GstPad *srcpad_data; 46 | 47 | GstCaps *caps_left; 48 | GstCaps *caps_mono; 49 | GstCaps *caps_aux; 50 | 51 | gboolean is_depth; 52 | gboolean is_mono; 53 | gboolean stream_data; 54 | }; 55 | 56 | struct _GstZedDemuxClass { 57 | GstElementClass base_zeddemux_class; 58 | }; 59 | 60 | GType gst_zeddemux_get_type(void); 61 | 62 | G_END_DECLS 63 | 64 | #endif /* GST_ZEDDEMUX_H */ 65 | -------------------------------------------------------------------------------- /gst-zed-meta/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | ################################################ 2 | ## Generate symbols for IDE indexer (VSCode) 3 | set(CMAKE_EXPORT_COMPILE_COMMANDS ON) 4 | 5 | # Default to C99 6 | if(NOT CMAKE_C_STANDARD) 7 | set(CMAKE_C_STANDARD 99) 8 | endif() 9 | 10 | # Default to C++14 11 | if(NOT CMAKE_CXX_STANDARD) 12 | set(CMAKE_CXX_STANDARD 14) 13 | endif() 14 | 15 | add_definitions(-Werror=return-type) 16 | 17 | set(SOURCES 18 | gstzedmeta.cpp 19 | ) 20 | 21 | set(HEADERS 22 | gstzedmeta.h 23 | ) 24 | 25 | set(libname gstzedmeta) 26 | 27 | message( " * ${libname} library added") 28 | 29 | add_library (${libname} SHARED 30 | ${SOURCES} 31 | ${HEADERS} 32 | ) 33 | 34 | if(UNIX) 35 | message(" ${libname}: OS Unix") 36 | add_definitions(-std=c++11 -Wno-deprecated-declarations) 37 | endif(UNIX) 38 | 39 | if (CMAKE_BUILD_TYPE EQUAL "DEBUG") 40 | message(" ${libname}: Debug mode") 41 | add_definitions(-g) 42 | else() 43 | message(" ${libname}: Release mode") 44 | add_definitions(-O2) 45 | endif() 46 | 47 | if(WIN32) 48 | set(CMAKE_SHARED_LIBRARY_PREFIX "") 49 | set(CMAKE_STATIC_LIBRARY_PREFIX "") 50 | endif() 51 | 52 | target_link_libraries (${libname} LINK_PUBLIC 53 | ${GLIB2_LIBRARIES} 54 | ${GOBJECT_LIBRARIES} 55 | ${GSTREAMER_LIBRARY} 56 | ${GSTREAMER_BASE_LIBRARY} 57 | ${GSTREAMER_VIDEO_LIBRARY} 58 | ) 59 | 60 | set_target_properties(${libname} PROPERTIES 61 | PUBLIC_HEADER "${HEADERS}" 62 | ) 63 | 64 | if (WIN32) 65 | install (FILES $ DESTINATION ${PDB_INSTALL_DIR} COMPONENT pdb OPTIONAL) 66 | endif () 67 | 68 | install( TARGETS ${libname} 69 | LIBRARY DESTINATION ${LIBRARY_INSTALL_DIR} 70 | PUBLIC_HEADER DESTINATION ${INCLUDE_INSTALL_DIR} 71 | ) 72 | -------------------------------------------------------------------------------- /gst-zed-meta/gstzedmeta.cpp: -------------------------------------------------------------------------------- 1 | // ///////////////////////////////////////////////////////////////////////// 2 | 3 | // 4 | // Copyright (c) 2024, STEREOLABS. 5 | // 6 | // All rights reserved. 7 | // 8 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 9 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 10 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 11 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 12 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 13 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 14 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 15 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 16 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 17 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 18 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 19 | // 20 | // ///////////////////////////////////////////////////////////////////////// 21 | 22 | #include "gstzedmeta.h" 23 | #include 24 | #include 25 | #include 26 | #include 27 | 28 | #ifndef GST_DISABLE_GST_DEBUG 29 | #define GST_CAT_DEFAULT ensure_debug_category() 30 | static GstDebugCategory *ensure_debug_category(void) { 31 | static gsize cat_gonce = 0; 32 | 33 | if (g_once_init_enter(&cat_gonce)) { 34 | gsize cat_done; 35 | 36 | cat_done = (gsize) _gst_debug_category_new("zedsrcmeta", 0, "zedsrcmeta"); 37 | 38 | g_once_init_leave(&cat_gonce, cat_done); 39 | } 40 | 41 | return (GstDebugCategory *) cat_gonce; 42 | } 43 | #else 44 | #define ensure_debug_category() /* NOOP */ 45 | #endif /* GST_DISABLE_GST_DEBUG */ 46 | 47 | GType gst_zed_src_meta_api_get_type() { 48 | GST_TRACE("gst_zed_src_meta_api_get_type"); 49 | 50 | static GType type; 51 | 52 | static const gchar *tags[] = {/*GST_META_TAG_VIDEO_STR, GST_META_TAG_VIDEO_SIZE_STR, 53 | GST_META_TAG_VIDEO_ORIENTATION_STR,*/ 54 | NULL}; 55 | 56 | if (g_once_init_enter(&type)) { 57 | GType _type = gst_meta_api_type_register("GstZedSrcMetaAPI", tags); 58 | 59 | g_once_init_leave(&type, _type); 60 | } 61 | 62 | return type; 63 | } 64 | 65 | static gboolean gst_zed_src_meta_init(GstMeta *meta, gpointer params, GstBuffer *buffer) { 66 | GST_TRACE("gst_zed_src_meta_init"); 67 | 68 | GstZedSrcMeta *emeta = (GstZedSrcMeta *) meta; 69 | 70 | emeta->info.cam_model = 0; 71 | emeta->info.stream_type = 0; 72 | emeta->info.grab_single_frame_width = 0; 73 | emeta->info.grab_single_frame_height = 0; 74 | 75 | emeta->pose.pose_avail = FALSE; 76 | emeta->pose.pos[0] = 0.0; 77 | emeta->pose.pos[1] = 0.0; 78 | emeta->pose.pos[2] = 0.0; 79 | emeta->pose.orient[0] = 0.0; 80 | emeta->pose.orient[1] = 0.0; 81 | emeta->pose.orient[2] = 0.0; 82 | return true; 83 | } 84 | 85 | static gboolean gst_zed_src_meta_transform(GstBuffer *transbuf, GstMeta *meta, GstBuffer *buffer, GQuark type, gpointer data) { 86 | GST_TRACE("gst_zed_src_meta_transform [%u]", type); 87 | 88 | GstZedSrcMeta *emeta = (GstZedSrcMeta *) meta; 89 | 90 | // ----> Scale transformation 91 | // TODO understand how `videoscale` filter handleds this part because there is something weird with 92 | // metadata tags handling 93 | // if( GST_VIDEO_META_TRANSFORM_IS_SCALE(type) ) 94 | // { 95 | // if(emeta->od_enabled==TRUE && emeta->obj_count>0) 96 | // { 97 | // GstVideoMetaTransform* transf = (GstVideoMetaTransform*)data; 98 | // gint in_w = transf->in_info->width; 99 | // gint in_h = transf->in_info->height; 100 | // gint out_w = transf->out_info->width; 101 | // gint out_h = transf->out_info->height; 102 | 103 | // GST_DEBUG( "Transform scale: [%dx%d] -> [%d,x%d]", in_w,in_h, out_w,out_h ); 104 | // } 105 | // } 106 | // <---- Scale transformation 107 | 108 | if (GST_META_TRANSFORM_IS_COPY(type)) { 109 | GST_DEBUG("Transform copy"); 110 | } 111 | 112 | gst_buffer_add_zed_src_meta(transbuf, emeta->info, emeta->pose, emeta->sens, emeta->od_enabled, emeta->obj_count, emeta->objects, emeta->frame_id); 113 | 114 | return TRUE; 115 | } 116 | 117 | static void gst_zed_src_meta_free(GstMeta *meta, GstBuffer *buffer) { 118 | GST_TRACE("gst_zed_src_meta_free"); 119 | 120 | GstZedSrcMeta *emeta = (GstZedSrcMeta *) meta; 121 | } 122 | 123 | const GstMetaInfo *gst_zed_src_meta_get_info(void) { 124 | GST_TRACE("gst_zed_src_meta_get_info"); 125 | 126 | static const GstMetaInfo *meta_info = NULL; 127 | 128 | if (g_once_init_enter(&meta_info)) { 129 | const GstMetaInfo *mi = gst_meta_register(GST_ZED_SRC_META_API_TYPE, "GstZedSrcMeta", sizeof(GstZedSrcMeta), gst_zed_src_meta_init, 130 | gst_zed_src_meta_free, gst_zed_src_meta_transform); 131 | g_once_init_leave(&meta_info, mi); 132 | } 133 | 134 | return meta_info; 135 | } 136 | 137 | GstZedSrcMeta *gst_buffer_add_zed_src_meta(GstBuffer *buffer, ZedInfo &info, ZedPose &pose, ZedSensors &sens, gboolean od_enabled, guint8 obj_count, 138 | ZedObjectData *objects, guint64 frame_id) { 139 | GST_TRACE("gst_buffer_add_zed_src_meta"); 140 | 141 | GST_DEBUG("Add GstZedSrcMeta"); 142 | 143 | GstZedSrcMeta *meta; 144 | 145 | g_return_val_if_fail(GST_IS_BUFFER(buffer), NULL); 146 | 147 | meta = (GstZedSrcMeta *) gst_buffer_add_meta(buffer, GST_ZED_SRC_META_INFO, NULL); 148 | 149 | memcpy(&meta->info, &info, sizeof(ZedInfo)); 150 | memcpy(&meta->pose, &pose, sizeof(ZedPose)); 151 | memcpy(&meta->sens, &sens, sizeof(ZedSensors)); 152 | 153 | meta->od_enabled = od_enabled; 154 | meta->obj_count = obj_count; 155 | 156 | memcpy(&meta->objects, objects, obj_count * sizeof(ZedObjectData)); 157 | 158 | meta->frame_id = frame_id; 159 | 160 | return meta; 161 | } 162 | -------------------------------------------------------------------------------- /gst-zed-meta/gstzedmeta.h: -------------------------------------------------------------------------------- 1 | // ///////////////////////////////////////////////////////////////////////// 2 | 3 | // 4 | // Copyright (c) 2024, STEREOLABS. 5 | // 6 | // All rights reserved. 7 | // 8 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 9 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 10 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 11 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 12 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 13 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 14 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 15 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 16 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 17 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 18 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 19 | // 20 | // ///////////////////////////////////////////////////////////////////////// 21 | 22 | #ifndef GSTZEDMETA_H 23 | #define GSTZEDMETA_H 24 | 25 | #include 26 | #include 27 | 28 | G_BEGIN_DECLS 29 | 30 | typedef struct _GstZedSrcMeta GstZedSrcMeta; 31 | typedef struct _ZedInfo ZedInfo; 32 | typedef struct _ZedPose ZedPose; 33 | typedef struct _ZedSensors ZedSensors; 34 | typedef struct _ZedImu ZedImu; 35 | typedef struct _ZedMag ZedMag; 36 | typedef struct _ZedEnv ZedEnv; 37 | typedef struct _ZedCamTemp ZedCamTemp; 38 | typedef struct _ZedObjectData ZedObjectData; 39 | 40 | struct _ZedInfo { 41 | gint cam_model; 42 | gint stream_type; 43 | guint grab_single_frame_width; 44 | guint grab_single_frame_height; 45 | }; 46 | 47 | struct _ZedPose { 48 | gboolean pose_avail; 49 | gint pos_tracking_state; 50 | gfloat pos[3]; 51 | gfloat orient[3]; 52 | }; 53 | 54 | struct _ZedImu { 55 | gboolean imu_avail; 56 | gfloat acc[3]; 57 | gfloat gyro[3]; 58 | gfloat temp; 59 | }; 60 | 61 | struct _ZedMag { 62 | gboolean mag_avail; 63 | gfloat mag[3]; 64 | }; 65 | 66 | struct _ZedEnv { 67 | gboolean env_avail; 68 | gfloat press; 69 | gfloat temp; 70 | }; 71 | 72 | struct _ZedCamTemp { 73 | gboolean temp_avail; 74 | gfloat temp_cam_left; 75 | gfloat temp_cam_right; 76 | }; 77 | 78 | struct _ZedSensors { 79 | gboolean sens_avail; 80 | ZedImu imu; 81 | ZedMag mag; 82 | ZedEnv env; 83 | ZedCamTemp temp; 84 | }; 85 | 86 | enum class OBJECT_CLASS { 87 | PERSON = 0, /**< For people detection */ 88 | VEHICLE = 1, /**< For vehicle detection. It can be cars, trucks, buses, motorcycles etc */ 89 | BAG = 2, /**< For bag detection (backpack, handbag, suitcase) */ 90 | ANIMAL = 3, /**< For animal detection (cow, sheep, horse, dog, cat, bird, etc) */ 91 | ELECTRONICS = 4, /**< For electronic device detection (cellphone, laptop, etc) */ 92 | FRUIT_VEGETABLE = 5, /**< For fruit and vegetable detection (banana, apple, orange, carrot, etc) */ 93 | SPORT = 6, /**< For sport-related object detection (sportball) */ 94 | LAST 95 | }; 96 | 97 | enum class OBJECT_SUBCLASS { 98 | PERSON = 0, /**< PERSON / PERSON_BODY */ 99 | PERSON_HEAD = 22, /**< PERSON */ 100 | BICYCLE = 1, /**< VEHICLE */ 101 | CAR = 2, /**< VEHICLE */ 102 | MOTORBIKE = 3, /**< VEHICLE */ 103 | BUS = 4, /**< VEHICLE */ 104 | TRUCK = 5, /**< VEHICLE */ 105 | BOAT = 6, /**< VEHICLE */ 106 | BACKPACK = 7, /**< BAG */ 107 | HANDBAG = 8, /**< BAG */ 108 | SUITCASE = 9, /**< BAG */ 109 | BIRD = 10, /**< ANIMAL */ 110 | CAT = 11, /**< ANIMAL */ 111 | DOG = 12, /**< ANIMAL */ 112 | HORSE = 13, /**< ANIMAL */ 113 | SHEEP = 14, /**< ANIMAL */ 114 | COW = 15, /**< ANIMAL */ 115 | CELLPHONE = 16, /**< ELECTRONICS */ 116 | LAPTOP = 17, /**< ELECTRONICS */ 117 | BANANA = 18, /**< FRUIT/VEGETABLE */ 118 | APPLE = 19, /**< FRUIT/VEGETABLE */ 119 | ORANGE = 20, /**< FRUIT/VEGETABLE */ 120 | CARROT = 21, /**< FRUIT/VEGETABLE */ 121 | SPORTSBALL = 23, /**< SPORT */ 122 | LAST 123 | }; 124 | 125 | enum class OBJECT_TRACKING_STATE { 126 | OFF, /**< The tracking is not yet initialized, the object ID is not usable */ 127 | OK, /**< The object is tracked */ 128 | SEARCHING, /**< The object couldn't be detected in the image and is potentially occluded, the trajectory is estimated */ 129 | TERMINATE, /**< This is the last searching state of the track, the track will be deleted in the next retreiveObject */ 130 | LAST 131 | }; 132 | 133 | enum class OBJECT_ACTION_STATE { 134 | IDLE = 0, /**< The object is staying static. */ 135 | MOVING = 1, /**< The object is moving. */ 136 | LAST 137 | }; 138 | 139 | struct _ZedObjectData { 140 | gint id; 141 | 142 | OBJECT_CLASS label; 143 | OBJECT_SUBCLASS sublabel; 144 | OBJECT_TRACKING_STATE tracking_state; 145 | OBJECT_ACTION_STATE action_state; 146 | 147 | gfloat confidence; 148 | 149 | gfloat position[3]; 150 | gfloat position_covariance[6]; 151 | 152 | gfloat velocity[3]; 153 | 154 | unsigned int bounding_box_2d[4][2]; 155 | 156 | /* 3D bounding box of the person represented as eight 3D points 157 | 1 ------ 2 158 | / /| 159 | 0 ------ 3 | 160 | | Object | 6 161 | | |/ 162 | 4 ------ 7 163 | */ 164 | gfloat bounding_box_3d[8][3]; 165 | 166 | gfloat dimensions[3]; // 3D object dimensions: width, height, length 167 | 168 | gboolean skeletons_avail; 169 | 170 | gint skel_format; // indicates if it's 18, 34, 38, or 70 skeleton model 171 | 172 | gfloat keypoint_2d[70][2]; // Negative coordinates -> point not valid 173 | gfloat keypoint_3d[70][3]; // Nan coordinates -> point not valid 174 | 175 | gfloat head_bounding_box_2d[4][2]; 176 | gfloat head_bounding_box_3d[8][3]; 177 | gfloat head_position[3]; 178 | }; 179 | 180 | struct _GstZedSrcMeta { 181 | GstMeta meta; 182 | 183 | ZedInfo info; 184 | 185 | ZedPose pose; 186 | ZedSensors sens; 187 | 188 | gboolean od_enabled; 189 | guint8 obj_count; 190 | guint64 frame_id; 191 | ZedObjectData objects[256]; 192 | }; 193 | 194 | namespace skeleton { 195 | 196 | enum class BODY_18_PARTS { 197 | NOSE = 0, 198 | NECK = 1, 199 | RIGHT_SHOULDER = 2, 200 | RIGHT_ELBOW = 3, 201 | RIGHT_WRIST = 4, 202 | LEFT_SHOULDER = 5, 203 | LEFT_ELBOW = 6, 204 | LEFT_WRIST = 7, 205 | RIGHT_HIP = 8, 206 | RIGHT_KNEE = 9, 207 | RIGHT_ANKLE = 10, 208 | LEFT_HIP = 11, 209 | LEFT_KNEE = 12, 210 | LEFT_ANKLE = 13, 211 | RIGHT_EYE = 14, 212 | LEFT_EYE = 15, 213 | RIGHT_EAR = 16, 214 | LEFT_EAR = 17, 215 | LAST = 18 216 | }; 217 | 218 | inline int getIdx_18(BODY_18_PARTS part) { return static_cast(part); } 219 | 220 | enum class BODY_34_PARTS { 221 | PELVIS = 0, 222 | NAVAL_SPINE = 1, 223 | CHEST_SPINE = 2, 224 | NECK = 3, 225 | LEFT_CLAVICLE = 4, 226 | LEFT_SHOULDER = 5, 227 | LEFT_ELBOW = 6, 228 | LEFT_WRIST = 7, 229 | LEFT_HAND = 8, 230 | LEFT_HANDTIP = 9, 231 | LEFT_THUMB = 10, 232 | RIGHT_CLAVICLE = 11, 233 | RIGHT_SHOULDER = 12, 234 | RIGHT_ELBOW = 13, 235 | RIGHT_WRIST = 14, 236 | RIGHT_HAND = 15, 237 | RIGHT_HANDTIP = 16, 238 | RIGHT_THUMB = 17, 239 | LEFT_HIP = 18, 240 | LEFT_KNEE = 19, 241 | LEFT_ANKLE = 20, 242 | LEFT_FOOT = 21, 243 | RIGHT_HIP = 22, 244 | RIGHT_KNEE = 23, 245 | RIGHT_ANKLE = 24, 246 | RIGHT_FOOT = 25, 247 | HEAD = 26, 248 | NOSE = 27, 249 | LEFT_EYE = 28, 250 | LEFT_EAR = 29, 251 | RIGHT_EYE = 30, 252 | RIGHT_EAR = 31, 253 | LEFT_HEEL = 32, 254 | RIGHT_HEEL = 33, 255 | LAST = 34 256 | }; 257 | 258 | inline int getIdx_34(BODY_34_PARTS part) { return static_cast(part); } 259 | 260 | enum class BODY_38_PARTS { 261 | PELVIS = 0, 262 | SPINE_1 = 1, 263 | SPINE_2 = 2, 264 | SPINE_3 = 3, 265 | NECK = 4, 266 | NOSE = 5, 267 | LEFT_EYE = 6, 268 | RIGHT_EYE = 7, 269 | LEFT_EAR = 8, 270 | RIGHT_EAR = 9, 271 | LEFT_CLAVICLE = 10, 272 | RIGHT_CLAVICLE = 11, 273 | LEFT_SHOULDER = 12, 274 | RIGHT_SHOULDER = 13, 275 | LEFT_ELBOW = 14, 276 | RIGHT_ELBOW = 15, 277 | LEFT_WRIST = 16, 278 | RIGHT_WRIST = 17, 279 | LEFT_HIP = 18, 280 | RIGHT_HIP = 19, 281 | LEFT_KNEE = 20, 282 | RIGHT_KNEE = 21, 283 | LEFT_ANKLE = 22, 284 | RIGHT_ANKLE = 23, 285 | LEFT_BIG_TOE = 24, 286 | RIGHT_BIG_TOE = 25, 287 | LEFT_SMALL_TOE = 26, 288 | RIGHT_SMALL_TOE = 27, 289 | LEFT_HEEL = 28, 290 | RIGHT_HEEL = 29, 291 | // Hands 292 | LEFT_HAND_THUMB_4 = 30, // tip 293 | RIGHT_HAND_THUMB_4 = 31, 294 | LEFT_HAND_INDEX_1 = 32, // knuckle 295 | RIGHT_HAND_INDEX_1 = 33, 296 | LEFT_HAND_MIDDLE_4 = 34, // tip 297 | RIGHT_HAND_MIDDLE_4 = 35, 298 | LEFT_HAND_PINKY_1 = 36, // knuckle 299 | RIGHT_HAND_PINKY_1 = 37, 300 | LAST = 38 301 | }; 302 | 303 | inline int getIdx_38(BODY_38_PARTS part) { return static_cast(part); } 304 | 305 | enum class BODY_70_PARTS { 306 | PELVIS = 0, 307 | SPINE_1 = 1, 308 | SPINE_2 = 2, 309 | SPINE_3 = 3, 310 | NECK = 4, 311 | NOSE = 5, 312 | LEFT_EYE = 6, 313 | RIGHT_EYE = 7, 314 | LEFT_EAR = 8, 315 | RIGHT_EAR = 9, 316 | LEFT_CLAVICLE = 10, 317 | RIGHT_CLAVICLE = 11, 318 | LEFT_SHOULDER = 12, 319 | RIGHT_SHOULDER = 13, 320 | LEFT_ELBOW = 14, 321 | RIGHT_ELBOW = 15, 322 | LEFT_WRIST = 16, 323 | RIGHT_WRIST = 17, 324 | LEFT_HIP = 18, 325 | RIGHT_HIP = 19, 326 | LEFT_KNEE = 20, 327 | RIGHT_KNEE = 21, 328 | LEFT_ANKLE = 22, 329 | RIGHT_ANKLE = 23, 330 | LEFT_BIG_TOE = 24, 331 | RIGHT_BIG_TOE = 25, 332 | LEFT_SMALL_TOE = 26, 333 | RIGHT_SMALL_TOE = 27, 334 | LEFT_HEEL = 28, 335 | RIGHT_HEEL = 29, 336 | // Hands 337 | // Left 338 | LEFT_HAND_THUMB_1 = 30, 339 | LEFT_HAND_THUMB_2 = 31, 340 | LEFT_HAND_THUMB_3 = 32, 341 | LEFT_HAND_THUMB_4 = 33, // tip 342 | LEFT_HAND_INDEX_1 = 34, // knuckle 343 | LEFT_HAND_INDEX_2 = 35, 344 | LEFT_HAND_INDEX_3 = 36, 345 | LEFT_HAND_INDEX_4 = 37, // tip 346 | LEFT_HAND_MIDDLE_1 = 38, 347 | LEFT_HAND_MIDDLE_2 = 39, 348 | LEFT_HAND_MIDDLE_3 = 40, 349 | LEFT_HAND_MIDDLE_4 = 41, 350 | LEFT_HAND_RING_1 = 42, 351 | LEFT_HAND_RING_2 = 43, 352 | LEFT_HAND_RING_3 = 44, 353 | LEFT_HAND_RING_4 = 45, 354 | LEFT_HAND_PINKY_1 = 46, 355 | LEFT_HAND_PINKY_2 = 47, 356 | LEFT_HAND_PINKY_3 = 48, 357 | LEFT_HAND_PINKY_4 = 49, 358 | // Right 359 | RIGHT_HAND_THUMB_1 = 50, 360 | RIGHT_HAND_THUMB_2 = 51, 361 | RIGHT_HAND_THUMB_3 = 52, 362 | RIGHT_HAND_THUMB_4 = 53, 363 | RIGHT_HAND_INDEX_1 = 54, 364 | RIGHT_HAND_INDEX_2 = 55, 365 | RIGHT_HAND_INDEX_3 = 56, 366 | RIGHT_HAND_INDEX_4 = 57, 367 | RIGHT_HAND_MIDDLE_1 = 58, 368 | RIGHT_HAND_MIDDLE_2 = 59, 369 | RIGHT_HAND_MIDDLE_3 = 60, 370 | RIGHT_HAND_MIDDLE_4 = 61, 371 | RIGHT_HAND_RING_1 = 62, 372 | RIGHT_HAND_RING_2 = 63, 373 | RIGHT_HAND_RING_3 = 64, 374 | RIGHT_HAND_RING_4 = 65, 375 | RIGHT_HAND_PINKY_1 = 66, 376 | RIGHT_HAND_PINKY_2 = 67, 377 | RIGHT_HAND_PINKY_3 = 68, 378 | RIGHT_HAND_PINKY_4 = 69, 379 | LAST = 70 380 | }; 381 | 382 | inline int getIdx_70(BODY_70_PARTS part) { return static_cast(part); } 383 | 384 | const std::vector> BODY_18_BONES{{BODY_18_PARTS::NOSE, BODY_18_PARTS::NECK}, 385 | {BODY_18_PARTS::NECK, BODY_18_PARTS::RIGHT_SHOULDER}, 386 | {BODY_18_PARTS::RIGHT_SHOULDER, BODY_18_PARTS::RIGHT_ELBOW}, 387 | {BODY_18_PARTS::RIGHT_ELBOW, BODY_18_PARTS::RIGHT_WRIST}, 388 | {BODY_18_PARTS::NECK, BODY_18_PARTS::LEFT_SHOULDER}, 389 | {BODY_18_PARTS::LEFT_SHOULDER, BODY_18_PARTS::LEFT_ELBOW}, 390 | {BODY_18_PARTS::LEFT_ELBOW, BODY_18_PARTS::LEFT_WRIST}, 391 | {BODY_18_PARTS::RIGHT_SHOULDER, BODY_18_PARTS::RIGHT_HIP}, 392 | {BODY_18_PARTS::RIGHT_HIP, BODY_18_PARTS::RIGHT_KNEE}, 393 | {BODY_18_PARTS::RIGHT_KNEE, BODY_18_PARTS::RIGHT_ANKLE}, 394 | {BODY_18_PARTS::LEFT_SHOULDER, BODY_18_PARTS::LEFT_HIP}, 395 | {BODY_18_PARTS::LEFT_HIP, BODY_18_PARTS::LEFT_KNEE}, 396 | {BODY_18_PARTS::LEFT_KNEE, BODY_18_PARTS::LEFT_ANKLE}, 397 | {BODY_18_PARTS::RIGHT_SHOULDER, BODY_18_PARTS::LEFT_SHOULDER}, 398 | {BODY_18_PARTS::RIGHT_HIP, BODY_18_PARTS::LEFT_HIP}, 399 | {BODY_18_PARTS::NOSE, BODY_18_PARTS::RIGHT_EYE}, 400 | {BODY_18_PARTS::RIGHT_EYE, BODY_18_PARTS::RIGHT_EAR}, 401 | {BODY_18_PARTS::NOSE, BODY_18_PARTS::LEFT_EYE}, 402 | {BODY_18_PARTS::LEFT_EYE, BODY_18_PARTS::LEFT_EAR}}; 403 | 404 | const std::vector> BODY_34_BONES{{BODY_34_PARTS::PELVIS, BODY_34_PARTS::NAVAL_SPINE}, 405 | {BODY_34_PARTS::NAVAL_SPINE, BODY_34_PARTS::CHEST_SPINE}, 406 | {BODY_34_PARTS::CHEST_SPINE, BODY_34_PARTS::LEFT_CLAVICLE}, 407 | {BODY_34_PARTS::LEFT_CLAVICLE, BODY_34_PARTS::LEFT_SHOULDER}, 408 | {BODY_34_PARTS::LEFT_SHOULDER, BODY_34_PARTS::LEFT_ELBOW}, 409 | {BODY_34_PARTS::LEFT_ELBOW, BODY_34_PARTS::LEFT_WRIST}, 410 | {BODY_34_PARTS::LEFT_WRIST, BODY_34_PARTS::LEFT_HAND}, 411 | {BODY_34_PARTS::LEFT_HAND, BODY_34_PARTS::LEFT_HANDTIP}, 412 | {BODY_34_PARTS::LEFT_WRIST, BODY_34_PARTS::LEFT_THUMB}, 413 | {BODY_34_PARTS::CHEST_SPINE, BODY_34_PARTS::RIGHT_CLAVICLE}, 414 | {BODY_34_PARTS::RIGHT_CLAVICLE, BODY_34_PARTS::RIGHT_SHOULDER}, 415 | {BODY_34_PARTS::RIGHT_SHOULDER, BODY_34_PARTS::RIGHT_ELBOW}, 416 | {BODY_34_PARTS::RIGHT_ELBOW, BODY_34_PARTS::RIGHT_WRIST}, 417 | {BODY_34_PARTS::RIGHT_WRIST, BODY_34_PARTS::RIGHT_HAND}, 418 | {BODY_34_PARTS::RIGHT_HAND, BODY_34_PARTS::RIGHT_HANDTIP}, 419 | {BODY_34_PARTS::RIGHT_WRIST, BODY_34_PARTS::RIGHT_THUMB}, 420 | {BODY_34_PARTS::PELVIS, BODY_34_PARTS::LEFT_HIP}, 421 | {BODY_34_PARTS::LEFT_HIP, BODY_34_PARTS::LEFT_KNEE}, 422 | {BODY_34_PARTS::LEFT_KNEE, BODY_34_PARTS::LEFT_ANKLE}, 423 | {BODY_34_PARTS::LEFT_ANKLE, BODY_34_PARTS::LEFT_FOOT}, 424 | {BODY_34_PARTS::PELVIS, BODY_34_PARTS::RIGHT_HIP}, 425 | {BODY_34_PARTS::RIGHT_HIP, BODY_34_PARTS::RIGHT_KNEE}, 426 | {BODY_34_PARTS::RIGHT_KNEE, BODY_34_PARTS::RIGHT_ANKLE}, 427 | {BODY_34_PARTS::RIGHT_ANKLE, BODY_34_PARTS::RIGHT_FOOT}, 428 | {BODY_34_PARTS::CHEST_SPINE, BODY_34_PARTS::NECK}, 429 | {BODY_34_PARTS::NECK, BODY_34_PARTS::HEAD}, 430 | {BODY_34_PARTS::HEAD, BODY_34_PARTS::NOSE}, 431 | {BODY_34_PARTS::NOSE, BODY_34_PARTS::LEFT_EYE}, 432 | {BODY_34_PARTS::LEFT_EYE, BODY_34_PARTS::LEFT_EAR}, 433 | {BODY_34_PARTS::NOSE, BODY_34_PARTS::RIGHT_EYE}, 434 | {BODY_34_PARTS::RIGHT_EYE, BODY_34_PARTS::RIGHT_EAR}, 435 | {BODY_34_PARTS::LEFT_ANKLE, BODY_34_PARTS::LEFT_HEEL}, 436 | {BODY_34_PARTS::RIGHT_ANKLE, BODY_34_PARTS::RIGHT_HEEL}, 437 | {BODY_34_PARTS::LEFT_HEEL, BODY_34_PARTS::LEFT_FOOT}, 438 | {BODY_34_PARTS::RIGHT_HEEL, BODY_34_PARTS::RIGHT_FOOT}}; 439 | 440 | const std::vector> BODY_38_BONES{ 441 | {BODY_38_PARTS::PELVIS, BODY_38_PARTS::SPINE_1}, 442 | {BODY_38_PARTS::SPINE_1, BODY_38_PARTS::SPINE_2}, 443 | {BODY_38_PARTS::SPINE_2, BODY_38_PARTS::SPINE_3}, 444 | {BODY_38_PARTS::SPINE_3, BODY_38_PARTS::NECK}, 445 | // Face 446 | {BODY_38_PARTS::NECK, BODY_38_PARTS::NOSE}, 447 | {BODY_38_PARTS::NOSE, BODY_38_PARTS::LEFT_EYE}, 448 | {BODY_38_PARTS::LEFT_EYE, BODY_38_PARTS::LEFT_EAR}, 449 | {BODY_38_PARTS::NOSE, BODY_38_PARTS::RIGHT_EYE}, 450 | {BODY_38_PARTS::RIGHT_EYE, BODY_38_PARTS::RIGHT_EAR}, 451 | // Left arm 452 | {BODY_38_PARTS::SPINE_3, BODY_38_PARTS::LEFT_CLAVICLE}, 453 | {BODY_38_PARTS::LEFT_CLAVICLE, BODY_38_PARTS::LEFT_SHOULDER}, 454 | {BODY_38_PARTS::LEFT_SHOULDER, BODY_38_PARTS::LEFT_ELBOW}, 455 | {BODY_38_PARTS::LEFT_ELBOW, BODY_38_PARTS::LEFT_WRIST}, 456 | {BODY_38_PARTS::LEFT_WRIST, BODY_38_PARTS::LEFT_HAND_THUMB_4}, 457 | {BODY_38_PARTS::LEFT_WRIST, BODY_38_PARTS::LEFT_HAND_INDEX_1}, 458 | {BODY_38_PARTS::LEFT_WRIST, BODY_38_PARTS::LEFT_HAND_MIDDLE_4}, 459 | {BODY_38_PARTS::LEFT_WRIST, BODY_38_PARTS::LEFT_HAND_PINKY_1}, 460 | // Right arm 461 | {BODY_38_PARTS::SPINE_3, BODY_38_PARTS::RIGHT_CLAVICLE}, 462 | {BODY_38_PARTS::RIGHT_CLAVICLE, BODY_38_PARTS::RIGHT_SHOULDER}, 463 | {BODY_38_PARTS::RIGHT_SHOULDER, BODY_38_PARTS::RIGHT_ELBOW}, 464 | {BODY_38_PARTS::RIGHT_ELBOW, BODY_38_PARTS::RIGHT_WRIST}, 465 | {BODY_38_PARTS::RIGHT_WRIST, BODY_38_PARTS::RIGHT_HAND_THUMB_4}, 466 | {BODY_38_PARTS::RIGHT_WRIST, BODY_38_PARTS::RIGHT_HAND_INDEX_1}, 467 | {BODY_38_PARTS::RIGHT_WRIST, BODY_38_PARTS::RIGHT_HAND_MIDDLE_4}, 468 | {BODY_38_PARTS::RIGHT_WRIST, BODY_38_PARTS::RIGHT_HAND_PINKY_1}, 469 | // Left leg 470 | {BODY_38_PARTS::PELVIS, BODY_38_PARTS::LEFT_HIP}, 471 | {BODY_38_PARTS::LEFT_HIP, BODY_38_PARTS::LEFT_KNEE}, 472 | {BODY_38_PARTS::LEFT_KNEE, BODY_38_PARTS::LEFT_ANKLE}, 473 | {BODY_38_PARTS::LEFT_ANKLE, BODY_38_PARTS::LEFT_HEEL}, 474 | {BODY_38_PARTS::LEFT_ANKLE, BODY_38_PARTS::LEFT_BIG_TOE}, 475 | {BODY_38_PARTS::LEFT_ANKLE, BODY_38_PARTS::LEFT_SMALL_TOE}, 476 | // Right leg 477 | {BODY_38_PARTS::PELVIS, BODY_38_PARTS::RIGHT_HIP}, 478 | {BODY_38_PARTS::RIGHT_HIP, BODY_38_PARTS::RIGHT_KNEE}, 479 | {BODY_38_PARTS::RIGHT_KNEE, BODY_38_PARTS::RIGHT_ANKLE}, 480 | {BODY_38_PARTS::RIGHT_ANKLE, BODY_38_PARTS::RIGHT_HEEL}, 481 | {BODY_38_PARTS::RIGHT_ANKLE, BODY_38_PARTS::RIGHT_BIG_TOE}, 482 | {BODY_38_PARTS::RIGHT_ANKLE, BODY_38_PARTS::RIGHT_SMALL_TOE}, 483 | }; 484 | 485 | const std::vector> BODY_70_BONES{ 486 | {BODY_70_PARTS::PELVIS, BODY_70_PARTS::SPINE_1}, 487 | {BODY_70_PARTS::SPINE_1, BODY_70_PARTS::SPINE_2}, 488 | {BODY_70_PARTS::SPINE_2, BODY_70_PARTS::SPINE_3}, 489 | {BODY_70_PARTS::SPINE_3, BODY_70_PARTS::NECK}, 490 | // Face 491 | {BODY_70_PARTS::NECK, BODY_70_PARTS::NOSE}, 492 | {BODY_70_PARTS::NOSE, BODY_70_PARTS::LEFT_EYE}, 493 | {BODY_70_PARTS::LEFT_EYE, BODY_70_PARTS::LEFT_EAR}, 494 | {BODY_70_PARTS::NOSE, BODY_70_PARTS::RIGHT_EYE}, 495 | {BODY_70_PARTS::RIGHT_EYE, BODY_70_PARTS::RIGHT_EAR}, 496 | // Left arm 497 | {BODY_70_PARTS::SPINE_3, BODY_70_PARTS::LEFT_CLAVICLE}, 498 | {BODY_70_PARTS::LEFT_CLAVICLE, BODY_70_PARTS::LEFT_SHOULDER}, 499 | {BODY_70_PARTS::LEFT_SHOULDER, BODY_70_PARTS::LEFT_ELBOW}, 500 | {BODY_70_PARTS::LEFT_ELBOW, BODY_70_PARTS::LEFT_WRIST}, 501 | // Left hand 502 | {BODY_70_PARTS::LEFT_WRIST, BODY_70_PARTS::LEFT_HAND_THUMB_1}, 503 | {BODY_70_PARTS::LEFT_WRIST, BODY_70_PARTS::LEFT_HAND_THUMB_2}, 504 | {BODY_70_PARTS::LEFT_WRIST, BODY_70_PARTS::LEFT_HAND_THUMB_3}, 505 | {BODY_70_PARTS::LEFT_WRIST, BODY_70_PARTS::LEFT_HAND_THUMB_4}, 506 | {BODY_70_PARTS::LEFT_WRIST, BODY_70_PARTS::LEFT_HAND_INDEX_1}, 507 | {BODY_70_PARTS::LEFT_WRIST, BODY_70_PARTS::LEFT_HAND_INDEX_2}, 508 | {BODY_70_PARTS::LEFT_WRIST, BODY_70_PARTS::LEFT_HAND_INDEX_3}, 509 | {BODY_70_PARTS::LEFT_WRIST, BODY_70_PARTS::LEFT_HAND_INDEX_4}, 510 | {BODY_70_PARTS::LEFT_WRIST, BODY_70_PARTS::LEFT_HAND_MIDDLE_1}, 511 | {BODY_70_PARTS::LEFT_WRIST, BODY_70_PARTS::LEFT_HAND_MIDDLE_2}, 512 | {BODY_70_PARTS::LEFT_WRIST, BODY_70_PARTS::LEFT_HAND_MIDDLE_3}, 513 | {BODY_70_PARTS::LEFT_WRIST, BODY_70_PARTS::LEFT_HAND_MIDDLE_4}, 514 | {BODY_70_PARTS::LEFT_WRIST, BODY_70_PARTS::LEFT_HAND_PINKY_1}, 515 | {BODY_70_PARTS::LEFT_WRIST, BODY_70_PARTS::LEFT_HAND_PINKY_2}, 516 | {BODY_70_PARTS::LEFT_WRIST, BODY_70_PARTS::LEFT_HAND_PINKY_3}, 517 | {BODY_70_PARTS::LEFT_WRIST, BODY_70_PARTS::LEFT_HAND_PINKY_4}, 518 | // Right arm 519 | {BODY_70_PARTS::SPINE_3, BODY_70_PARTS::RIGHT_CLAVICLE}, 520 | {BODY_70_PARTS::RIGHT_CLAVICLE, BODY_70_PARTS::RIGHT_SHOULDER}, 521 | {BODY_70_PARTS::RIGHT_SHOULDER, BODY_70_PARTS::RIGHT_ELBOW}, 522 | {BODY_70_PARTS::RIGHT_ELBOW, BODY_70_PARTS::RIGHT_WRIST}, 523 | // Right hand 524 | {BODY_70_PARTS::RIGHT_WRIST, BODY_70_PARTS::RIGHT_HAND_THUMB_1}, 525 | {BODY_70_PARTS::RIGHT_WRIST, BODY_70_PARTS::RIGHT_HAND_THUMB_2}, 526 | {BODY_70_PARTS::RIGHT_WRIST, BODY_70_PARTS::RIGHT_HAND_THUMB_3}, 527 | {BODY_70_PARTS::RIGHT_WRIST, BODY_70_PARTS::RIGHT_HAND_THUMB_4}, 528 | {BODY_70_PARTS::RIGHT_WRIST, BODY_70_PARTS::RIGHT_HAND_INDEX_1}, 529 | {BODY_70_PARTS::RIGHT_WRIST, BODY_70_PARTS::RIGHT_HAND_INDEX_2}, 530 | {BODY_70_PARTS::RIGHT_WRIST, BODY_70_PARTS::RIGHT_HAND_INDEX_3}, 531 | {BODY_70_PARTS::RIGHT_WRIST, BODY_70_PARTS::RIGHT_HAND_INDEX_4}, 532 | {BODY_70_PARTS::RIGHT_WRIST, BODY_70_PARTS::RIGHT_HAND_MIDDLE_1}, 533 | {BODY_70_PARTS::RIGHT_WRIST, BODY_70_PARTS::RIGHT_HAND_MIDDLE_2}, 534 | {BODY_70_PARTS::RIGHT_WRIST, BODY_70_PARTS::RIGHT_HAND_MIDDLE_3}, 535 | {BODY_70_PARTS::RIGHT_WRIST, BODY_70_PARTS::RIGHT_HAND_MIDDLE_4}, 536 | {BODY_70_PARTS::RIGHT_WRIST, BODY_70_PARTS::RIGHT_HAND_PINKY_1}, 537 | {BODY_70_PARTS::RIGHT_WRIST, BODY_70_PARTS::RIGHT_HAND_PINKY_2}, 538 | {BODY_70_PARTS::RIGHT_WRIST, BODY_70_PARTS::RIGHT_HAND_PINKY_3}, 539 | {BODY_70_PARTS::RIGHT_WRIST, BODY_70_PARTS::RIGHT_HAND_PINKY_4}, 540 | // Left leg 541 | {BODY_70_PARTS::PELVIS, BODY_70_PARTS::LEFT_HIP}, 542 | {BODY_70_PARTS::LEFT_HIP, BODY_70_PARTS::LEFT_KNEE}, 543 | {BODY_70_PARTS::LEFT_KNEE, BODY_70_PARTS::LEFT_ANKLE}, 544 | {BODY_70_PARTS::LEFT_ANKLE, BODY_70_PARTS::LEFT_HEEL}, 545 | {BODY_70_PARTS::LEFT_ANKLE, BODY_70_PARTS::LEFT_BIG_TOE}, 546 | {BODY_70_PARTS::LEFT_ANKLE, BODY_70_PARTS::LEFT_SMALL_TOE}, 547 | // Right leg 548 | {BODY_70_PARTS::PELVIS, BODY_70_PARTS::RIGHT_HIP}, 549 | {BODY_70_PARTS::RIGHT_HIP, BODY_70_PARTS::RIGHT_KNEE}, 550 | {BODY_70_PARTS::RIGHT_KNEE, BODY_70_PARTS::RIGHT_ANKLE}, 551 | {BODY_70_PARTS::RIGHT_ANKLE, BODY_70_PARTS::RIGHT_HEEL}, 552 | {BODY_70_PARTS::RIGHT_ANKLE, BODY_70_PARTS::RIGHT_BIG_TOE}, 553 | {BODY_70_PARTS::RIGHT_ANKLE, BODY_70_PARTS::RIGHT_SMALL_TOE}, 554 | }; 555 | } // namespace skeleton 556 | 557 | GST_EXPORT 558 | GType gst_zed_src_meta_api_get_type(void); 559 | #define GST_ZED_SRC_META_API_TYPE (gst_zed_src_meta_api_get_type()) 560 | #define GST_ZED_SRC_META_INFO (gst_zed_src_meta_get_info()) 561 | 562 | #define gst_buffer_get_zed_src_meta(b) ((GstZedSrcMeta *) gst_buffer_get_meta((b), GST_ZED_SRC_META_API_TYPE)) 563 | 564 | /* implementation */ 565 | 566 | GST_EXPORT 567 | const GstMetaInfo *gst_zed_src_meta_get_info(void); 568 | #define GST_ZED_SRC_META_INFO (gst_zed_src_meta_get_info()) 569 | 570 | GST_EXPORT 571 | GstZedSrcMeta *gst_buffer_add_zed_src_meta(GstBuffer *buffer, ZedInfo &info, ZedPose &pose, ZedSensors &sens, gboolean od_enabled, guint8 obj_count, 572 | ZedObjectData *objects, guint64 frame_id); 573 | 574 | G_END_DECLS 575 | 576 | #endif 577 | -------------------------------------------------------------------------------- /gst-zed-od-overlay/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | ################################################ 2 | ## Generate symbols for IDE indexer (VSCode) 3 | set(CMAKE_EXPORT_COMPILE_COMMANDS ON) 4 | 5 | # Default to C99 6 | if(NOT CMAKE_C_STANDARD) 7 | set(CMAKE_C_STANDARD 99) 8 | endif() 9 | 10 | # Default to C++14 11 | if(NOT CMAKE_CXX_STANDARD) 12 | set(CMAKE_CXX_STANDARD 14) 13 | endif() 14 | 15 | add_definitions(-Werror=return-type) 16 | 17 | set(SOURCES 18 | gstzedodoverlay.cpp 19 | ) 20 | 21 | set(HEADERS 22 | gstzedodoverlay.h 23 | ) 24 | 25 | set(libname gstzedodoverlay) 26 | 27 | message( " * ${libname} plugin added") 28 | 29 | include_directories(${OpenCV_INCLUDE_DIRS}) 30 | link_directories(${LIBRARY_INSTALL_DIR}) 31 | link_directories(${OpenCV_LINK_DIRECTORIES}) 32 | 33 | add_library (${libname} MODULE 34 | ${SOURCES} 35 | ${HEADERS} 36 | ) 37 | 38 | if(UNIX) 39 | message(" ${libname}: OS Unix") 40 | add_definitions(-std=c++11 -Wno-deprecated-declarations -Wno-write-strings) 41 | endif(UNIX) 42 | 43 | if (CMAKE_BUILD_TYPE EQUAL "DEBUG") 44 | message(" ${libname}: Debug mode") 45 | add_definitions(-g) 46 | else() 47 | message(" ${libname}: Release mode") 48 | add_definitions(-O2) 49 | endif() 50 | 51 | add_dependencies (${libname} gstzedmeta) 52 | 53 | if (WIN32) 54 | target_link_libraries (${libname} LINK_PUBLIC 55 | ${GLIB2_LIBRARIES} 56 | ${GOBJECT_LIBRARIES} 57 | ${GSTREAMER_LIBRARY} 58 | ${GSTREAMER_BASE_LIBRARY} 59 | ${GSTREAMER_VIDEO_LIBRARY} 60 | gstzedmeta 61 | ${OpenCV_LIBRARIES} 62 | ) 63 | else() 64 | target_link_libraries (${libname} LINK_PUBLIC 65 | ${GLIB2_LIBRARIES} 66 | ${GOBJECT_LIBRARIES} 67 | ${GSTREAMER_LIBRARY} 68 | ${GSTREAMER_BASE_LIBRARY} 69 | ${GSTREAMER_VIDEO_LIBRARY} 70 | ${CMAKE_CURRENT_BINARY_DIR}/../gst-zed-meta/libgstzedmeta.so 71 | ${OpenCV_LIBRARIES} 72 | ) 73 | endif() 74 | 75 | 76 | if (WIN32) 77 | install (FILES $ DESTINATION ${PDB_INSTALL_DIR} COMPONENT pdb OPTIONAL) 78 | endif () 79 | install(TARGETS ${libname} LIBRARY DESTINATION ${PLUGIN_INSTALL_DIR}) 80 | -------------------------------------------------------------------------------- /gst-zed-od-overlay/gstzedodoverlay.cpp: -------------------------------------------------------------------------------- 1 | // ///////////////////////////////////////////////////////////////////////// 2 | 3 | // 4 | // Copyright (c) 2024, STEREOLABS. 5 | // 6 | // All rights reserved. 7 | // 8 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 9 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 10 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 11 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 12 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 13 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 14 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 15 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 16 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 17 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 18 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 19 | // 20 | // ///////////////////////////////////////////////////////////////////////// 21 | 22 | #include 23 | #include 24 | 25 | #include 26 | #include 27 | #include 28 | #include 29 | 30 | #include "gstzedodoverlay.h" 31 | 32 | GST_DEBUG_CATEGORY_STATIC(gst_zed_od_overlay_debug); 33 | #define GST_CAT_DEFAULT gst_zed_od_overlay_debug 34 | 35 | static void draw_objects(GstZedOdOverlay *filter, cv::Mat &image, guint8 obj_count, ZedObjectData *objs, gfloat scaleW, gfloat scaleH); 36 | gboolean gst_zedoddisplaysink_event(GstBaseTransform *base, GstEvent *event); 37 | 38 | /* Filter signals and args */ 39 | enum { 40 | /* FILL ME */ 41 | LAST_SIGNAL 42 | }; 43 | 44 | enum { PROP_0 }; 45 | 46 | static GstStaticPadTemplate sink_template = 47 | GST_STATIC_PAD_TEMPLATE("sink", GST_PAD_SINK, GST_PAD_ALWAYS, 48 | GST_STATIC_CAPS(("video/x-raw, " // Double stream VGA 49 | "format = (string)BGRA, " 50 | "width = (int)672, " 51 | "height = (int)752 , " 52 | "framerate = (fraction) { 15, 30, 60, 100 }" 53 | ";" 54 | "video/x-raw, " // Double stream HD720 55 | "format = (string)BGRA, " 56 | "width = (int)1280, " 57 | "height = (int)1440, " 58 | "framerate = (fraction) { 15, 30, 60 }" 59 | ";" 60 | "video/x-raw, " // Double stream HD1080 61 | "format = (string)BGRA, " 62 | "width = (int)1920, " 63 | "height = (int)2160, " 64 | "framerate = (fraction) { 15, 30, 60 }" 65 | ";" 66 | "video/x-raw, " // Double stream HD2K 67 | "format = (string)BGRA, " 68 | "width = (int)2208, " 69 | "height = (int)2484, " 70 | "framerate = (fraction)15" 71 | ";" 72 | "video/x-raw, " // Double stream HD1200 (GMSL2) 73 | "format = (string)BGRA, " 74 | "width = (int)1920, " 75 | "height = (int)2400, " 76 | "framerate = (fraction) { 15, 30, 60 }" 77 | ";" 78 | "video/x-raw, " // Double stream SVGA (GMSL2) 79 | "format = (string)BGRA, " 80 | "width = (int)960, " 81 | "height = (int)1200, " 82 | "framerate = (fraction) { 15, 30, 60, 120 }" 83 | ";" 84 | "video/x-raw, " // Color VGA 85 | "format = (string)BGRA, " 86 | "width = (int)672, " 87 | "height = (int)376, " 88 | "framerate = (fraction) { 15, 30, 60, 100 }" 89 | ";" 90 | "video/x-raw, " // Color HD720 91 | "format = (string)BGRA, " 92 | "width = (int)1280, " 93 | "height = (int)720, " 94 | "framerate = (fraction) { 15, 30, 60}" 95 | ";" 96 | "video/x-raw, " // Color HD1080 97 | "format = (string)BGRA, " 98 | "width = (int)1920, " 99 | "height = (int)1080, " 100 | "framerate = (fraction) { 15, 30, 60 }" 101 | ";" 102 | "video/x-raw, " // Color HD2K 103 | "format = (string)BGRA, " 104 | "width = (int)2208, " 105 | "height = (int)1242, " 106 | "framerate = (fraction)15" 107 | ";" 108 | "video/x-raw, " // Color HD1200 (GMSL2) 109 | "format = (string)BGRA, " 110 | "width = (int)1920, " 111 | "height = (int)1200, " 112 | "framerate = (fraction) { 15, 30, 60 }" 113 | ";" 114 | "video/x-raw, " // Color SVGA (GMSL2) 115 | "format = (string)BGRA, " 116 | "width = (int)960, " 117 | "height = (int)600, " 118 | "framerate = (fraction) { 15, 30, 60, 120 }" 119 | ";" 120 | "video/x-raw, " // Depth VGA 121 | "format = (string)GRAY16_LE, " 122 | "width = (int)672, " 123 | "height = (int)376, " 124 | "framerate = (fraction) { 15, 30, 60, 100 }" 125 | ";" 126 | "video/x-raw, " // Depth HD720 127 | "format = (string)GRAY16_LE, " 128 | "width = (int)1280, " 129 | "height = (int)720, " 130 | "framerate = (fraction) { 15, 30, 60}" 131 | ";" 132 | "video/x-raw, " // Depth HD1080 133 | "format = (string)GRAY16_LE, " 134 | "width = (int)1920, " 135 | "height = (int)1080, " 136 | "framerate = (fraction) { 15, 30, 60 }" 137 | ";" 138 | "video/x-raw, " // Depth HD2K 139 | "format = (string)GRAY16_LE, " 140 | "width = (int)2208, " 141 | "height = (int)1242, " 142 | "framerate = (fraction)15" 143 | ";" 144 | "video/x-raw, " // Depth HD1200 (GMSL2) 145 | "format = (string)GRAY16_LE, " 146 | "width = (int)1920, " 147 | "height = (int)1200, " 148 | "framerate = (fraction) { 15, 30, 60 }" 149 | ";" 150 | "video/x-raw, " // Depth SVGA (GMSL2) 151 | "format = (string)GRAY16_LE, " 152 | "width = (int)960, " 153 | "height = (int)600, " 154 | "framerate = (fraction) { 15, 30, 60, 120 }"))); 155 | 156 | static GstStaticPadTemplate src_template = 157 | GST_STATIC_PAD_TEMPLATE("src", GST_PAD_SRC, GST_PAD_ALWAYS, 158 | GST_STATIC_CAPS(("video/x-raw, " // Double stream VGA 159 | "format = (string)BGRA, " 160 | "width = (int)672, " 161 | "height = (int)752 , " 162 | "framerate = (fraction) { 15, 30, 60, 100 }" 163 | ";" 164 | "video/x-raw, " // Double stream HD720 165 | "format = (string)BGRA, " 166 | "width = (int)1280, " 167 | "height = (int)1440, " 168 | "framerate = (fraction) { 15, 30, 60 }" 169 | ";" 170 | "video/x-raw, " // Double stream HD1080 171 | "format = (string)BGRA, " 172 | "width = (int)1920, " 173 | "height = (int)2160, " 174 | "framerate = (fraction) { 15, 30, 60 }" 175 | ";" 176 | "video/x-raw, " // Double stream HD2K 177 | "format = (string)BGRA, " 178 | "width = (int)2208, " 179 | "height = (int)2484, " 180 | "framerate = (fraction)15" 181 | ";" 182 | "video/x-raw, " // Double stream HD1200 (GMSL2) 183 | "format = (string)BGRA, " 184 | "width = (int)1920, " 185 | "height = (int)2400, " 186 | "framerate = (fraction) { 15, 30, 60 }" 187 | ";" 188 | "video/x-raw, " // Double stream SVGA (GMSL2) 189 | "format = (string)BGRA, " 190 | "width = (int)960, " 191 | "height = (int)1200, " 192 | "framerate = (fraction) { 15, 30, 60, 120 }" 193 | ";" 194 | "video/x-raw, " // Color VGA 195 | "format = (string)BGRA, " 196 | "width = (int)672, " 197 | "height = (int)376, " 198 | "framerate = (fraction) { 15, 30, 60, 100 }" 199 | ";" 200 | "video/x-raw, " // Color HD720 201 | "format = (string)BGRA, " 202 | "width = (int)1280, " 203 | "height = (int)720, " 204 | "framerate = (fraction) { 15, 30, 60}" 205 | ";" 206 | "video/x-raw, " // Color HD1080 207 | "format = (string)BGRA, " 208 | "width = (int)1920, " 209 | "height = (int)1080, " 210 | "framerate = (fraction) { 15, 30, 60 }" 211 | ";" 212 | "video/x-raw, " // Color HD2K 213 | "format = (string)BGRA, " 214 | "width = (int)2208, " 215 | "height = (int)1242, " 216 | "framerate = (fraction)15" 217 | ";" 218 | "video/x-raw, " // Color HD1200 (GMSL2) 219 | "format = (string)BGRA, " 220 | "width = (int)1920, " 221 | "height = (int)1200, " 222 | "framerate = (fraction) { 15, 30, 60 }" 223 | ";" 224 | "video/x-raw, " // Color SVGA (GMSL2) 225 | "format = (string)BGRA, " 226 | "width = (int)960, " 227 | "height = (int)600, " 228 | "framerate = (fraction) { 15, 30, 60, 120 }" 229 | ";" 230 | "video/x-raw, " // Depth VGA 231 | "format = (string)GRAY16_LE, " 232 | "width = (int)672, " 233 | "height = (int)376, " 234 | "framerate = (fraction) { 15, 30, 60, 100 }" 235 | ";" 236 | "video/x-raw, " // Depth HD720 237 | "format = (string)GRAY16_LE, " 238 | "width = (int)1280, " 239 | "height = (int)720, " 240 | "framerate = (fraction) { 15, 30, 60}" 241 | ";" 242 | "video/x-raw, " // Depth HD1080 243 | "format = (string)GRAY16_LE, " 244 | "width = (int)1920, " 245 | "height = (int)1080, " 246 | "framerate = (fraction) { 15, 30, 60 }" 247 | ";" 248 | "video/x-raw, " // Depth HD2K 249 | "format = (string)GRAY16_LE, " 250 | "width = (int)2208, " 251 | "height = (int)1242, " 252 | "framerate = (fraction)15" 253 | ";" 254 | "video/x-raw, " // Depth HD1200 (GMSL2) 255 | "format = (string)GRAY16_LE, " 256 | "width = (int)1920, " 257 | "height = (int)1200, " 258 | "framerate = (fraction) { 15, 30, 60 }" 259 | ";" 260 | "video/x-raw, " // Depth SVGA (GMSL2) 261 | "format = (string)GRAY16_LE, " 262 | "width = (int)960, " 263 | "height = (int)600, " 264 | "framerate = (fraction) { 15, 30, 60, 120 }"))); 265 | 266 | #define gst_zed_od_overlay_parent_class parent_class 267 | G_DEFINE_TYPE(GstZedOdOverlay, gst_zed_od_overlay, GST_TYPE_BASE_TRANSFORM); 268 | 269 | static void gst_zed_od_overlay_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); 270 | static void gst_zed_od_overlay_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); 271 | 272 | static GstFlowReturn gst_zed_od_overlay_transform_ip(GstBaseTransform *base, GstBuffer *outbuf); 273 | 274 | /* GObject vmethod implementations */ 275 | 276 | /* initialize the plugin's class */ 277 | static void gst_zed_od_overlay_class_init(GstZedOdOverlayClass *klass) { 278 | GObjectClass *gobject_class; 279 | GstElementClass *gstelement_class; 280 | 281 | gobject_class = (GObjectClass *) klass; 282 | gstelement_class = (GstElementClass *) klass; 283 | 284 | gobject_class->set_property = gst_zed_od_overlay_set_property; 285 | gobject_class->get_property = gst_zed_od_overlay_get_property; 286 | 287 | gst_element_class_set_details_simple(gstelement_class, "ZedOdOverlay", "Generic/Filter", "Draws the results of ZED Object Detection module", 288 | "Stereolabs "); 289 | 290 | gst_element_class_add_pad_template(gstelement_class, gst_static_pad_template_get(&src_template)); 291 | gst_element_class_add_pad_template(gstelement_class, gst_static_pad_template_get(&sink_template)); 292 | 293 | GST_BASE_TRANSFORM_CLASS(klass)->transform_ip = GST_DEBUG_FUNCPTR(gst_zed_od_overlay_transform_ip); 294 | 295 | GST_BASE_TRANSFORM_CLASS(klass)->sink_event = GST_DEBUG_FUNCPTR(gst_zedoddisplaysink_event); 296 | 297 | // debug category for filtering log messages 298 | GST_DEBUG_CATEGORY_INIT(gst_zed_od_overlay_debug, "zedodoverlay", 0, "Zed Object Detection Overlay"); 299 | } 300 | 301 | /* initialize the new element 302 | * initialize instance structure 303 | */ 304 | static void gst_zed_od_overlay_init(GstZedOdOverlay *filter) { 305 | filter->img_left_w = 0; 306 | filter->img_left_h = 0; 307 | } 308 | 309 | static void gst_zed_od_overlay_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { 310 | GstZedOdOverlay *filter = GST_ZED_OD_OVERLAY(object); 311 | 312 | switch (prop_id) { 313 | default: 314 | G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); 315 | break; 316 | } 317 | } 318 | 319 | static void gst_zed_od_overlay_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { 320 | GstZedOdOverlay *filter = GST_ZED_OD_OVERLAY(object); 321 | 322 | switch (prop_id) { 323 | default: 324 | G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); 325 | break; 326 | } 327 | } 328 | 329 | /* GstBaseTransform vmethod implementations */ 330 | gboolean gst_zedoddisplaysink_event(GstBaseTransform *base, GstEvent *event) { 331 | GstEventType type; 332 | GstZedOdOverlay *filter = GST_ZED_OD_OVERLAY(base); 333 | 334 | type = GST_EVENT_TYPE(event); 335 | 336 | GST_TRACE_OBJECT(filter, "Event %d [%d]", type, GST_EVENT_CAPS); 337 | 338 | switch (type) { 339 | case GST_EVENT_EOS: 340 | break; 341 | case GST_EVENT_CAPS: { 342 | GST_DEBUG_OBJECT(filter, "Event CAPS"); 343 | GstCaps *caps; 344 | 345 | gst_event_parse_caps(event, &caps); 346 | 347 | GstVideoInfo vinfo_in; 348 | gst_video_info_from_caps(&vinfo_in, caps); 349 | filter->img_left_w = vinfo_in.width; 350 | filter->img_left_h = vinfo_in.height; 351 | if (vinfo_in.height == 752 || vinfo_in.height == 1440 || vinfo_in.height == 2160 || vinfo_in.height == 2484) { 352 | filter->img_left_h /= 2; // Only half buffer size if the stream is composite 353 | } 354 | 355 | break; 356 | } 357 | default: 358 | break; 359 | } 360 | 361 | return GST_BASE_TRANSFORM_CLASS(parent_class)->sink_event(base, event); 362 | } 363 | 364 | /* this function does the actual processing 365 | */ 366 | static GstFlowReturn gst_zed_od_overlay_transform_ip(GstBaseTransform *base, GstBuffer *outbuf) { 367 | GstZedOdOverlay *filter = GST_ZED_OD_OVERLAY(base); 368 | GST_TRACE_OBJECT(filter, "transform_ip"); 369 | 370 | GstMapInfo map_buf; 371 | 372 | if (GST_CLOCK_TIME_IS_VALID(GST_BUFFER_TIMESTAMP(outbuf))) 373 | gst_object_sync_values(GST_OBJECT(filter), GST_BUFFER_TIMESTAMP(outbuf)); 374 | 375 | if (FALSE == gst_buffer_map(outbuf, &map_buf, GstMapFlags(GST_MAP_READ | GST_MAP_WRITE))) { 376 | GST_WARNING_OBJECT(filter, "Could not map buffer for write/read"); 377 | return GST_FLOW_OK; 378 | } 379 | 380 | // Get left image (upper half memory buffer) 381 | cv::Mat ocv_left = cv::Mat(filter->img_left_h, filter->img_left_w, CV_8UC4, map_buf.data); 382 | 383 | // Metadata 384 | GstZedSrcMeta *meta = (GstZedSrcMeta *) gst_buffer_get_meta(outbuf, GST_ZED_SRC_META_API_TYPE); 385 | 386 | if (meta == NULL) // Metadata not found 387 | { 388 | GST_ELEMENT_ERROR(filter, RESOURCE, FAILED, ("No ZED metadata [GstZedSrcMeta] found in the stream'"), (NULL)); 389 | return GST_FLOW_ERROR; 390 | } 391 | 392 | GST_LOG_OBJECT(filter, "Cam. Model: %d", meta->info.cam_model); 393 | GST_LOG_OBJECT(filter, "Stream type: %d", meta->info.stream_type); 394 | GST_LOG_OBJECT(filter, "Grab frame Size: %d x %d", meta->info.grab_single_frame_width, meta->info.grab_single_frame_height); 395 | GST_LOG_OBJECT(filter, "Filter frame Size: %d x %d", filter->img_left_w, filter->img_left_h); 396 | 397 | gboolean rescaled = FALSE; 398 | gfloat scaleW = 1.0f; 399 | gfloat scaleH = 1.0f; 400 | if (meta->info.grab_single_frame_width != filter->img_left_w || meta->info.grab_single_frame_height != filter->img_left_h) { 401 | rescaled = TRUE; 402 | scaleW = ((gfloat) filter->img_left_w) / meta->info.grab_single_frame_width; 403 | scaleH = ((gfloat) filter->img_left_h) / meta->info.grab_single_frame_height; 404 | } 405 | 406 | if (meta->od_enabled) { 407 | GST_LOG_OBJECT(filter, "Detected %d objects", meta->obj_count); 408 | // Draw 2D detections 409 | draw_objects(filter, ocv_left, meta->obj_count, meta->objects, scaleW, scaleH); 410 | } 411 | 412 | GST_TRACE("Buffer unmap"); 413 | gst_buffer_unmap(outbuf, &map_buf); 414 | 415 | return GST_FLOW_OK; 416 | } 417 | 418 | /* entry point to initialize the plug-in 419 | * initialize the plug-in itself 420 | * register the element factories and other features 421 | */ 422 | static gboolean plugin_init(GstPlugin *plugin) { return gst_element_register(plugin, "zedodoverlay", GST_RANK_NONE, GST_TYPE_ZED_OD_OVERLAY); } 423 | 424 | GST_PLUGIN_DEFINE(GST_VERSION_MAJOR, GST_VERSION_MINOR, zedodoverlay, "ZED Object Detection Overlay", plugin_init, GST_PACKAGE_VERSION, GST_PACKAGE_LICENSE, 425 | GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) 426 | 427 | static void draw_objects(GstZedOdOverlay *filter, cv::Mat &image, guint8 obj_count, ZedObjectData *objs, gfloat scaleW, gfloat scaleH) { 428 | for (int i = 0; i < obj_count; i++) { 429 | cv::Scalar color = cv::Scalar::all(125); 430 | if (objs[i].id >= 0) { 431 | color = cv::Scalar((objs[i].id * 232 + 232) % 255, (objs[i].id * 176 + 176) % 255, (objs[i].id * 59 + 59) % 255); 432 | } 433 | 434 | cv::Rect roi_render(0, 0, image.size().width, image.size().height); 435 | 436 | GST_LOG_OBJECT(filter,"Object: %d", i); 437 | GST_LOG_OBJECT(filter," * Id: %d [%d]", (int) objs[i].label, (int) objs[i].sublabel); 438 | GST_LOG_OBJECT(filter," * Pos: %g,%g,%g", objs[i].position[0], objs[i].position[1], objs[i].position[2]); 439 | 440 | if (objs[i].skeletons_avail == FALSE) { 441 | GST_LOG_OBJECT(filter,"Scale: %g, %g", scaleW, scaleH); 442 | 443 | // ----> Bounding box 444 | 445 | cv::Point2f tl; 446 | tl.x = objs[i].bounding_box_2d[0][0] * scaleW; 447 | tl.y = objs[i].bounding_box_2d[0][1] * scaleH; 448 | cv::Point2f br; 449 | br.x = objs[i].bounding_box_2d[2][0] * scaleW; 450 | br.y = objs[i].bounding_box_2d[2][1] * scaleH; 451 | cv::rectangle(image, tl, br, color, 3); 452 | 453 | // <---- Bounding box 454 | 455 | // ----> Text info 456 | int baseline = 0; 457 | int font_face = cv::FONT_HERSHEY_COMPLEX_SMALL; 458 | double font_scale = 0.75; 459 | 460 | std::stringstream txt_info; 461 | txt_info << "Id: " << objs[i].id << " - "; 462 | 463 | switch (objs[i].label) { 464 | case OBJECT_CLASS::PERSON: 465 | txt_info << "PERSON"; 466 | break; 467 | case OBJECT_CLASS::VEHICLE: 468 | txt_info << "VEHICLE"; 469 | break; 470 | case OBJECT_CLASS::ANIMAL: 471 | txt_info << "ANIMAL"; 472 | break; 473 | case OBJECT_CLASS::BAG: 474 | txt_info << "BAG"; 475 | break; 476 | case OBJECT_CLASS::ELECTRONICS: 477 | txt_info << "ELECTRONICS"; 478 | break; 479 | case OBJECT_CLASS::FRUIT_VEGETABLE: 480 | txt_info << "FRUIT_VEGETABLE"; 481 | break; 482 | case OBJECT_CLASS::LAST: 483 | default: 484 | txt_info << "UNDEFINED"; 485 | break; 486 | } 487 | 488 | if (!objs[i].skeletons_avail) { 489 | switch (objs[i].sublabel) { 490 | case OBJECT_SUBCLASS::PERSON: 491 | // txt_info << " [Person]"; 492 | break; 493 | case OBJECT_SUBCLASS::BICYCLE: 494 | txt_info << " [Bicycle]"; 495 | break; 496 | case OBJECT_SUBCLASS::CAR: 497 | txt_info << " [Car]"; 498 | break; 499 | case OBJECT_SUBCLASS::MOTORBIKE: 500 | txt_info << " [Motorbike]"; 501 | break; 502 | case OBJECT_SUBCLASS::BUS: 503 | txt_info << " [Bus]"; 504 | break; 505 | case OBJECT_SUBCLASS::TRUCK: 506 | txt_info << " [Truck]"; 507 | break; 508 | case OBJECT_SUBCLASS::BOAT: 509 | txt_info << " [Boat]"; 510 | break; 511 | case OBJECT_SUBCLASS::BACKPACK: 512 | txt_info << " [Backpack]"; 513 | break; 514 | case OBJECT_SUBCLASS::HANDBAG: 515 | txt_info << " [Handbag]"; 516 | break; 517 | case OBJECT_SUBCLASS::SUITCASE: 518 | txt_info << " [Suitcase]"; 519 | break; 520 | case OBJECT_SUBCLASS::BIRD: 521 | txt_info << " [Bird]"; 522 | break; 523 | case OBJECT_SUBCLASS::CAT: 524 | txt_info << " [Cat]"; 525 | break; 526 | case OBJECT_SUBCLASS::DOG: 527 | txt_info << " [Dog]"; 528 | break; 529 | case OBJECT_SUBCLASS::HORSE: 530 | txt_info << " [Horse]"; 531 | break; 532 | case OBJECT_SUBCLASS::SHEEP: 533 | txt_info << " [Sheep]"; 534 | break; 535 | case OBJECT_SUBCLASS::COW: 536 | txt_info << " [Cow]"; 537 | break; 538 | case OBJECT_SUBCLASS::CELLPHONE: 539 | txt_info << " [CellPhone]"; 540 | break; 541 | case OBJECT_SUBCLASS::LAPTOP: 542 | txt_info << " [Laptop]"; 543 | break; 544 | case OBJECT_SUBCLASS::BANANA: 545 | txt_info << " [Banana]"; 546 | break; 547 | case OBJECT_SUBCLASS::APPLE: 548 | txt_info << " [Apple]"; 549 | break; 550 | case OBJECT_SUBCLASS::ORANGE: 551 | txt_info << " [Orange]"; 552 | break; 553 | case OBJECT_SUBCLASS::CARROT: 554 | txt_info << " [Carrot]"; 555 | break; 556 | default: 557 | txt_info << " [-]"; 558 | break; 559 | } 560 | } 561 | 562 | cv::Size txt_size = cv::getTextSize(txt_info.str(), font_face, font_scale, 1, &baseline); 563 | 564 | int offset = 5; 565 | 566 | cv::Point txt_tl; 567 | cv::Point txt_br; 568 | cv::Point txt_pos; 569 | 570 | txt_tl.x = tl.x; 571 | txt_tl.y = tl.y - (txt_size.height + 2 * offset); 572 | 573 | txt_br.x = tl.x + (txt_size.width + 2 * offset); 574 | txt_br.y = tl.y; 575 | 576 | txt_pos.x = txt_tl.x + offset; 577 | txt_pos.y = txt_br.y - offset; 578 | 579 | if (!roi_render.contains(txt_tl)) { 580 | txt_tl.y = tl.y + (txt_size.height + 2 * baseline); 581 | txt_pos.y = txt_tl.y - offset; 582 | } 583 | 584 | cv::rectangle(image, txt_tl, txt_br, color, 1); 585 | cv::putText(image, txt_info.str(), txt_pos, font_face, font_scale, color, 1, cv::LINE_AA); 586 | 587 | if (!std::isnan(objs[i].position[0]) && !std::isnan(objs[i].position[1]) && !std::isnan(objs[i].position[2])) { 588 | float dist = 589 | sqrtf(objs[i].position[0] * objs[i].position[0] + objs[i].position[1] * objs[i].position[1] + objs[i].position[2] * objs[i].position[2]); 590 | char text[64]; 591 | sprintf(text, "%.2fm", abs(dist / 1000.0f)); 592 | putText(image, text, cv::Point2i(tl.x + (br.x - tl.x) / 2 - 20, tl.y + (br.y - tl.y) / 2 - 12), cv::FONT_HERSHEY_COMPLEX_SMALL, 0.75, color, 1); 593 | } 594 | // <---- Text info 595 | } else { 596 | GST_LOG_OBJECT(filter,"Scale: %g, %g", scaleW, scaleH); 597 | GST_LOG_OBJECT(filter,"Format: %d", objs[i].skel_format); 598 | // ----> Skeletons 599 | { 600 | switch (objs[i].skel_format) { 601 | case 18: 602 | // ----> Bones 603 | for (const auto &parts : skeleton::BODY_18_BONES) { 604 | if (objs[i].keypoint_2d[skeleton::getIdx_18(parts.first)][0] >= 0 && objs[i].keypoint_2d[skeleton::getIdx_18(parts.first)][1] >= 0 && 605 | objs[i].keypoint_2d[skeleton::getIdx_18(parts.second)][0] >= 0 && objs[i].keypoint_2d[skeleton::getIdx_18(parts.second)][1] >= 0) { 606 | cv::Point2f kp_a; 607 | kp_a.x = objs[i].keypoint_2d[skeleton::getIdx_18(parts.first)][0] * scaleW; 608 | kp_a.y = objs[i].keypoint_2d[skeleton::getIdx_18(parts.first)][1] * scaleH; 609 | GST_LOG_OBJECT(filter,"kp_a: %g, %g", kp_a.x, kp_a.y); 610 | 611 | cv::Point2f kp_b; 612 | kp_b.x = objs[i].keypoint_2d[skeleton::getIdx_18(parts.second)][0] * scaleW; 613 | kp_b.y = objs[i].keypoint_2d[skeleton::getIdx_18(parts.second)][1] * scaleH; 614 | GST_LOG_OBJECT(filter,"kp_b: %g, %g", kp_b.x, kp_b.y); 615 | 616 | if (roi_render.contains(kp_a) && roi_render.contains(kp_b)) 617 | cv::line(image, kp_a, kp_b, color, 1, cv::LINE_AA); 618 | } 619 | } 620 | // <---- Bones 621 | // ----> Joints 622 | for (int j = 0; j < 18; j++) { 623 | if (objs[i].keypoint_2d[j][0] >= 0 && objs[i].keypoint_2d[j][1] >= 0) { 624 | cv::Point2f cv_kp; 625 | cv_kp.x = objs[i].keypoint_2d[j][0] * scaleW; 626 | cv_kp.y = objs[i].keypoint_2d[j][1] * scaleH; 627 | if (roi_render.contains(cv_kp)) { 628 | cv::circle(image, cv_kp, 3, color + cv::Scalar(50, 50, 50), -1, cv::LINE_AA); 629 | } 630 | } 631 | } 632 | // <---- Joints 633 | break; 634 | case 34: 635 | // ----> Bones 636 | for (const auto &parts : skeleton::BODY_34_BONES) { 637 | if (objs[i].keypoint_2d[skeleton::getIdx_34(parts.first)][0] >= 0 && objs[i].keypoint_2d[skeleton::getIdx_34(parts.first)][1] >= 0 && 638 | objs[i].keypoint_2d[skeleton::getIdx_34(parts.second)][0] >= 0 && objs[i].keypoint_2d[skeleton::getIdx_34(parts.second)][1] >= 0) { 639 | cv::Point2f kp_a; 640 | kp_a.x = objs[i].keypoint_2d[skeleton::getIdx_34(parts.first)][0] * scaleW; 641 | kp_a.y = objs[i].keypoint_2d[skeleton::getIdx_34(parts.first)][1] * scaleH; 642 | GST_LOG_OBJECT(filter,"kp_a: %g, %g", kp_a.x, kp_a.y); 643 | 644 | cv::Point2f kp_b; 645 | kp_b.x = objs[i].keypoint_2d[skeleton::getIdx_34(parts.second)][0] * scaleW; 646 | kp_b.y = objs[i].keypoint_2d[skeleton::getIdx_34(parts.second)][1] * scaleH; 647 | GST_LOG_OBJECT(filter,"kp_b: %g, %g", kp_b.x, kp_b.y); 648 | 649 | if (roi_render.contains(kp_a) && roi_render.contains(kp_b)) 650 | cv::line(image, kp_a, kp_b, color, 1, cv::LINE_AA); 651 | } 652 | } 653 | // <---- Bones 654 | // ----> Joints 655 | for (int j = 0; j < 34; j++) { 656 | if (objs[i].keypoint_2d[j][0] >= 0 && objs[i].keypoint_2d[j][1] >= 0) { 657 | cv::Point2f cv_kp; 658 | cv_kp.x = objs[i].keypoint_2d[j][0] * scaleW; 659 | cv_kp.y = objs[i].keypoint_2d[j][1] * scaleH; 660 | if (roi_render.contains(cv_kp)) { 661 | cv::circle(image, cv_kp, 3, color + cv::Scalar(50, 50, 50), -1, cv::LINE_AA); 662 | } 663 | } 664 | } 665 | // <---- Joints 666 | break; 667 | case 38: 668 | // ----> Bones 669 | for (const auto &parts : skeleton::BODY_38_BONES) { 670 | if (objs[i].keypoint_2d[skeleton::getIdx_38(parts.first)][0] >= 0 && objs[i].keypoint_2d[skeleton::getIdx_38(parts.first)][1] >= 0 && 671 | objs[i].keypoint_2d[skeleton::getIdx_38(parts.second)][0] >= 0 && objs[i].keypoint_2d[skeleton::getIdx_38(parts.second)][1] >= 0) { 672 | cv::Point2f kp_a; 673 | kp_a.x = objs[i].keypoint_2d[skeleton::getIdx_38(parts.first)][0] * scaleW; 674 | kp_a.y = objs[i].keypoint_2d[skeleton::getIdx_38(parts.first)][1] * scaleH; 675 | GST_LOG_OBJECT(filter,"kp_a: %g, %g", kp_a.x, kp_a.y); 676 | 677 | cv::Point2f kp_b; 678 | kp_b.x = objs[i].keypoint_2d[skeleton::getIdx_38(parts.second)][0] * scaleW; 679 | kp_b.y = objs[i].keypoint_2d[skeleton::getIdx_38(parts.second)][1] * scaleH; 680 | GST_LOG_OBJECT(filter,"kp_b: %g, %g", kp_b.x, kp_b.y); 681 | 682 | if (roi_render.contains(kp_a) && roi_render.contains(kp_b)) 683 | cv::line(image, kp_a, kp_b, color, 1, cv::LINE_AA); 684 | } 685 | } 686 | // <---- Bones 687 | // ----> Joints 688 | for (int j = 0; j < 38; j++) { 689 | if (objs[i].keypoint_2d[j][0] >= 0 && objs[i].keypoint_2d[j][1] >= 0) { 690 | cv::Point2f cv_kp; 691 | cv_kp.x = objs[i].keypoint_2d[j][0] * scaleW; 692 | cv_kp.y = objs[i].keypoint_2d[j][1] * scaleH; 693 | if (roi_render.contains(cv_kp)) { 694 | cv::circle(image, cv_kp, 3, color + cv::Scalar(50, 50, 50), -1, cv::LINE_AA); 695 | } 696 | } 697 | } 698 | // <---- Joints 699 | break; 700 | case 70: 701 | // ----> Bones 702 | for (const auto &parts : skeleton::BODY_70_BONES) { 703 | if (objs[i].keypoint_2d[skeleton::getIdx_70(parts.first)][0] >= 0 && objs[i].keypoint_2d[skeleton::getIdx_70(parts.first)][1] >= 0 && 704 | objs[i].keypoint_2d[skeleton::getIdx_70(parts.second)][0] >= 0 && objs[i].keypoint_2d[skeleton::getIdx_70(parts.second)][1] >= 0) { 705 | cv::Point2f kp_a; 706 | kp_a.x = objs[i].keypoint_2d[skeleton::getIdx_70(parts.first)][0] * scaleW; 707 | kp_a.y = objs[i].keypoint_2d[skeleton::getIdx_70(parts.first)][1] * scaleH; 708 | GST_LOG_OBJECT(filter,"kp_a: %g, %g", kp_a.x, kp_a.y); 709 | 710 | cv::Point2f kp_b; 711 | kp_b.x = objs[i].keypoint_2d[skeleton::getIdx_70(parts.second)][0] * scaleW; 712 | kp_b.y = objs[i].keypoint_2d[skeleton::getIdx_70(parts.second)][1] * scaleH; 713 | GST_LOG_OBJECT(filter,"kp_b: %g, %g", kp_b.x, kp_b.y); 714 | 715 | if (roi_render.contains(kp_a) && roi_render.contains(kp_b)) 716 | cv::line(image, kp_a, kp_b, color, 1, cv::LINE_AA); 717 | } 718 | } 719 | // <---- Bones 720 | // ----> Joints 721 | for (int j = 0; j < 70; j++) { 722 | if (objs[i].keypoint_2d[j][0] >= 0 && objs[i].keypoint_2d[j][1] >= 0) { 723 | cv::Point2f cv_kp; 724 | cv_kp.x = objs[i].keypoint_2d[j][0] * scaleW; 725 | cv_kp.y = objs[i].keypoint_2d[j][1] * scaleH; 726 | GST_LOG_OBJECT(filter,"Joint: %g, %g", cv_kp.x, cv_kp.y); 727 | 728 | if (roi_render.contains(cv_kp)) { 729 | cv::circle(image, cv_kp, 3, color + cv::Scalar(50, 50, 50), -1, cv::LINE_AA); 730 | } 731 | } 732 | } 733 | // <---- Joints 734 | break; 735 | default: 736 | GST_ELEMENT_ERROR(filter, RESOURCE, FAILED, ("Wrong skeleton model format: %d",objs[i].skel_format), (NULL)); 737 | } 738 | } 739 | // <---- Skeletons 740 | } 741 | } 742 | } 743 | -------------------------------------------------------------------------------- /gst-zed-od-overlay/gstzedodoverlay.h: -------------------------------------------------------------------------------- 1 | // ///////////////////////////////////////////////////////////////////////// 2 | 3 | // 4 | // Copyright (c) 2024, STEREOLABS. 5 | // 6 | // All rights reserved. 7 | // 8 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 9 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 10 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 11 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 12 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 13 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 14 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 15 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 16 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 17 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 18 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 19 | // 20 | // ///////////////////////////////////////////////////////////////////////// 21 | 22 | #ifndef __GST_ZED_OD_OVERLAY_H__ 23 | #define __GST_ZED_OD_OVERLAY_H__ 24 | 25 | #include 26 | #include 27 | 28 | G_BEGIN_DECLS 29 | 30 | #define GST_TYPE_ZED_OD_OVERLAY (gst_zed_od_overlay_get_type()) 31 | G_DECLARE_FINAL_TYPE(GstZedOdOverlay, gst_zed_od_overlay, GST, ZED_OD_OVERLAY, GstBaseTransform) 32 | 33 | struct _GstZedOdOverlay { 34 | GstBaseTransform element; 35 | 36 | guint img_left_w; 37 | guint img_left_h; 38 | }; 39 | 40 | G_END_DECLS 41 | 42 | #endif /* __GST_ZED_OD_OVERLAY_H__ */ 43 | -------------------------------------------------------------------------------- /gst-zed-rtsp-server/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | ################################################ 2 | ## Generate symbols for IDE indexer (VSCode) 3 | set(CMAKE_EXPORT_COMPILE_COMMANDS ON) 4 | 5 | # Default to C99 6 | if(NOT CMAKE_C_STANDARD) 7 | set(CMAKE_C_STANDARD 99) 8 | endif() 9 | 10 | # Default to C++14 11 | if(NOT CMAKE_CXX_STANDARD) 12 | set(CMAKE_CXX_STANDARD 14) 13 | endif() 14 | 15 | add_definitions(-Werror=return-type) 16 | 17 | set(SOURCES 18 | zed-rtsp-launch.cpp 19 | ) 20 | 21 | #set(HEADERS 22 | # ) 23 | 24 | include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) 25 | include_directories(${GSTRTSPSERVER_INCLUDE_DIRS}) 26 | 27 | link_directories(${LIBRARY_INSTALL_DIR}) 28 | link_directories(${GSTRTSPSERVER_LIBRARY_DIRS}) 29 | 30 | set(appname gst-zed-rtsp-launch) 31 | 32 | message( " * ${appname} RTSP server application") 33 | 34 | add_executable(${appname} 35 | ${SOURCES} 36 | # ${HEADERS} 37 | ) 38 | 39 | if(UNIX) 40 | message(" ${appname}: OS Unix") 41 | add_definitions(-std=c++11 -Wno-deprecated-declarations -Wno-write-strings -pthread) 42 | endif(UNIX) 43 | 44 | if (CMAKE_BUILD_TYPE EQUAL "DEBUG") 45 | message(" ${appname}: Debug mode") 46 | add_definitions(-g) 47 | else() 48 | message(" ${appname}: Release mode") 49 | add_definitions(-O2) 50 | endif() 51 | 52 | if (WIN32) 53 | target_link_libraries (${appname} LINK_PUBLIC 54 | ${GLIB2_LIBRARIES} 55 | ${GOBJECT_LIBRARIES} 56 | ${GSTREAMER_LIBRARY} 57 | ${GSTREAMER_BASE_LIBRARY} 58 | ${GSTRTSPSERVER_LIBRARY_DIRS } 59 | ) 60 | else() 61 | target_link_libraries (${appname} LINK_PUBLIC 62 | -L/usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstrtspclientsink.so 63 | ${GLIB2_LIBRARIES} 64 | ${GOBJECT_LIBRARIES} 65 | ${GSTREAMER_LIBRARY} 66 | ${GSTRTSPSERVER_LIBRARIES} 67 | ${GSTREAMER_BASE_LIBRARY} 68 | -lgstrtsp-1.0 ) 69 | endif() 70 | 71 | if (WIN32) 72 | install (FILES $ DESTINATION ${PDB_INSTALL_DIR} COMPONENT pdb OPTIONAL) 73 | endif () 74 | install(TARGETS ${appname} RUNTIME DESTINATION ${EXE_INSTALL_DIR}) 75 | -------------------------------------------------------------------------------- /gst-zed-rtsp-server/zed-rtsp-launch.cpp: -------------------------------------------------------------------------------- 1 | // ///////////////////////////////////////////////////////////////////////// 2 | 3 | // 4 | // Copyright (c) 2024, STEREOLABS. 5 | // 6 | // All rights reserved. 7 | // 8 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 9 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 10 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 11 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 12 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 13 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 14 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 15 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 16 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 17 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 18 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 19 | // 20 | // ///////////////////////////////////////////////////////////////////////// 21 | 22 | #include 23 | #include 24 | #include 25 | 26 | #include 27 | #include 28 | 29 | #include 30 | #include 31 | 32 | #define DEFAULT_RTSP_PORT "8554" 33 | #define DEFAULT_RTSP_HOST "127.0.0.1" 34 | 35 | static char *port = (char *) DEFAULT_RTSP_PORT; 36 | static char *host = (char *) DEFAULT_RTSP_HOST; 37 | 38 | static GOptionEntry entries[] = {{"port", 'p', 0, G_OPTION_ARG_STRING, &port, "Port to listen on( default: " DEFAULT_RTSP_PORT ")", "PORT"}, 39 | {"address", 'a', 0, G_OPTION_ARG_STRING, &host, "Host address( default: " DEFAULT_RTSP_HOST ")", "HOST"}, 40 | {NULL}}; 41 | 42 | static void client_connected(GstRTSPServer *server, GstRTSPClient *client) { 43 | GstRTSPConnection *conn = gst_rtsp_client_get_connection(client); 44 | const gchar *ip_address = gst_rtsp_connection_get_ip(conn); 45 | g_print(" * Client connected: %s\n", ip_address); 46 | } 47 | 48 | int main(int argc, char *argv[]) { 49 | GMainLoop *loop; 50 | GstRTSPServer *server; 51 | GstRTSPMountPoints *mounts; 52 | GstRTSPMediaFactory *factory; 53 | GOptionContext *optctx; 54 | GError *error = NULL; 55 | 56 | optctx = 57 | g_option_context_new("PIPELINE-DESCRIPTION - ZED RTSP Server, Launch\n\n" 58 | "Example: gst-zed-rtsp-server zedsrc ! videoconvert ! 'video/x-raw, format=(string)I420' ! x264enc ! rtph264pay pt=96 name=pay0"); 59 | g_option_context_add_main_entries(optctx, entries, NULL); 60 | g_option_context_add_group(optctx, gst_init_get_option_group()); 61 | if (!g_option_context_parse(optctx, &argc, &argv, &error)) { 62 | g_printerr("Error parsing options: %s\n", error->message); 63 | g_option_context_free(optctx); 64 | g_clear_error(&error); 65 | exit(EXIT_FAILURE); 66 | } 67 | g_option_context_free(optctx); 68 | 69 | gchar **args; 70 | 71 | #ifdef G_OS_WIN32 72 | args = g_win32_get_command_line(); 73 | #else 74 | args = g_strdupv(argv); 75 | #endif 76 | 77 | // ----> Check launch pipeline correctness 78 | GstElement *pipeline; 79 | gchar **argvn; 80 | // make a null-terminated version of argv 81 | argvn = g_new0(char *, argc); 82 | memcpy(argvn, args + 1, sizeof(char *) * (argc - 1)); 83 | { pipeline = (GstElement *) gst_parse_launchv((const gchar **) argvn, &error); } 84 | g_free(argvn); 85 | 86 | if (!pipeline) { 87 | if (error) { 88 | gst_printerr("ERROR - pipeline could not be constructed: %s.\n", GST_STR_NULL(error->message)); 89 | g_clear_error(&error); 90 | } else { 91 | gst_printerr("ERROR - pipeline could not be constructed.\n"); 92 | } 93 | return 1; 94 | } else if (error) { 95 | gst_printerr("WARNING: erroneous pipeline: %s\n", GST_STR_NULL(error->message)); 96 | g_clear_error(&error); 97 | return 1; 98 | } 99 | 100 | GstElement *payload = gst_bin_get_by_name(GST_BIN(pipeline), "pay0"); 101 | if (!payload) { 102 | gst_printerr("ERROR - at least a payload with name 'pay0' must be present in the pipeline.\n"); 103 | gst_printerr("Example: zedsrc ! videoconvert ! video/x-raw, format=(string)I420 ! x264enc ! rtph264pay pt=96 name=pay0\n"); 104 | return 1; 105 | } 106 | g_object_unref(payload); 107 | gst_object_unref(pipeline); 108 | // <---- Check launch pipeline correctness */ 109 | 110 | // ----> Create RTSP Server pipeline 111 | // Note: `gst_rtsp_media_factory_set_launch` requires a GstBin element, the easier way to create it is to enclose 112 | // the pipeline in round brackets '(' ')'. 113 | std::string rtsp_pipeline; 114 | rtsp_pipeline = "( "; 115 | for (int i = 1; i < argc; i++) { 116 | rtsp_pipeline += std::string(argv[i]); 117 | rtsp_pipeline += " "; 118 | } 119 | rtsp_pipeline += ")"; 120 | 121 | // std::cout << rtsp_pipeline << std::endl; 122 | 123 | // <---- Create RTSP Server pipeline 124 | 125 | loop = g_main_loop_new(NULL, FALSE); 126 | 127 | /* create a server instance */ 128 | server = gst_rtsp_server_new(); 129 | g_object_set(server, "address", host, NULL); 130 | g_object_set(server, "service", port, NULL); 131 | 132 | /* get the mount points for this server, every server has a default object 133 | * that be used to map uri mount points to media factories */ 134 | mounts = gst_rtsp_server_get_mount_points(server); 135 | 136 | /* make a media factory for a test stream. The default media factory can use 137 | * gst-launch syntax to create pipelines. 138 | * any launch line works as long as it contains elements named pay%d. Each 139 | * element with pay%d names will be a stream */ 140 | factory = gst_rtsp_media_factory_new(); 141 | gst_rtsp_media_factory_set_launch(factory, rtsp_pipeline.c_str()); 142 | gst_rtsp_media_factory_set_shared(factory, TRUE); 143 | 144 | /* attach the test factory to the /test url */ 145 | gst_rtsp_mount_points_add_factory(mounts, "/zed-stream", factory); 146 | 147 | /* don't need the ref to the mapper anymore */ 148 | g_object_unref(mounts); 149 | 150 | /* attach the server to the default maincontext */ 151 | gst_rtsp_server_attach(server, NULL); 152 | 153 | g_signal_connect(server, "client-connected", (GCallback) client_connected, NULL); 154 | 155 | /* start serving */ 156 | g_print(" ZED RTSP Server \n"); 157 | g_print("-----------------\n"); 158 | g_print(" * Stream ready at rtsp://%s:%s/zed-stream\n", host, port); 159 | g_main_loop_run(loop); 160 | 161 | return 0; 162 | } 163 | -------------------------------------------------------------------------------- /gst-zed-src/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | ################################################ 2 | ## Generate symbols for IDE indexer (VSCode) 3 | set(CMAKE_EXPORT_COMPILE_COMMANDS ON) 4 | 5 | # Default to C99 6 | if(NOT CMAKE_C_STANDARD) 7 | set(CMAKE_C_STANDARD 99) 8 | endif() 9 | 10 | # Default to C++14 11 | if(NOT CMAKE_CXX_STANDARD) 12 | set(CMAKE_CXX_STANDARD 14) 13 | endif() 14 | 15 | add_definitions(-Werror=return-type) 16 | 17 | option(LINK_SHARED_ZED "Link with the ZED SDK shared executable" ON) 18 | 19 | if(NOT LINK_SHARED_ZED AND MSVC) 20 | message(FATAL_ERROR "LINK_SHARED_ZED OFF : ZED SDK static libraries not available on Windows") 21 | endif() 22 | 23 | set(SOURCES 24 | gstzedsrc.cpp 25 | ) 26 | 27 | set(HEADERS 28 | gstzedsrc.h 29 | ) 30 | 31 | include_directories(${CUDA_INCLUDE_DIRS}) 32 | include_directories(${ZED_INCLUDE_DIRS}) 33 | include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) 34 | 35 | link_directories(${ZED_LIBRARY_DIR}) 36 | link_directories(${CUDA_LIBRARY_DIRS}) 37 | link_directories(${LIBRARY_INSTALL_DIR}) 38 | 39 | set(libname gstzedsrc) 40 | 41 | message( " * ${libname} plugin added") 42 | 43 | add_library(${libname} MODULE 44 | ${SOURCES} 45 | ${HEADERS} 46 | ) 47 | 48 | if(UNIX) 49 | message(" ${libname}: OS Unix") 50 | add_definitions(-std=c++11 -Wno-deprecated-declarations -Wno-write-strings) 51 | endif(UNIX) 52 | 53 | if (CMAKE_BUILD_TYPE EQUAL "DEBUG") 54 | message(" ${libname}: Debug mode") 55 | add_definitions(-g) 56 | else() 57 | message(" ${libname}: Release mode") 58 | add_definitions(-O2) 59 | endif() 60 | 61 | SET(ZED_LIBS 62 | ${ZED_LIBRARIES} 63 | ${CUDA_CUDA_LIBRARY} 64 | ${CUDA_CUDART_LIBRARY} 65 | ${CUDA_NPP_LIBRARIES_ZED} 66 | ) 67 | 68 | add_dependencies (${libname} gstzedmeta) 69 | 70 | if (WIN32) 71 | target_link_libraries (${libname} LINK_PUBLIC 72 | ${GLIB2_LIBRARIES} 73 | ${GOBJECT_LIBRARIES} 74 | ${GSTREAMER_LIBRARY} 75 | ${GSTREAMER_BASE_LIBRARY} 76 | ${GSTREAMER_VIDEO_LIBRARY} 77 | gstzedmeta 78 | ${ZED_LIBS} 79 | ) 80 | else() 81 | target_link_libraries (${libname} LINK_PUBLIC 82 | ${GLIB2_LIBRARIES} 83 | ${GOBJECT_LIBRARIES} 84 | ${GSTREAMER_LIBRARY} 85 | ${GSTREAMER_BASE_LIBRARY} 86 | ${GSTREAMER_VIDEO_LIBRARY} 87 | ${ZED_LIBS} 88 | ${CMAKE_CURRENT_BINARY_DIR}/../gst-zed-meta/libgstzedmeta.so 89 | ) 90 | endif() 91 | 92 | if (WIN32) 93 | install (FILES $ DESTINATION ${PDB_INSTALL_DIR} COMPONENT pdb OPTIONAL) 94 | endif () 95 | install(TARGETS ${libname} LIBRARY DESTINATION ${PLUGIN_INSTALL_DIR}) 96 | -------------------------------------------------------------------------------- /gst-zed-src/gstzedsrc.h: -------------------------------------------------------------------------------- 1 | // ///////////////////////////////////////////////////////////////////////// 2 | 3 | // 4 | // Copyright (c) 2024, STEREOLABS. 5 | // 6 | // All rights reserved. 7 | // 8 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 9 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 10 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 11 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 12 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 13 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 14 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 15 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 16 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 17 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 18 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 19 | // 20 | // ///////////////////////////////////////////////////////////////////////// 21 | 22 | #ifndef _GST_ZED_SRC_H_ 23 | #define _GST_ZED_SRC_H_ 24 | 25 | #include 26 | 27 | #include "sl/Camera.hpp" 28 | 29 | G_BEGIN_DECLS 30 | 31 | #define GST_TYPE_ZED_SRC (gst_zedsrc_get_type()) 32 | #define GST_ZED_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_ZED_SRC, GstZedSrc)) 33 | #define GST_ZED_SRC_CLASS(klass) \ 34 | (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_ZED_SRC, GstZedSrcClass)) 35 | #define GST_IS_ZED_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_ZED_SRC)) 36 | #define GST_IS_ZED_SRC_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_ZED_SRC)) 37 | 38 | typedef struct _GstZedSrc GstZedSrc; 39 | typedef struct _GstZedSrcClass GstZedSrcClass; 40 | 41 | struct _GstZedSrc { 42 | GstPushSrc base_zedsrc; 43 | 44 | // ZED camera object 45 | sl::Camera zed; 46 | 47 | gboolean is_started; // grab started flag 48 | 49 | // ----> Properties 50 | gint camera_resolution; // Camera resolution [enum] 51 | gint camera_fps; // Camera FPS 52 | gint sdk_verbose; 53 | gint camera_image_flip; 54 | gint camera_id; 55 | gint64 camera_sn; 56 | GString svo_file; 57 | GString opencv_calibration_file; 58 | GString stream_ip; 59 | gint stream_port; 60 | gint stream_type; 61 | gfloat depth_min_dist; 62 | gfloat depth_max_dist; 63 | gint depth_mode; // Depth mode [enum] 64 | gboolean camera_disable_self_calib; 65 | gint depth_stabilization; 66 | gint coord_sys; 67 | gboolean roi; 68 | gint roi_x; 69 | gint roi_y; 70 | gint roi_w; 71 | gint roi_h; 72 | // gboolean enable_right_side_measure; 73 | 74 | gint confidence_threshold; 75 | gint texture_confidence_threshold; 76 | gint measure3D_reference_frame; 77 | gboolean fill_mode; 78 | 79 | gboolean pos_tracking; 80 | gboolean camera_static; 81 | GString area_file_path; 82 | gboolean enable_area_memory; 83 | gboolean enable_imu_fusion; 84 | gboolean enable_pose_smoothing; 85 | gboolean set_floor_as_origin; 86 | gboolean set_gravity_as_origin; 87 | gfloat depth_min_range; 88 | gfloat init_pose_x; 89 | gfloat init_pose_y; 90 | gfloat init_pose_z; 91 | gfloat init_orient_roll; 92 | gfloat init_orient_pitch; 93 | gfloat init_orient_yaw; 94 | gint pos_trk_mode; 95 | 96 | gboolean object_detection; 97 | gboolean od_enable_tracking; // bool enable_tracking 98 | gboolean od_enable_segm_output; // bool enable_segmentation TODO 99 | gint od_detection_model; // sl::OBJECT_DETECTION_MODEL detection_model 100 | gfloat od_max_range; // float max_range 101 | gint od_filter_mode; // sl::OBJECT_FILTERING_MODE filtering_mode 102 | gfloat od_prediction_timeout_s; // float prediction_timeout_s 103 | gboolean od_allow_reduced_precision_inference; // bool allow_reduced_precision_inference 104 | gfloat od_det_conf; // [runtime] float detection_confidence_threshold 105 | gfloat od_person_conf; // [runtime] std::map< OBJECT_CLASS, float > 106 | // object_class_detection_confidence_threshold 107 | gfloat od_vehicle_conf; // [runtime] std::map< OBJECT_CLASS, float > 108 | // object_class_detection_confidence_threshold 109 | gfloat od_bag_conf; // [runtime] std::map< OBJECT_CLASS, float > 110 | // object_class_detection_confidence_threshold 111 | gfloat od_animal_conf; // [runtime] std::map< OBJECT_CLASS, float > 112 | // object_class_detection_confidence_threshold 113 | gfloat od_electronics_conf; // [runtime] std::map< OBJECT_CLASS, float > 114 | // object_class_detection_confidence_threshold 115 | gfloat od_fruit_vegetable_conf; // [runtime] std::map< OBJECT_CLASS, float > 116 | // object_class_detection_confidence_threshold 117 | gfloat od_sport_conf; // [runtime] std::map< OBJECT_CLASS, float > 118 | // object_class_detection_confidence_threshold 119 | 120 | gboolean body_tracking; 121 | gboolean bt_enable_segm_output; // bool enable_segmentation 122 | gint bt_model; // sl::BODY_TRACKING_MODEL detection_model 123 | gint bt_format; // sl::BODY_FORMAT body_format 124 | gboolean bt_reduce_precision; // bool allow_reduced_precision_inference 125 | gfloat bt_max_range; // float max_range 126 | gint bt_kp_sel; // sl::BODY_KEYPOINTS_SELECTION body_selection 127 | gboolean bt_fitting; // bool enable_body_fitting 128 | gboolean bt_enable_trk; // bool enable_tracking 129 | gfloat bt_pred_timeout; // float prediction_timeout_s 130 | gfloat bt_rt_det_conf; // [runtime] float detection_confidence_threshold 131 | gint bt_rt_min_kp_thresh; // [runtime] int minimum_keypoints_threshold 132 | gfloat bt_rt_skel_smoothing; // [runtime] float skeleton_smoothing 133 | 134 | gint brightness; 135 | gint contrast; 136 | gint hue; 137 | gint saturation; 138 | gint sharpness; 139 | gint gamma; 140 | gint gain; 141 | gint exposure; 142 | gint exposureRange_min; 143 | gint exposureRange_max; 144 | gboolean aec_agc; 145 | gint aec_agc_roi_x; 146 | gint aec_agc_roi_y; 147 | gint aec_agc_roi_w; 148 | gint aec_agc_roi_h; 149 | gint aec_agc_roi_side; 150 | gboolean exposure_gain_updated; 151 | gint whitebalance_temperature; 152 | gboolean whitebalance_temperature_auto; 153 | gboolean led_status; 154 | // <---- Properties 155 | 156 | GstClockTime acq_start_time; 157 | guint32 last_frame_count; 158 | guint32 total_dropped_frames; 159 | 160 | GstCaps *caps; 161 | guint out_framesize; 162 | 163 | gboolean stop_requested; 164 | }; 165 | 166 | struct _GstZedSrcClass { 167 | GstPushSrcClass base_zedsrc_class; 168 | }; 169 | 170 | G_GNUC_INTERNAL GType gst_zedsrc_get_type(void); 171 | 172 | G_END_DECLS 173 | 174 | #endif 175 | -------------------------------------------------------------------------------- /gst-zedxone-src/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | ################################################ 2 | ## Generate symbols for IDE indexer (VSCode) 3 | set(CMAKE_EXPORT_COMPILE_COMMANDS ON) 4 | 5 | # Default to C99 6 | if(NOT CMAKE_C_STANDARD) 7 | set(CMAKE_C_STANDARD 99) 8 | endif() 9 | 10 | # Default to C++14 11 | if(NOT CMAKE_CXX_STANDARD) 12 | set(CMAKE_CXX_STANDARD 14) 13 | endif() 14 | 15 | add_definitions(-Werror=return-type) 16 | 17 | option(LINK_SHARED_ZED "Link with the ZED SDK shared executable" ON) 18 | 19 | if(NOT LINK_SHARED_ZED AND MSVC) 20 | message(FATAL_ERROR "LINK_SHARED_ZED OFF : ZED SDK static libraries not available on Windows") 21 | endif() 22 | 23 | include_directories(${CUDA_INCLUDE_DIRS}) 24 | include_directories(${ZED_INCLUDE_DIRS}) 25 | include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) 26 | 27 | link_directories(${ZED_LIBRARY_DIR}) 28 | link_directories(${CUDA_LIBRARY_DIRS}) 29 | link_directories(${LIBRARY_INSTALL_DIR}) 30 | 31 | set(libname gstzedxonesrc) 32 | 33 | set(SOURCES 34 | gstzedxonesrc.cpp 35 | ) 36 | 37 | set(HEADERS 38 | gstzedxonesrc.h 39 | ) 40 | 41 | message( " * ${libname} plugin added") 42 | 43 | add_library(${libname} MODULE 44 | ${SOURCES} 45 | ${HEADERS} 46 | ) 47 | 48 | message(" ${libname}: OS Unix - L4T") 49 | 50 | if (CMAKE_BUILD_TYPE EQUAL "DEBUG") 51 | message(" ${libname}: Debug mode") 52 | add_definitions(-g) 53 | else() 54 | message(" ${libname}: Release mode") 55 | add_definitions(-O2) 56 | endif() 57 | 58 | SET(ZED_LIBS 59 | ${ZED_LIBRARIES} 60 | ${CUDA_CUDA_LIBRARY} 61 | ${CUDA_CUDART_LIBRARY} 62 | ${CUDA_NPP_LIBRARIES_ZED} 63 | ) 64 | 65 | add_dependencies (${libname} gstzedmeta) 66 | 67 | target_link_libraries ( 68 | ${libname} LINK_PUBLIC 69 | ${GLIB2_LIBRARIES} 70 | ${GOBJECT_LIBRARIES} 71 | ${GSTREAMER_LIBRARY} 72 | ${GSTREAMER_BASE_LIBRARY} 73 | ${GSTREAMER_VIDEO_LIBRARY} 74 | ${ZED_LIBS} 75 | ${CMAKE_CURRENT_BINARY_DIR}/../gst-zed-meta/libgstzedmeta.so 76 | ) 77 | 78 | install(TARGETS ${libname} LIBRARY DESTINATION ${PLUGIN_INSTALL_DIR}) 79 | -------------------------------------------------------------------------------- /gst-zedxone-src/gstzedxonesrc.h: -------------------------------------------------------------------------------- 1 | // ///////////////////////////////////////////////////////////////////////// 2 | 3 | // 4 | // Copyright (c) 2024, STEREOLABS. 5 | // 6 | // All rights reserved. 7 | // 8 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 9 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 10 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 11 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 12 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 13 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 14 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 15 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 16 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 17 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 18 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 19 | // 20 | // ///////////////////////////////////////////////////////////////////////// 21 | 22 | #ifndef _GST_ZED_X_ONE_SRC_H_ 23 | #define _GST_ZED_X_ONE_SRC_H_ 24 | 25 | #include 26 | 27 | #include "sl/CameraOne.hpp" 28 | 29 | G_BEGIN_DECLS 30 | 31 | #define GST_TYPE_ZED_X_ONE_SRC (gst_zedxonesrc_get_type()) 32 | #define GST_ZED_X_ONE_SRC(obj) \ 33 | (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_ZED_X_ONE_SRC, GstZedXOneSrc)) 34 | #define GST_ZED_X_ONE_SRC_CLASS(klass) \ 35 | (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_ZED_X_ONE_SRC, GstZedXOneSrcClass)) 36 | #define GST_IS_ZED_X_ONE_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_ZED_X_ONE_SRC)) 37 | #define GST_IS_ZED_X_ONE_SRC_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_ZED_X_ONE_SRC)) 38 | 39 | typedef struct _GstZedXOneSrc GstZedXOneSrc; 40 | typedef struct _GstZedXOneSrcClass GstZedXOneSrcClass; 41 | 42 | struct _GstZedXOneSrc { 43 | GstPushSrc _base_zedxonesrc; 44 | 45 | // ZED X One camera object 46 | std::unique_ptr _zed; // ZED X One object 47 | 48 | gboolean _isStarted; // grab started flag 49 | gboolean _stopRequested; // stop request flagout_framesize 50 | 51 | // ----> Properties 52 | gint _cameraResolution; // Camera resolution [enum] 53 | gint _cameraFps; // Camera FPS 54 | gint _sdkVerboseLevel; // Capture library verbose level 55 | gfloat _camTimeout_sec; // Camera open timeout 56 | gint _cameraId; // Camera ID 57 | gint64 _cameraSN; // Camera Serial Number 58 | GString _opencvCalibrationFile; // OpenCV calibration file path 59 | gboolean _cameraImageFlip; // Camera flipped 60 | gboolean _enableHDR; // HDR mode 61 | 62 | gint _saturation; // Image Saturation 63 | gint _sharpness; // Image Sharpness 64 | gint _gamma; // Image Gamma 65 | gboolean _autoWb; // Enable Automatic White Balance 66 | gint _manualWb; // Manual White Balance [2800,6500] 67 | 68 | gboolean _autoExposure; // Enable Automatic Exposure 69 | gint _exposure_usec; // Manual Exposure time [28,30000] 70 | gint _exposureRange_min; // Minimum value for Automatic Exposure [28,30000] 71 | gint _exposureRange_max; // Maximum value for Automatic Exposure [28,30000] 72 | gint _exposureCompensation; // Exposure Compensation [0,100] 73 | 74 | gboolean _autoAnalogGain; // Enable Automatic Analog Gain 75 | gint _analogGain; // Manual Analog Gain [1000,16000] 76 | gint _analogGainRange_min; // Minimum value for Automatic Analog Gain [1000,16000] 77 | gint _analogGainRange_max; // Maximum value for Automatic Analog Gain [1000,16000] 78 | 79 | 80 | gboolean _autoDigitalGain; // Enable Automatic Digital Gain 81 | gint _digitalGain; // Manual Digital Gain [1,256] 82 | gint _digitalGainRange_min; // Minimum value for Automatic Digital Gain [1,256] 83 | gint _digitalGainRange_max; // Maximum value for Automatic Digital Gain [1,256] 84 | 85 | gint _denoising; // Image Denoising [0,100] 86 | // <---- Properties 87 | 88 | int _realFps; // Real FPS 89 | 90 | GstClockTime _acqStartTime; // Acquisition start time 91 | 92 | GstCaps *_caps; // Stream caps 93 | guint _outFramesize; // Output frame size in byte 94 | }; 95 | 96 | struct _GstZedXOneSrcClass { 97 | GstPushSrcClass base_zedxonesrc_class; 98 | }; 99 | 100 | G_GNUC_INTERNAL GType gst_zedxonesrc_get_type(void); 101 | 102 | G_END_DECLS 103 | 104 | #endif // _GST_ZED_X_ONE_SRC_H_ 105 | -------------------------------------------------------------------------------- /scripts/jetson/jetson-simple-view.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a stream and render it using OpenGL sink 4 | 5 | gst-launch-1.0 zedsrc ! nv3dsink 6 | -------------------------------------------------------------------------------- /scripts/jetson/local-od-fps_overlay.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a stream with optimized resolution and framerate for the connected camera with RGB, 4 | # Depth and Object Detection information and displaying the data on screen 5 | 6 | # 1) Start `zedsrc` to acquire RGB and depth with automatic resolution and FPS enabling MULTI_CLASS_BOX_ACCURATE detection. 7 | # 2) Define `zeddemux` object named `demux` to demux the `zedsrc` composite stream creating two single streams: RGB and Depth. 8 | # 3) Draw Object Detection overlays and render it using the `fpsdisplaysink` sink plugin. 9 | # 4) Display the depth stream with FPS info using the `fpsdisplaysink` sink plugin. 10 | 11 | gst-launch-1.0 \ 12 | zedsrc stream-type=4 od-enabled=true od-detection-model=2 ! \ 13 | zeddemux name=demux \ 14 | demux.src_left ! queue ! zedodoverlay ! queue ! autovideoconvert ! fpsdisplaysink \ 15 | demux.src_aux ! queue ! autovideoconvert ! fpsdisplaysink 16 | 17 | -------------------------------------------------------------------------------- /scripts/jetson/local-rgb-depth-sens-csv.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a stream at default resolution with RGB, Depth and Sensor Data and save them to a CSV file for logging 4 | 5 | # 1) Start `zedsrc` to acquire RGB and depth at default resolution 6 | # 2) Define `zeddemux` object named `demux` to demux the `zedsrc` composite stream creating three single streams: RGB, Depth and data. 7 | # 3) Display RGB left stream with FPS info 8 | # 4) Display Depth stream with FPS info. 9 | # 5) Save the sensor data in the home folder to CSV file named `test_csv.csv` replacing eventual existing data 10 | 11 | gst-launch-1.0 \ 12 | zedsrc stream-type=4 depth-mode=3 ! \ 13 | zeddemux stream-data=TRUE name=demux \ 14 | demux.src_left ! queue ! autovideoconvert ! fpsdisplaysink \ 15 | demux.src_aux ! queue ! autovideoconvert ! fpsdisplaysink \ 16 | demux.src_data ! queue ! zeddatacsvsink location="${HOME}/test_csv.csv" append=FALSE 17 | -------------------------------------------------------------------------------- /scripts/jetson/local-rgb-od_multi-overlay.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a stream at default resolution and frame rate 4 | # with RGB and Object Detection information and displaying the results 5 | # using `zedoddisplaysink` 6 | 7 | # 1) Start `zedsrc` to acquire RGB enabling Object Detection (MULTI-CLASS) 8 | # 2) Add Object Detection overlays to the frame 9 | # 3) Convert the stream and display it with FPS information 10 | 11 | gst-launch-1.0 \ 12 | zedsrc stream-type=0 od-enabled=true ! queue ! \ 13 | zedodoverlay ! queue ! \ 14 | autovideoconvert ! fpsdisplaysink 15 | -------------------------------------------------------------------------------- /scripts/jetson/local-rgb-rescale-od-overlay.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to resize HD1080 RGB and depth stream to VGA resolution for display purpose remuxing the Object 4 | # Detection metadata as input for `zedodoverlay` 5 | 6 | # 1) Define a `zeddatamux` object named `mux` to be used to recompose the RGB+metadata stream to be used to render 7 | # the result of Object Detection using `zedoddisplaysink`. The `videoscale` filter indeed removes ZED metadata 8 | # from the RGB stream and the `zeddatamux` adds them back 9 | # 2) Start `zedsrc` to acquire RGB and depth at HD1080 resolution stream enabling Object Tracking 10 | # 3) Define `zeddemux` object named `demux` to demux the `zedsrc` composite stream creating three single streams: RGB, Depth and Data. 11 | # 4) Rescale the Depth stream to VGA resolution and render it using `fpsdisplaysink`. 12 | # 5) Set the data stream from `demux` as input on the data sink of `mux`. 13 | # 6) Rescale the RGB stream to VGA resolution and set it as input on the video sink of `mux`. 14 | # 7) Set the source of the muxer as input for `zedodoverlay` to draw Object Detection overlays 15 | # 8) Convert the stream RGB stream with Object Detection overlay and display it using `fpsdisplaysink`. 16 | 17 | gst-launch-1.0 \ 18 | zeddatamux name=mux \ 19 | zedsrc stream-type=4 od-detection-model=0 od-enabled=true ! \ 20 | zeddemux stream-data=true is-depth=true name=demux \ 21 | demux.src_aux ! queue ! autovideoconvert ! videoscale ! video/x-raw,width=672,height=376 ! queue ! fpsdisplaysink \ 22 | demux.src_data ! mux.sink_data \ 23 | demux.src_left ! queue ! videoscale ! video/x-raw,width=672,height=376 ! mux.sink_video \ 24 | mux.src ! queue ! zedodoverlay ! queue ! \ 25 | autovideoconvert ! fpsdisplaysink 26 | -------------------------------------------------------------------------------- /scripts/jetson/local-rgb-skel_accurate-overlay.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a stream at default resolution with RGB and Skeleton Tracking information and 4 | # displaying the results 5 | 6 | # 1) Start `zedsrc` to acquire RGB enabling Skeleton Tracking (ACCURATE) and 38 key points 7 | # 2) Add detected skeleton overlays to the frame 8 | # 3) Convert the stream and display it with FPS information 9 | 10 | gst-launch-1.0 \ 11 | zedsrc stream-type=0 bt-enabled=true bt-detection-model=2 bt-format=2 ! queue ! \ 12 | zedodoverlay ! queue ! \ 13 | autovideoconvert ! fpsdisplaysink 14 | -------------------------------------------------------------------------------- /scripts/jetson/local-rgb-skel_fast-overlay.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a stream at default resolution with RGB and Skeleton Tracking information and 4 | # displaying the results 5 | 6 | 7 | # 1) Start `zedsrc` to acquire RGB enabling Skeleton Tracking (FAST). 8 | # 2) Add detected skeleton overlays to the frame 9 | # 3) Convert the stream and display it with FPS information 10 | 11 | gst-launch-1.0 \ 12 | zedsrc stream-type=0 bt-enabled=true bt-detection-model=0 ! queue ! \ 13 | zedodoverlay ! queue ! \ 14 | autovideoconvert ! fpsdisplaysink 15 | -------------------------------------------------------------------------------- /scripts/jetson/local-rgb_left_depth-fps_rendering.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a stream at default resolution with RGB and Depth info 4 | # displaying the results on screen with FPS information 5 | # 1) Start `zedsrc` to acquire RGB left and depth streams 6 | # 2) Demux the composite left/depth stream 7 | # 3) Render left stream with FPS info 8 | # 4) Render depth stream with FPS info 9 | 10 | gst-launch-1.0 \ 11 | zedsrc stream-type=4 depth-mode=3 ! queue ! \ 12 | zeddemux name=demux \ 13 | demux.src_left ! queue ! autovideoconvert ! fpsdisplaysink \ 14 | demux.src_aux ! queue ! autovideoconvert ! fpsdisplaysink 15 | -------------------------------------------------------------------------------- /scripts/jetson/local-rgb_left_right-fps_rendering.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a stream at default resolution with RGB Left and Right information and 4 | # displaying the results on screen with FPS information 5 | 6 | # 1) Start `zedsrc` to acquire RGB left and right streams 7 | # 2) Demux the composite left/right stream 8 | # 3) Render left stream with FPS info 9 | # 4) Render right stream with FPS info 10 | 11 | gst-launch-1.0 \ 12 | zedsrc stream-type=2 ! queue ! \ 13 | zeddemux is-depth=false name=demux \ 14 | demux.src_left ! queue ! autovideoconvert ! fpsdisplaysink \ 15 | demux.src_aux ! queue ! autovideoconvert ! fpsdisplaysink 16 | -------------------------------------------------------------------------------- /scripts/jetson/network-rgb-h264-receiver.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a stream and send it on local network with H264 encoding 4 | 5 | # install x264enc: `sudo apt-get install x264 gstreamer1.0-plugins-ugly` 6 | 7 | gst-launch-1.0 udpsrc port=5000 ! application/x-rtp,clock-rate=90000,payload=96 ! \ 8 | queue ! rtph264depay ! h264parse ! avdec_h264 ! \ 9 | queue ! autovideoconvert ! fpsdisplaysink 10 | 11 | 12 | -------------------------------------------------------------------------------- /scripts/jetson/network-rgb-h264-sender.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a stream and send it on local network with H264 encoding 4 | 5 | # install x264enc: `sudo apt-get install gstreamer1.0-libav x264 gstreamer1.0-plugins-ugly` 6 | 7 | gst-launch-1.0 zedsrc ! timeoverlay ! tee name=split has-chain=true ! \ 8 | queue ! autovideoconvert ! fpsdisplaysink \ 9 | split. ! queue max-size-time=0 max-size-bytes=0 max-size-buffers=0 ! autovideoconvert ! \ 10 | x264enc byte-stream=true tune=zerolatency speed-preset=ultrafast bitrate=3000 ! \ 11 | h264parse ! rtph264pay config-interval=-1 pt=96 ! queue ! \ 12 | udpsink clients=127.0.0.1:5000 max-bitrate=3000000 sync=false async=false 13 | -------------------------------------------------------------------------------- /scripts/jetson/rtsp-h264-receiver.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to start an RTSP client on the same machine of the server 4 | 5 | HOST_IPS=(`hostname -I`) 6 | export SERVER_IP=${HOST_IPS[0]} 7 | 8 | gst-launch-1.0 rtspsrc location=rtsp://${SERVER_IP}:8554/zed-stream latency=0 ! decodebin ! fpsdisplaysink 9 | 10 | -------------------------------------------------------------------------------- /scripts/jetson/rtsp-rgb-h264-sender.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to start an RGB RTSP server 4 | 5 | # install RTSP libraries to compile RTSP server: 6 | # `sudo apt install libgstrtspserver-1.0-0 libgstrtspserver-1.0-dev` 7 | 8 | HOST_IPS=(`hostname -I`) 9 | export SERVER_IP=${HOST_IPS[0]} 10 | 11 | 12 | gst-zed-rtsp-launch -a ${SERVER_IP} \ 13 | zedsrc stream-type=0 ! identity silent=false ! \ 14 | videoconvert ! video/x-raw, format=I420 ! \ 15 | x264enc tune=zerolatency bitrate=500000 speed-preset=ultrafast key-int-max=30 qp-min=8 qp-max=51 qp-step=1 ! \ 16 | rtph264pay config-interval=-1 mtu=1500 pt=96 name=pay0 17 | -------------------------------------------------------------------------------- /scripts/jetson/simple-depth-fps_rendering.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a NEURAL depth stream and render it displaying the current FPS using default values for each parameter 4 | 5 | gst-launch-1.0 zedsrc stream-type=3 depth-mode=4 ! queue ! autovideoconvert ! queue ! fpsdisplaysink 6 | -------------------------------------------------------------------------------- /scripts/jetson/simple-fps_rendering.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a stream and render it displaying the current FPS using default values for each parameter 4 | 5 | gst-launch-1.0 zedsrc ! queue ! autovideoconvert ! queue ! fpsdisplaysink 6 | -------------------------------------------------------------------------------- /scripts/jetson/zedxone-4k-simple-fps_rendering.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a ZED X One 4K stream at 15 FPS and render it displaying the current FPS using default values for each parameter 4 | 5 | gst-launch-1.0 zedxonesrc camera-resolution=3 camera-fps=15 ! queue ! autovideoconvert ! queue ! fpsdisplaysink 6 | -------------------------------------------------------------------------------- /scripts/jetson/zedxone-sens-csv.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a stream at default resolution with RGB, Depth and Sensor Data and save them to a CSV file for logging 4 | 5 | # 1) Start `zedxonesrc` to acquire RGB and depth at default resolution 6 | # 2) Define `zeddemux` object named `demux` to demux the `zedxonesrc` composite stream creating two streams: RGB, and data. 7 | # 3) Display RGB stream with FPS info 8 | # 4) Save the sensor data in the home folder to CSV file named `test_csv.csv` replacing eventual existing data 9 | 10 | gst-launch-1.0 \ 11 | zedxonesrc ! \ 12 | zeddemux is-mono=TRUE stream-data=TRUE name=demux \ 13 | demux.src_mono ! queue ! autovideoconvert ! fpsdisplaysink \ 14 | demux.src_data ! queue ! zeddatacsvsink location="${HOME}/test_csv.csv" append=FALSE 15 | -------------------------------------------------------------------------------- /scripts/jetson/zedxone-simple-60-fps_rendering.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a ZED X One 1200p stream at 60 FPS and render it displaying the current FPS using default values for each parameter 4 | 5 | gst-launch-1.0 zedxonesrc camera-resolution=2 camera-fps=60 ! queue ! autovideoconvert ! queue ! fpsdisplaysink 6 | -------------------------------------------------------------------------------- /scripts/jetson/zedxone-simple-fps_rendering.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a ZED X One stream and render it displaying the current FPS using default values for each parameter 4 | 5 | gst-launch-1.0 zedxonesrc ! queue ! autovideoconvert ! queue ! fpsdisplaysink 6 | -------------------------------------------------------------------------------- /scripts/linux/local-od-fps_overlay.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a stream at 720p resolution with RGB, Depth and Object Detection information and 4 | # displaying the data on screen 5 | 6 | # 1) Start `zedsrc` to acquire RGB and depth at 720p resolution enabling Skeleton Tracking (FAST). 7 | # 2) Define `zeddemux` object named `demux` to demux the `zedsrc` composite stream creating two single streams: RGB and Depth. 8 | # 3) Draw Object Detection overlays and render it using the `fpsdisplaysink` sink plugin. 9 | # 4) Display the depth stream with FPS info using the `fpsdisplaysink` sink plugin. 10 | 11 | gst-launch-1.0 \ 12 | zedsrc stream-type=4 bt-enabled=true bt-detection-model=0 ! \ 13 | zeddemux name=demux \ 14 | demux.src_left ! queue ! zedodoverlay ! queue ! autovideoconvert ! fpsdisplaysink \ 15 | demux.src_aux ! queue ! autovideoconvert ! fpsdisplaysink 16 | -------------------------------------------------------------------------------- /scripts/linux/local-rgb-depth-sens-csv.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a stream at default resolution with RGB, Depth and Sensor Data and save them to a CSV file for logging 4 | 5 | # 1) Start `zedsrc` to acquire RGB and depth at default resolution 6 | # 2) Define `zeddemux` object named `demux` to demux the `zedsrc` composite stream creating three single streams: RGB, Depth and data. 7 | # 3) Display RGB left stream with FPS info 8 | # 4) Display Depth stream with FPS info. 9 | # 5) Save the sensor data in the home folder to CSV file named `test_csv.csv` replacing eventual existing data 10 | 11 | gst-launch-1.0 \ 12 | zedsrc depth-mode=5 stream-type=4 ! \ 13 | zeddemux stream-data=TRUE name=demux \ 14 | demux.src_left ! queue ! autovideoconvert ! fpsdisplaysink \ 15 | demux.src_aux ! queue ! autovideoconvert ! fpsdisplaysink \ 16 | demux.src_data ! queue ! zeddatacsvsink location="${HOME}/test_csv.csv" append=FALSE 17 | -------------------------------------------------------------------------------- /scripts/linux/local-rgb-od_multi-overlay.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a stream at 720p resolution with RGB and Object Detection information and 4 | # displaying the results using `zedoddisplaysink` 5 | 6 | # 1) Start `zedsrc` to acquire RGB enabling Object Detection (MULTI-CLASS) 7 | # 2) Add Object Detection overlays to the frame 8 | # 3) Convert the stream and display it with FPS information 9 | 10 | gst-launch-1.0 \ 11 | zedsrc stream-type=0 od-enabled=true od-detection-model=0 camera-fps=30 ! queue ! \ 12 | zedodoverlay ! queue ! \ 13 | autovideoconvert ! fpsdisplaysink 14 | -------------------------------------------------------------------------------- /scripts/linux/local-rgb-rescale-od-overlay.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to resize 2K RGB and depth stream to VGA resolution for display purpose remuxing the Object 4 | # Detection metadata as input for `zedodoverlay` 5 | 6 | # 1) Define a `zeddatamux` object named `mux` to be used to recompose the RGB+metadata stream to be used to render 7 | # the result of Object Detection using `zedoddisplaysink`. The `videoscale` filter indeed removes ZED metadata 8 | # from the RGB stream and the `zeddatamux` adds them back 9 | # 2) Start `zedsrc` to acquire RGB and depth at 2K resolution stream enabling Skeleton Tracking (FAST). 10 | # 3) Define `zeddemux` object named `demux` to demux the `zedsrc` composite stream creating three single streams: RGB, Depth and Data. 11 | # 4) Rescale the Depth stream to VGA resolution and render it using `fpsdisplaysink`. 12 | # 5) Set the data stream from `demux` as input on the data sink of `mux`. 13 | # 6) Rescale the RGB stream to VGA resolution and set it as input on the video sink of `mux`. 14 | # 7) Set the source of the muxer as input for `zedodoverlay` to draw Object Detection overlays 15 | # 8) Convert the stream RGB stream with Object Detection overlay and display it using `fpsdisplaysink`. 16 | 17 | gst-launch-1.0 \ 18 | zeddatamux name=mux \ 19 | zedsrc stream-type=4 camera-resolution=0 camera-fps=30 od-detection-model=1 od-enabled=true ! \ 20 | zeddemux stream-data=true is-depth=true name=demux \ 21 | demux.src_aux ! queue ! autovideoconvert ! videoscale ! video/x-raw,width=672,height=376 ! queue ! fpsdisplaysink \ 22 | demux.src_data ! mux.sink_data \ 23 | demux.src_left ! queue ! videoscale ! video/x-raw,width=672,height=376 ! mux.sink_video \ 24 | mux.src ! queue ! zedodoverlay ! queue ! \ 25 | autovideoconvert ! fpsdisplaysink 26 | -------------------------------------------------------------------------------- /scripts/linux/local-rgb-skel-and-object-overlay.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a stream at default resolution with RGB, Object Detection, and Skeleton Tracking 4 | # information and displaying the results 5 | 6 | # 1) Start `zedsrc` to acquire RGB enabling Skeleton Tracking and Object detection with default parameters. 7 | # 2) Add detected skeletons and objects overlays to the frame 8 | # 3) Convert the stream and display it with FPS information 9 | 10 | gst-launch-1.0 \ 11 | zedsrc stream-type=0 od-enabled=true bt-enabled=true ! queue ! \ 12 | zedodoverlay ! queue ! \ 13 | autovideoconvert ! fpsdisplaysink 14 | -------------------------------------------------------------------------------- /scripts/linux/local-rgb-skel_accurate-overlay.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a stream at default resolution with RGB and Skeleton Tracking information and 4 | # displaying the results 5 | 6 | # 1) Start `zedsrc` to acquire RGB enabling Skeleton Tracking with default parameters. 7 | # 2) Add detected skeleton overlays to the frame 8 | # 3) Convert the stream and display it with FPS information 9 | 10 | gst-launch-1.0 \ 11 | zedsrc stream-type=0 od-enabled=true bt-enabled=true ! queue ! \ 12 | zedodoverlay ! queue ! \ 13 | autovideoconvert ! fpsdisplaysink 14 | -------------------------------------------------------------------------------- /scripts/linux/local-rgb-skel_fast-overlay.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a stream at default resolution with RGB and Skeleton Tracking information and 4 | # displaying the results 5 | 6 | 7 | # 1) Start `zedsrc` to acquire RGB enabling Skeleton Tracking (FAST). 8 | # 2) Add detected skeleton overlays to the frame 9 | # 3) Convert the stream and display it with FPS information 10 | 11 | gst-launch-1.0 \ 12 | zedsrc stream-type=0 bt-enabled=true bt-detection-model=0 ! queue ! \ 13 | zedodoverlay ! queue ! \ 14 | autovideoconvert ! fpsdisplaysink 15 | -------------------------------------------------------------------------------- /scripts/linux/local-rgb_left_depth-fps_rendering.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a stream at default resolution with RGB and Depth info 4 | # displaying the results on screen with FPS information 5 | # 1) Start `zedsrc` to acquire RGB left and depth streams 6 | # 2) Demux the composite left/depth stream 7 | # 3) Render left stream with FPS info 8 | # 4) Render depth stream with FPS info 9 | 10 | gst-launch-1.0 \ 11 | zedsrc stream-type=4 depth-mode=5 ! queue ! \ 12 | zeddemux name=demux \ 13 | demux.src_left ! queue ! autovideoconvert ! fpsdisplaysink \ 14 | demux.src_aux ! queue ! autovideoconvert ! fpsdisplaysink 15 | -------------------------------------------------------------------------------- /scripts/linux/local-rgb_left_right-fps_rendering.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a stream at default resolution with RGB LEft and Right information and 4 | # displaying the results on screen with FPS information 5 | 6 | # 1) Start `zedsrc` to acquire RGB left and right streams 7 | # 2) Demux the composite left/right stream 8 | # 3) Render left stream with FPS info 9 | # 4) Render right stream with FPS info 10 | 11 | gst-launch-1.0 \ 12 | zedsrc stream-type=2 ! queue ! \ 13 | zeddemux is-depth=false name=demux \ 14 | demux.src_left ! queue ! autovideoconvert ! fpsdisplaysink \ 15 | demux.src_aux ! queue ! autovideoconvert ! fpsdisplaysink 16 | -------------------------------------------------------------------------------- /scripts/linux/network-rgb-h264-receiver.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Example pipeline to acquire a stream and send it on local network with H264 encoding 4 | 5 | # install x264enc: `sudo apt-get install x264 gstreamer1.0-plugins-ugly` 6 | 7 | gst-launch-1.0 udpsrc port=5000 ! application/x-rtp,clock-rate=90000,payload=96 ! \ 8 | queue ! rtph264depay ! h264parse ! avdec_h264 ! \ 9 | queue ! autovideoconvert ! fpsdisplaysink 10 | 11 | 12 | -------------------------------------------------------------------------------- /scripts/linux/network-rgb-h264-sender.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a stream and send it on local network with H264 encoding 4 | 5 | # install x264enc: `sudo apt-get install gstreamer1.0-libav x264 gstreamer1.0-plugins-ugly` 6 | 7 | gst-launch-1.0 zedsrc ! timeoverlay ! tee name=split has-chain=true ! \ 8 | queue ! autovideoconvert ! fpsdisplaysink \ 9 | split. ! queue max-size-time=0 max-size-bytes=0 max-size-buffers=0 ! autovideoconvert ! \ 10 | x264enc byte-stream=true tune=zerolatency speed-preset=ultrafast bitrate=3000 ! \ 11 | h264parse ! rtph264pay config-interval=-1 pt=96 ! queue ! \ 12 | udpsink clients=127.0.0.1:5000 max-bitrate=3000000 sync=false async=false 13 | -------------------------------------------------------------------------------- /scripts/linux/rtsp-h264-receiver.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to start an RTSP client on the same machine of the server 4 | 5 | HOST_IPS=(`hostname -I`) 6 | export SERVER_IP=${HOST_IPS[0]} 7 | 8 | gst-launch-1.0 rtspsrc location=rtsp://${SERVER_IP}:8554/zed-stream latency=0 ! decodebin ! fpsdisplaysink 9 | 10 | -------------------------------------------------------------------------------- /scripts/linux/rtsp-rgb-h264-sender.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to start an RGB RTSP server 4 | 5 | # install RTSP libraries to compile RTSP server: 6 | # `sudo apt install libgstrtspserver-1.0-0 libgstrtspserver-1.0-dev` 7 | # Tune the H264 parameters according to your network capabilities. 8 | 9 | HOST_IPS=(`hostname -I`) 10 | export SERVER_IP=${HOST_IPS[0]} 11 | 12 | 13 | gst-zed-rtsp-launch -a ${SERVER_IP} \ 14 | zedsrc stream-type=0 ! identity silent=false ! \ 15 | videoconvert ! video/x-raw, format=I420 ! \ 16 | x264enc tune=zerolatency bitrate=50000 speed-preset=ultrafast key-int-max=30 qp-min=8 qp-max=51 qp-step=1 ! \ 17 | rtph264pay config-interval=-1 mtu=1500 pt=96 name=pay0 18 | -------------------------------------------------------------------------------- /scripts/linux/simple-depth-fps_rendering.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a depth stream and render it displaying the current FPS using default values for each parameter 4 | 5 | gst-launch-1.0 zedsrc stream-type=3 depth-mode=4 ! queue ! autovideoconvert ! queue ! fpsdisplaysink 6 | -------------------------------------------------------------------------------- /scripts/linux/simple-fps_rendering.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # Example pipeline to acquire a stream and render it displaying the current FPS using default values for each parameter 4 | 5 | gst-launch-1.0 zedsrc ! queue ! autovideoconvert ! queue ! fpsdisplaysink 6 | -------------------------------------------------------------------------------- /scripts/windows/local-od-fps_overlay.bat: -------------------------------------------------------------------------------- 1 | :: Example pipeline to acquire a stream at 720p resolution with RGB, Depth and Object Detection information and 2 | :: displaying the data on screen 3 | 4 | :: 1) Start `zedsrc` to acquire RGB and depth at 720p resolution enabling Skeleton Tracking (FAST). 5 | :: 2) Define `zeddemux` object named `demux` to demux the `zedsrc` composite stream creating two single streams: RGB and Depth. 6 | :: 3) Draw Object Detection overlays and render it using the `fpsdisplaysink` sink plugin. 7 | :: 4) Display the depth stream with FPS info using the `fpsdisplaysink` sink plugin. 8 | 9 | gst-launch-1.0 ^ 10 | zedsrc stream-type=4 bt-enabled=true bt-detection-model=0 ! ^ 11 | zeddemux name=demux ^ 12 | demux.src_left ! queue ! zedodoverlay ! queue ! autovideoconvert ! fpsdisplaysink ^ 13 | demux.src_aux ! queue ! autovideoconvert ! fpsdisplaysink 14 | -------------------------------------------------------------------------------- /scripts/windows/local-rgb-depth-sens-csv.bat: -------------------------------------------------------------------------------- 1 | :: Example pipeline to acquire a stream at default resolution with RGB, Depth and Sensor Data and save them to a CSV file for logging 2 | 3 | :: 1) Start `zedsrc` to acquire RGB and depth at default resolution 4 | :: 2) Define `zeddemux` object named `demux` to demux the `zedsrc` composite stream creating three single streams: RGB, Depth and data. 5 | :: 3) Display RGB left stream with FPS info 6 | :: 4) Display Depth stream with FPS info. 7 | :: 5) Save the sensor data in the home folder to CSV file named `test_csv.csv` replacing eventual existing data 8 | 9 | gst-launch-1.0 ^ 10 | zedsrc stream-type=4 depth-mode=5 ! ^ 11 | zeddemux stream-data=TRUE name=demux ^ 12 | demux.src_left ! queue ! autovideoconvert ! fpsdisplaysink ^ 13 | demux.src_aux ! queue ! autovideoconvert ! fpsdisplaysink ^ 14 | demux.src_data ! queue ! zeddatacsvsink location="%systemdrive%%homepath%\test_csv.csv" append=FALSE 15 | -------------------------------------------------------------------------------- /scripts/windows/local-rgb-od_multi-overlay.bat: -------------------------------------------------------------------------------- 1 | :: Example pipeline to acquire a stream at 720p resolution with RGB and Object Detection information and 2 | :: displaying the results using `zedoddisplaysink` 3 | 4 | :: 1) Start `zedsrc` to acquire RGB enabling Object Detection (MULTI-CLASS) 5 | :: 2) Add Object Detection overlays to the frame 6 | :: 3) Convert the stream and display it with FPS information 7 | 8 | gst-launch-1.0 ^ 9 | zedsrc stream-type=0 od-enabled=true od-detection-model=0 ! queue ! ^ 10 | zedodoverlay ! queue ! ^ 11 | autovideoconvert ! fpsdisplaysink 12 | -------------------------------------------------------------------------------- /scripts/windows/local-rgb-rescale-od-overlay.bat: -------------------------------------------------------------------------------- 1 | :: Example pipeline to resize 2K RGB and depth stream to VGA resolution for display purpose remuxing the Object 2 | :: Detection metadata as input for `zedodoverlay` 3 | 4 | :: 1) Define a `zeddatamux` object named `mux` to be used to recompose the RGB+metadata stream to be used to render 5 | :: the result of Object Detection using `zedoddisplaysink`. The `videoscale` filter indeed removes ZED metadata 6 | :: from the RGB stream and the `zeddatamux` adds them back 7 | :: 2) Start `zedsrc` to acquire RGB and depth at 2K resolution stream enabling Skeleton Tracking (FAST). 8 | :: 3) Define `zeddemux` object named `demux` to demux the `zedsrc` composite stream creating three single streams: RGB, Depth and Data. 9 | :: 4) Rescale the Depth stream to VGA resolution and render it using `fpsdisplaysink`. 10 | :: 5) Set the data stream from `demux` as input on the data sink of `mux`. 11 | :: 6) Rescale the RGB stream to VGA resolution and set it as input on the video sink of `mux`. 12 | :: 7) Set the source of the muxer as input for `zedodoverlay` to draw Object Detection overlays 13 | :: 8) Convert the stream RGB stream with Object Detection overlay and display it using `fpsdisplaysink`. 14 | 15 | gst-launch-1.0 ^ 16 | zeddatamux name=mux ^ 17 | zedsrc stream-type=4 camera-resolution=0 camera-fps=15 od-detection-model=1 od-enabled=true ! ^ 18 | zeddemux stream-data=true is-depth=true name=demux ^ 19 | demux.src_aux ! queue ! autovideoconvert ! videoscale ! video/x-raw,width=672,height=376 ! queue ! fpsdisplaysink ^ 20 | demux.src_data ! mux.sink_data ^ 21 | demux.src_left ! queue ! videoscale ! video/x-raw,width=672,height=376 ! mux.sink_video ^ 22 | mux.src ! queue ! zedodoverlay ! queue ! ^ 23 | autovideoconvert ! fpsdisplaysink 24 | -------------------------------------------------------------------------------- /scripts/windows/local-rgb-skel_accurate-overlay.bat: -------------------------------------------------------------------------------- 1 | :: Example pipeline to acquire a stream at default resolution with RGB and Skeleton Tracking information and 2 | :: displaying the results 3 | 4 | :: 1) Start `zedsrc` to acquire RGB enabling Skeleton Tracking (ACCURATE). 5 | :: 2) Add detected skeleton overlays to the frame 6 | :: 3) Convert the stream and display it with FPS information 7 | 8 | gst-launch-1.0 ^ 9 | zedsrc stream-type=0 od-enabled=true od-detection-model=2 ! queue ! ^ 10 | zedodoverlay ! queue ! ^ 11 | autovideoconvert ! fpsdisplaysink 12 | -------------------------------------------------------------------------------- /scripts/windows/local-rgb-skel_fast-overlay.bat: -------------------------------------------------------------------------------- 1 | :: Example pipeline to acquire a stream at default resolution with RGB and Skeleton Tracking information and 2 | : displaying the results 3 | 4 | :: 1) Start `zedsrc` to acquire RGB enabling Skeleton Tracking (FAST). 5 | :: 2) Add detected skeleton overlays to the frame 6 | :: 3) Convert the stream and display it with FPS information 7 | 8 | gst-launch-1.0 ^ 9 | zedsrc stream-type=0 od-enabled=true od-detection-model=1 resolution=2 camera-fps=30 ! queue ! ^ 10 | zedodoverlay ! queue ! ^ 11 | autovideoconvert ! fpsdisplaysink 12 | -------------------------------------------------------------------------------- /scripts/windows/local-rgb_left_depth-fps_rendering.bat: -------------------------------------------------------------------------------- 1 | :: Example pipeline to acquire a stream at default resolution with RGB and Depth info 2 | :: displaying the results on screen with FPS information 3 | :: 1) Start `zedsrc` to acquire RGB left and depth streams 4 | :: 2) Demux the composite left/depth stream 5 | :: 3) Render left stream with FPS info 6 | :: 4) Render depth stream with FPS info 7 | 8 | gst-launch-1.0 ^ 9 | zedsrc stream-type=4 depth-mode=5 ! queue ! ^ 10 | zeddemux name=demux ^ 11 | demux.src_left ! queue ! autovideoconvert ! fpsdisplaysink ^ 12 | demux.src_aux ! queue ! autovideoconvert ! fpsdisplaysink 13 | -------------------------------------------------------------------------------- /scripts/windows/local-rgb_left_right-fps_rendering.bat: -------------------------------------------------------------------------------- 1 | :: Example pipeline to acquire a stream at default resolution with RGB LEft and Right information and 2 | :: displaying the results on screen with FPS information 3 | 4 | :: 1) Start `zedsrc` to acquire RGB left and right streams 5 | :: 2) Demux the composite left/right stream 6 | :: 3) Render left stream with FPS info 7 | :: 4) Render right stream with FPS info 8 | 9 | gst-launch-1.0 ^ 10 | zedsrc stream-type=2 ! queue ! ^ 11 | zeddemux is-depth=false name=demux ^ 12 | demux.src_left ! queue ! autovideoconvert ! fpsdisplaysink ^ 13 | demux.src_aux ! queue ! autovideoconvert ! fpsdisplaysink 14 | -------------------------------------------------------------------------------- /scripts/windows/simple-depth-fps_rendering.bat: -------------------------------------------------------------------------------- 1 | :: Example pipeline to acquire a depth stream and render it displaying the current FPS using default values for each parameter 2 | 3 | gst-launch-1.0 zedsrc stream-type=3 depth-mode=5 ! queue ! autovideoconvert ! queue ! fpsdisplaysink 4 | -------------------------------------------------------------------------------- /scripts/windows/simple-fps_rendering.bat: -------------------------------------------------------------------------------- 1 | :: Example pipeline to acquire a stream and render it displaying the current FPS using default values for each parameter 2 | 3 | gst-launch-1.0 zedsrc ! queue ! autovideoconvert ! queue ! fpsdisplaysink 4 | --------------------------------------------------------------------------------