58 double frame_rate = 0.0);
66 [[nodiscard]] std::vector<DataDimension> get_dimensions()
const override;
67 [[nodiscard]] uint64_t get_total_elements()
const override;
71 [[nodiscard]] uint64_t get_frame_size()
const override;
72 [[nodiscard]] uint64_t get_num_frames()
const override;
74 std::vector<DataVariant> get_region_data(
const Region& region)
const override;
75 void set_region_data(
const Region& region,
const std::vector<DataVariant>& data)
override;
77 std::vector<DataVariant> get_region_group_data(
const RegionGroup& group)
const override;
78 std::vector<DataVariant> get_segments_data(
const std::vector<RegionSegment>& segment)
const override;
80 [[nodiscard]] std::type_index value_element_type()
const override;
82 [[nodiscard]] uint64_t coordinates_to_linear_index(
const std::vector<uint64_t>& coordinates)
const override;
83 [[nodiscard]] std::vector<uint64_t> linear_index_to_coordinates(uint64_t linear_index)
const override;
85 void clear()
override;
87 [[nodiscard]]
const void* get_raw_data()
const override;
88 [[nodiscard]]
bool has_data()
const override;
115 void setup_ring(uint64_t total_frames,
116 uint32_t ring_capacity,
121 uint32_t refill_threshold,
122 uint64_t reader_id = 0);
129 [[nodiscard]] uint8_t* mutable_slot_ptr(uint64_t frame_index);
136 void commit_frame(uint64_t frame_index);
141 void invalidate_ring();
147 [[nodiscard]]
bool is_frame_available(uint64_t frame_index)
const;
152 [[nodiscard]]
bool is_ring_mode()
const {
return m_ring_capacity > 0; }
175 uint64_t prev = m_cache_head.load(std::memory_order_relaxed);
176 while (frame_index > prev
177 && !m_cache_head.compare_exchange_weak(prev, frame_index,
178 std::memory_order_release, std::memory_order_relaxed)) { }
187 return m_cache_head.load(std::memory_order_acquire);
204 [[nodiscard]] std::span<const float> processed_frame_as_float(
205 uint64_t frame_index = 0)
const;
213 std::unordered_map<std::string, RegionGroup> get_all_region_groups()
const override;
216 bool is_region_loaded(
const Region& region)
const override;
217 void load_region(
const Region& region)
override;
218 void unload_region(
const Region& region)
override;
224 void set_read_position(
const std::vector<uint64_t>& position)
override;
225 void update_read_position_for_channel(
size_t channel, uint64_t frame)
override;
226 [[nodiscard]]
const std::vector<uint64_t>& get_read_position()
const override;
227 void advance_read_position(
const std::vector<uint64_t>& frames)
override;
228 [[nodiscard]]
bool is_at_end()
const override;
229 void reset_read_position()
override;
231 [[nodiscard]] uint64_t get_temporal_rate()
const override;
235 void set_looping(
bool enable)
override;
236 [[nodiscard]]
bool is_looping()
const override {
return m_looping_enabled; }
237 void set_loop_region(
const Region& region)
override;
238 [[nodiscard]]
Region get_loop_region()
const override;
240 [[nodiscard]]
bool is_ready()
const override;
241 [[nodiscard]] std::vector<uint64_t> get_remaining_frames()
const override;
242 uint64_t read_sequential(std::span<double>
output, uint64_t
count)
override;
243 uint64_t peek_sequential(std::span<double>
output, uint64_t
count, uint64_t
offset)
const override;
252 void register_state_change_callback(
253 std::function<
void(
const std::shared_ptr<SignalSourceContainer>&,
ProcessingState)> callback)
override;
254 void unregister_state_change_callback()
override;
256 [[nodiscard]]
bool is_ready_for_processing()
const override;
257 void mark_ready_for_processing(
bool ready)
override;
259 void create_default_processor()
override;
260 void process_default()
override;
261 void set_default_processor(
const std::shared_ptr<DataProcessor>& processor)
override;
262 [[nodiscard]] std::shared_ptr<DataProcessor> get_default_processor()
const override;
264 std::shared_ptr<DataProcessingChain> get_processing_chain()
override;
265 void set_processing_chain(
const std::shared_ptr<DataProcessingChain>& chain)
override { m_processing_chain = chain; }
271 uint32_t register_dimension_reader(uint32_t dimension_index)
override;
272 void unregister_dimension_reader(uint32_t dimension_index)
override;
273 [[nodiscard]]
bool has_active_readers()
const override;
274 void mark_dimension_consumed(uint32_t dimension_index, uint32_t reader_id)
override;
275 [[nodiscard]]
bool all_dimensions_consumed()
const override;
286 return m_processing_token_channel.compare_exchange_strong(expected, channel);
291 return m_processing_token_channel.load() == channel;
294 void invalidate_float_frame_cache(uint32_t slot_index = 0);
300 const std::vector<DataVariant>&
get_data()
override {
return m_data; }
302 DataAccess channel_data(
size_t channel)
override;
303 std::vector<DataAccess> all_channel_data()
override;
315 [[nodiscard]] uint32_t
get_width()
const {
return m_width; }
316 [[nodiscard]] uint32_t
get_height()
const {
return m_height; }
329 [[nodiscard]]
size_t get_frame_element_count()
const;
336 [[nodiscard]] std::span<const uint8_t> get_frame_pixels(uint64_t frame_index)
const;
344 [[nodiscard]]
size_t get_frame_byte_size()
const;
347 void setup_dimensions();
350 uint32_t m_width = 0;
351 uint32_t m_height = 0;
352 uint32_t m_channels = 4;
355 double m_frame_rate = 0.0;
356 uint64_t m_num_frames = 0;
367 std::atomic<ProcessingState> m_processing_state { ProcessingState::IDLE };
368 std::atomic<int> m_processing_token_channel { -1 };
376 std::atomic<uint64_t> m_read_position { 0 };
377 bool m_looping_enabled {};
380 std::atomic<uint32_t> m_registered_readers { 0 };
381 std::atomic<uint32_t> m_consumed_readers { 0 };
387 uint32_t m_ring_capacity { 0 };
388 uint64_t m_total_source_frames { 0 };
392 static constexpr uint32_t READY_QUEUE_CAPACITY = 256;
400 std::atomic<uint64_t> m_cache_head { 0 };
407 uint32_t m_refill_threshold { 0 };
410 uint64_t m_io_reader_id { 0 };
412 [[nodiscard]] uint32_t
slot_for(uint64_t frame_index)
const
414 return static_cast<uint32_t
>(frame_index % m_ring_capacity);
419 return get_frame_typed(frame_index);
422 void get_frames_impl(
425 uint64_t start_frame,
427 const std::type_info&
type)
const override;
429 void get_value_impl(
const std::vector<uint64_t>& coords,
430 void* out,
const std::type_info&
type)
const override;
432 void set_value_impl(
const std::vector<uint64_t>& coords,
433 const void* in,
const std::type_info&
type)
override;
436 [[nodiscard]]
DataSpanVariant get_frame_typed(uint64_t frame_index)
const;
438 template <
typename T>
439 void get_frames_typed_as(std::span<T>
output, uint64_t start_frame, uint64_t num_frames)
const;
447 [[nodiscard]] std::optional<DataDimension::ValueRange> component_range()
const;
454 void reset_float_frame_cache();