88#include < flatbuffers/flatbuffers.h>
99#include < schema/oak_bfbs_generated.h>
1010
11+ #include < stdexcept>
1112#include < vector>
1213
1314namespace core
@@ -48,36 +49,41 @@ class FrameMetadataTrackerOak::Impl : public ITrackerImpl
4849 }
4950 }
5051
51- m_data.streams .clear ();
52- for (const auto & s : m_streams)
53- m_data.streams .push_back (std::make_unique<FrameMetadataOakT>(s.data ));
54-
5552 return true ;
5653 }
5754
58- Timestamp serialize (flatbuffers::FlatBufferBuilder& builder, size_t /* channel_index*/ ) const override
55+ Timestamp serialize (flatbuffers::FlatBufferBuilder& builder, size_t channel_index) const override
5956 {
60- auto offset = CameraMetadataOak::Pack (builder, &m_data);
61- builder.Finish (offset);
62-
63- Timestamp latest{};
64- for (const auto & entry : m_data.streams )
57+ if (channel_index >= m_streams.size ())
6558 {
66- if (entry->timestamp && entry->timestamp ->device_time () > latest.device_time ())
67- latest = *entry->timestamp ;
59+ throw std::runtime_error (" FrameMetadataTrackerOak::serialize: invalid channel_index " +
60+ std::to_string (channel_index) + " (have " + std::to_string (m_streams.size ()) +
61+ " streams)" );
6862 }
69- return latest;
63+
64+ const auto & data = m_streams[channel_index].data ;
65+ auto offset = FrameMetadataOak::Pack (builder, &data);
66+ builder.Finish (offset);
67+
68+ if (data.timestamp )
69+ return *data.timestamp ;
70+ return Timestamp{};
7071 }
7172
72- const CameraMetadataOakT& get_data ( ) const
73+ const FrameMetadataOakT& get_stream_data ( size_t stream_index ) const
7374 {
74- return m_data;
75+ if (stream_index >= m_streams.size ())
76+ {
77+ throw std::runtime_error (" FrameMetadataTrackerOak::get_stream_data: invalid stream_index " +
78+ std::to_string (stream_index) + " (have " + std::to_string (m_streams.size ()) +
79+ " streams)" );
80+ }
81+ return m_streams[stream_index].data ;
7582 }
7683
7784private:
7885 std::vector<StreamState> m_streams;
7986 std::vector<uint8_t > m_buffer;
80- CameraMetadataOakT m_data;
8187};
8288
8389// ============================================================================
@@ -88,12 +94,19 @@ FrameMetadataTrackerOak::FrameMetadataTrackerOak(const std::string& collection_p
8894 const std::vector<StreamType>& streams,
8995 size_t max_flatbuffer_size)
9096{
97+ if (streams.empty ())
98+ {
99+ throw std::runtime_error (" FrameMetadataTrackerOak: at least one stream is required" );
100+ }
101+
91102 for (auto type : streams)
92103 {
93- m_configs.push_back ({ .collection_id = collection_prefix + " /" + EnumNameStreamType (type),
104+ const char * name = EnumNameStreamType (type);
105+ m_configs.push_back ({ .collection_id = collection_prefix + " /" + name,
94106 .max_flatbuffer_size = max_flatbuffer_size,
95107 .tensor_identifier = " frame_metadata" ,
96- .localized_name = std::string (" FrameMetadataTracker_" ) + EnumNameStreamType (type) });
108+ .localized_name = std::string (" FrameMetadataTracker_" ) + name });
109+ m_channel_names.emplace_back (name);
97110 }
98111}
99112
@@ -109,18 +122,18 @@ std::string_view FrameMetadataTrackerOak::get_name() const
109122
110123std::string_view FrameMetadataTrackerOak::get_schema_name () const
111124{
112- return " core.CameraMetadataOak " ;
125+ return " core.FrameMetadataOak " ;
113126}
114127
115128std::string_view FrameMetadataTrackerOak::get_schema_text () const
116129{
117130 return std::string_view (
118- reinterpret_cast <const char *>(CameraMetadataOakBinarySchema ::data ()), CameraMetadataOakBinarySchema ::size ());
131+ reinterpret_cast <const char *>(FrameMetadataOakBinarySchema ::data ()), FrameMetadataOakBinarySchema ::size ());
119132}
120133
121- const CameraMetadataOakT & FrameMetadataTrackerOak::get_data (const DeviceIOSession& session) const
134+ const FrameMetadataOakT & FrameMetadataTrackerOak::get_stream_data (const DeviceIOSession& session, size_t stream_index ) const
122135{
123- return static_cast <const Impl&>(session.get_tracker_impl (*this )).get_data ( );
136+ return static_cast <const Impl&>(session.get_tracker_impl (*this )).get_stream_data (stream_index );
124137}
125138
126139std::shared_ptr<ITrackerImpl> FrameMetadataTrackerOak::create_tracker (const OpenXRSessionHandles& handles) const
0 commit comments