SmartSpectra C++ SDK
Measure human vitals from video with SmartSpectra C++ SDK.
Loading...
Searching...
No Matches
file_ipc_stream_writer.hpp
1// file_ipc_stream_writer.hpp
2// Created by Greg on 9/26/2025.
3// Copyright (C) 2025 Presage Security, Inc.
4//
5// SPDX-License-Identifier: LGPL-3.0-or-later
6
7#pragma once
8
9// === standard library includes (if any) ===
10#include <filesystem>
11#include <fstream>
12#include <mutex>
13#include <chrono>
14#include <atomic>
15// === third-party includes (if any) ===
16#include <google/protobuf/util/json_util.h>
17#include <glog/logging.h>
18#include <turbojpeg.h>
19// === local includes (if any) ===
20#include "../ipc_stream_writer.hpp"
21#include "file_ipc_configuration.hpp"
22
23namespace presage::smartspectra::file_ipc {
24
34template<container::settings::IntegrationMode TIntegrationMode>
35class FileIpcStreamWriter : public ipc::IpcStreamWriter<TIntegrationMode> {
36public:
38 using typename Base::BackgroundContainer;
39
40 explicit FileIpcStreamWriter(const FileIpcConfiguration& configuration);
41 virtual ~FileIpcStreamWriter();
42
43 // Implement base interface
44 absl::Status WriteStatus(const presage::physiology::StatusValue& status) override;
45 absl::Status WriteCoreMetrics(
46 const presage::physiology::MetricsBuffer& metrics,
47 int64_t timestamp_us
48 ) override;
49 absl::Status WriteEdgeMetrics(const presage::physiology::Metrics& metrics, int64_t timestamp_us) override;
50 absl::Status WriteFrame(const cv::Mat& frame, int64_t timestamp_us) override;
51 void Close() override;
52 bool IsOperational() const override;
53 absl::Status Flush() override;
54
55protected:
60 absl::Status Initialize();
61
65 absl::Status WriteJsonLine(std::ofstream& stream, const std::string& json_data);
66
70 static std::string BuildEnvelope(
71 const std::string& type,
72 const std::string& json_payload,
73 int64_t timestamp_us
74 );
75
79 static std::string BuildStatusPayload(const presage::physiology::StatusValue& status);
80
84 static std::string JsonEscape(const std::string& value);
85
89 static const google::protobuf::util::JsonPrintOptions& GetJsonOptions();
90
97 absl::Status CompressFrameWithTurboJpeg(const cv::Mat& frame, std::vector<unsigned char>& jpeg_data);
98
99private:
100 FileIpcConfiguration configuration_;
101 std::filesystem::path base_directory_;
102
103 // Output streams
104 std::ofstream core_metrics_stream_;
105 std::ofstream edge_metrics_stream_;
106 std::ofstream status_stream_;
107
108 // Stream buffers to prevent shared buffer memory corruption
109 std::vector<char> core_metrics_buffer_;
110 std::vector<char> edge_metrics_buffer_;
111 std::vector<char> status_buffer_;
112
113 // Frame management
114 std::filesystem::path frames_dir_;
115
116 // Thread safety
117 mutable std::mutex write_mutex_;
118 std::mutex frame_mutex_;
119
120 // Error handling
121 std::atomic<bool> is_operational_{false};
122
123 // Recording state management
124 std::filesystem::path recording_state_path_;
125 std::filesystem::path recording_command_path_;
126
127 // TurboJPEG compressor handle
128 tjhandle turbo_jpeg_compressor_ = nullptr;
129};
130
131} // namespace presage::smartspectra::file_ipc
static std::string BuildStatusPayload(const presage::physiology::StatusValue &status)
Definition file_ipc_stream_writer_impl.hpp:345
absl::Status Flush() override
Definition file_ipc_stream_writer_impl.hpp:296
static const google::protobuf::util::JsonPrintOptions & GetJsonOptions()
Definition file_ipc_stream_writer_impl.hpp:386
void Close() override
Definition file_ipc_stream_writer_impl.hpp:272
absl::Status WriteJsonLine(std::ofstream &stream, const std::string &json_data)
Definition file_ipc_stream_writer_impl.hpp:314
absl::Status WriteCoreMetrics(const presage::physiology::MetricsBuffer &metrics, int64_t timestamp_us) override
Definition file_ipc_stream_writer_impl.hpp:142
absl::Status Initialize()
Definition file_ipc_stream_writer_impl.hpp:50
absl::Status WriteStatus(const presage::physiology::StatusValue &status) override
Definition file_ipc_stream_writer_impl.hpp:131
absl::Status CompressFrameWithTurboJpeg(const cv::Mat &frame, std::vector< unsigned char > &jpeg_data)
Definition file_ipc_stream_writer_impl.hpp:398
bool IsOperational() const override
Definition file_ipc_stream_writer_impl.hpp:291
static std::string BuildEnvelope(const std::string &type, const std::string &json_payload, int64_t timestamp_us)
Definition file_ipc_stream_writer_impl.hpp:330
absl::Status WriteEdgeMetrics(const presage::physiology::Metrics &metrics, int64_t timestamp_us) override
Definition file_ipc_stream_writer_impl.hpp:164
absl::Status WriteFrame(const cv::Mat &frame, int64_t timestamp_us) override
Definition file_ipc_stream_writer_impl.hpp:185
static std::string JsonEscape(const std::string &value)
Definition file_ipc_stream_writer_impl.hpp:359
Definition ipc_stream_writer.hpp:46
Definition file_ipc_configuration.hpp:27