Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file added .devcontainer/.claude/.gitkeep
Empty file.
Empty file added .devcontainer/.local/.gitkeep
Empty file.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ CMakeCache.txt
*.bag
*.bak
/.devcontainer/.bash_history.d
/.devcontainer/.claude
/.devcontainer/.local
/.devcontainer/.vscode-server
.devcontainer/.gdb/__pycache__
/ws
Expand Down
10 changes: 10 additions & 0 deletions docker/docker-compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
24 changes: 15 additions & 9 deletions examples/camera_streaming/camera_streaming.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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);

Expand All @@ -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);
}
}

Expand Down
14 changes: 9 additions & 5 deletions fpsdk_common/include/fpsdk_common/cam.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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

/**
Expand Down
34 changes: 16 additions & 18 deletions fpsdk_common/src/cam.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 "?";
}
Expand All @@ -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
}

Expand All @@ -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
}
Expand Down Expand Up @@ -583,26 +595,12 @@ std::unique_ptr<CamStream> 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
Expand Down
Loading