From a2cb96799c21d22a07dd346b03856516df3b69d7 Mon Sep 17 00:00:00 2001 From: flipflip Date: Wed, 26 Aug 2026 09:51:02 +0200 Subject: [PATCH] Add more s --- .devcontainer/.claude/.gitkeep | 0 .devcontainer/.local/.gitkeep | 0 .gitignore | 2 ++ docker/docker-compose.yaml | 10 ++++++ .../camera_streaming/camera_streaming.cpp | 24 ++++++++----- fpsdk_common/include/fpsdk_common/cam.hpp | 14 +++++--- fpsdk_common/src/cam.cpp | 34 +++++++++---------- 7 files changed, 52 insertions(+), 32 deletions(-) create mode 100644 .devcontainer/.claude/.gitkeep create mode 100644 .devcontainer/.local/.gitkeep diff --git a/.devcontainer/.claude/.gitkeep b/.devcontainer/.claude/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/.devcontainer/.local/.gitkeep b/.devcontainer/.local/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/.gitignore b/.gitignore index 30ef670f..52768765 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,8 @@ CMakeCache.txt *.bag *.bak /.devcontainer/.bash_history.d +/.devcontainer/.claude +/.devcontainer/.local /.devcontainer/.vscode-server .devcontainer/.gdb/__pycache__ /ws diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index efaccc57..8a8a2039 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -48,6 +48,8 @@ services: # Persistent stuff - ../.devcontainer/.bash_history.d:/home/fpsdk/.bash_history.d - ../.devcontainer/.vscode-server:/home/fpsdk/.vscode-server + - ../.devcontainer/.claude:/home/fpsdk/.claude + - ../.devcontainer/.local:/home/fpsdk/.local # Workspace - ../.:/home/fpsdk/fixposition-sdk cap_add: @@ -95,6 +97,8 @@ services: - ../.devcontainer/.bash_logout:/home/fpsdk/.bash_logout - ../.devcontainer/.bash_history.d:/home/fpsdk/.bash_history.d - ../.devcontainer/.vscode-server:/home/fpsdk/.vscode-server + - ../.devcontainer/.claude:/home/fpsdk/.claude + - ../.devcontainer/.local:/home/fpsdk/.local - ../.:/home/fpsdk/fixposition-sdk cap_add: - SYS_PTRACE @@ -140,6 +144,8 @@ services: - ../.devcontainer/.bash_logout:/home/fpsdk/.bash_logout - ../.devcontainer/.bash_history.d:/home/fpsdk/.bash_history.d - ../.devcontainer/.vscode-server:/home/fpsdk/.vscode-server + - ../.devcontainer/.claude:/home/fpsdk/.claude + - ../.devcontainer/.local:/home/fpsdk/.local - ../.:/home/fpsdk/fixposition-sdk cap_add: - SYS_PTRACE @@ -182,6 +188,8 @@ services: - ../.devcontainer/.bash_logout:/home/fpsdk/.bash_logout - ../.devcontainer/.bash_history.d:/home/fpsdk/.bash_history.d - ../.devcontainer/.vscode-server:/home/fpsdk/.vscode-server + - ../.devcontainer/.claude:/home/fpsdk/.claude + - ../.devcontainer/.local:/home/fpsdk/.local - ../.:/home/fpsdk/fixposition-sdk cap_add: - SYS_PTRACE @@ -224,6 +232,8 @@ services: - ../.devcontainer/.bash_logout:/home/fpsdk/.bash_logout - ../.devcontainer/.bash_history.d:/home/fpsdk/.bash_history.d - ../.devcontainer/.vscode-server:/home/fpsdk/.vscode-server + - ../.devcontainer/.claude:/home/fpsdk/.claude + - ../.devcontainer/.local:/home/fpsdk/.local - ../.:/home/fpsdk/fixposition-sdk cap_add: - SYS_PTRACE diff --git a/examples/camera_streaming/camera_streaming.cpp b/examples/camera_streaming/camera_streaming.cpp index bb67cf29..415ec41d 100644 --- a/examples/camera_streaming/camera_streaming.cpp +++ b/examples/camera_streaming/camera_streaming.cpp @@ -58,6 +58,10 @@ using namespace fpsdk::common::string; using namespace fpsdk::common::time; using namespace fpsdk::common::video; +#if !FPSDK_USE_FFMPEG +# error This app must be compiled with FFmpeg support! +#endif + // --------------------------------------------------------------------------------------------------------------------- // Statistics @@ -160,8 +164,8 @@ int main(int argc, char** argv) // Generic info std::size_t len = - std::snprintf(info, sizeof(info), "Frame %6" PRIuMAX ": %-7s %-5s %-10s %-9s %-7s %6" PRIuMAX " %s %4.1f", - n_frames, data.valid_ ? "valid" : "invalid", CamIdToStr(data.cam_id_), CamDataTypeToStr(data.type_), + std::snprintf(info, sizeof(info), "Frame %6" PRIuMAX ": %06" PRIuMAX " %-7s %-5s %-10s %-9s %-7s %6" PRIuMAX " %s %4.1f", + n_frames, data.seq_, data.valid_ ? "valid" : "invalid", CamIdToStr(data.cam_id_), CamDataTypeToStr(data.type_), CamDataFmtToStr(data.fmt_), CamDataFrmToStr(data.frm_), data.data_.size(), t_data.StrIsoTime(3).c_str(), Duration::FromNSec(data.dt_).GetSec() * 1e3); @@ -185,19 +189,21 @@ int main(int argc, char** argv) if (decoder) { TicToc tt; const auto img = decoder->DecodeFrame(data.data_); - if (!img) { - ok = false; - break; + + // Decoding adds latency + if (img) { + const auto lat = tt.Toc().GetSec() * 1e3; // [ms] + len += std::snprintf(&info[len], sizeof(info) - len, " -- decode: %+5.1f", lat); + stats.dec(lat); + } else { + len += std::snprintf(&info[len], sizeof(info) - len, " -- DECODE FAIL"); + continue; } // -------------------------------------------------------------------------------------- // Now we have the decoded image in "img" and all the raw data and meta data in "data"... // -------------------------------------------------------------------------------------- - // Decoding adds latency - const auto lat = tt.Toc().GetSec() * 1e3; // [ms] - len += std::snprintf(&info[len], sizeof(info) - len, " -- decode: %+5.1f", lat); - stats.dec(lat); } } diff --git a/fpsdk_common/include/fpsdk_common/cam.hpp b/fpsdk_common/include/fpsdk_common/cam.hpp index 5e675a9e..0d491cc8 100644 --- a/fpsdk_common/include/fpsdk_common/cam.hpp +++ b/fpsdk_common/include/fpsdk_common/cam.hpp @@ -84,11 +84,15 @@ CamId CamIdFromValOr(const uint8_t val, const CamId def); */ enum class CamDataType : uint8_t // clang-format off { - UNSPECIFIED = 0, //!< Unspecified - HIRES_IMG = 1, //!< High-res image - LORES_IMG = 2, //!< Low-res image - HIRES_VID = 3, //!< High-res video - LORES_VID = 4, //!< Low-res video + UNSPECIFIED = 0, //!< Unspecified + HIRES_IMG = 1, //!< High-res image (typically CamDataFmt::NV12) + LORES_IMG = 2, //!< Low-res image (typically CamDataFmt::NV12) + HIRES_VID = 3, //!< High-res video (typically CamDataFmt::H265) + LORES_VID = 4, //!< Low-res video (typically CamDataFmt::JPEG) + FURES_IMG = 5, //!< Full-res image (typically CamDataFmt::NV12, for some cameras/sensors only, not streamable) + FURES_VID = 6, //!< Full-res video (typically CamDataFmt::H265, for some cameras/sensors only) + DEPTH_IMG = 7, //!< Internal use, ignore + DEPTH_VID = 8, //!< Internal use, ignore }; // clang-format on /** diff --git a/fpsdk_common/src/cam.cpp b/fpsdk_common/src/cam.cpp index f436a1a6..77a85ef7 100644 --- a/fpsdk_common/src/cam.cpp +++ b/fpsdk_common/src/cam.cpp @@ -84,6 +84,10 @@ const char* CamDataTypeToStr(const CamDataType type) case CamDataType::LORES_IMG: return "LORES_IMG"; case CamDataType::HIRES_VID: return "HIRES_VID"; case CamDataType::LORES_VID: return "LORES_VID"; + case CamDataType::FURES_IMG: return "FURES_IMG"; + case CamDataType::FURES_VID: return "FURES_VID"; + case CamDataType::DEPTH_IMG: return "DEPTH_IMG"; + case CamDataType::DEPTH_VID: return "DEPTH_VID"; } // clang-format on return "?"; } @@ -95,6 +99,10 @@ CamDataType CamDataTypeFromStrOr(const char* str, const CamDataType def) if (std::strcmp(str, "LORES_IMG") == 0) { return CamDataType::LORES_IMG; } if (std::strcmp(str, "HIRES_VID") == 0) { return CamDataType::HIRES_VID; } if (std::strcmp(str, "LORES_VID") == 0) { return CamDataType::LORES_VID; } + if (std::strcmp(str, "FURES_IMG") == 0) { return CamDataType::FURES_IMG; } + if (std::strcmp(str, "FURES_VID") == 0) { return CamDataType::FURES_VID; } + if (std::strcmp(str, "DEPTH_IMG") == 0) { return CamDataType::DEPTH_IMG; } + if (std::strcmp(str, "DEPTH_VID") == 0) { return CamDataType::DEPTH_VID; } return def; // clang-format on } @@ -106,6 +114,10 @@ CamDataType CamDataTypeFromValOr(const uint8_t val, const CamDataType def) case EnumToVal(CamDataType::LORES_IMG): return CamDataType::LORES_IMG; case EnumToVal(CamDataType::HIRES_VID): return CamDataType::HIRES_VID; case EnumToVal(CamDataType::LORES_VID): return CamDataType::LORES_VID; + case EnumToVal(CamDataType::FURES_IMG): return CamDataType::FURES_IMG; + case EnumToVal(CamDataType::FURES_VID): return CamDataType::FURES_VID; + case EnumToVal(CamDataType::DEPTH_IMG): return CamDataType::DEPTH_IMG; + case EnumToVal(CamDataType::DEPTH_VID): return CamDataType::DEPTH_VID; } return def; // clang-format on } @@ -583,26 +595,12 @@ std::unique_ptr CreateCamStream(const CamStreamParams& params) // Some sanity checks.. bool ok = true; - switch (params.cam_id_) { - case CamId::CAM1: - case CamId::CAM2: - case CamId::CAM3: - case CamId::CAM4: - break; - case CamId::UNSPECIFIED: - ok = false; - break; + if (params.cam_id_ == CamId::UNSPECIFIED) { + ok = false; } - switch (params.type_) { - case CamDataType::HIRES_VID: - case CamDataType::HIRES_IMG: - case CamDataType::LORES_IMG: - case CamDataType::LORES_VID: - break; - case CamDataType::UNSPECIFIED: - ok = false; - break; + if (params.type_ == CamDataType::UNSPECIFIED) { + ok = false; } // Some data types support only rate 1 (typically for example HIRES_VID), but only the sensor knows what's okay and