12 error<std::invalid_argument>(
15 std::source_location::current(),
16 "SpatialRegionProcessor: container must not be null");
19 const auto& dims = container->get_structure().dimensions;
20 const bool has_spatial = std::ranges::any_of(dims, [](
const DataDimension& d) {
27 error<std::invalid_argument>(
30 std::source_location::current(),
31 "SpatialRegionProcessor: container must have at least one spatial dimension");
39 "SpatialRegionProcessor attached ({} region(s) across {} group(s))",
41 container->get_all_region_groups().size());
54 const std::shared_ptr<SignalSourceContainer>& container)
58 const auto groups = container->get_all_region_groups();
60 for (
const auto& [group_name, group] : groups) {
61 for (
size_t i = 0; i < group.regions.size(); ++i) {
64 std::ranges::copy(group.attributes,
66 std::ranges::copy(group.regions[i].attributes,
72 org.
segments.emplace_back(group.regions[i]);
88 "SpatialRegionProcessor::process — null container");
92 auto& processed = container->get_processed_data();
94 if (processed.empty()) {
96 "SpatialRegionProcessor: processed_data empty, no readback available");
101 const auto* full_surface = std::get_if<std::vector<uint8_t>>(&processed[0]);
102 if (!full_surface || full_surface->empty()) {
104 "SpatialRegionProcessor: processed_data[0] empty, skipping extraction");
117 const auto& dims = container->get_structure().dimensions;
118 const std::span<const uint8_t> src { full_surface->data(), full_surface->size() };
120 std::vector<DataVariant> extracts;
124 if (org.segments.empty()) {
126 "SpatialRegionProcessor: OrganizedRegion '{}[{}]' has no segments, skipping",
127 org.group_name, org.region_index);
134 extracts.emplace_back(
135 extract_nd_region<uint8_t>(src, org.segments[0].source_region, dims));
137 }
catch (
const std::exception& e) {
139 "SpatialRegionProcessor: extraction failed for '{}[{}]' — {}",
140 org.group_name, org.region_index, e.what());
145 processed = std::move(extracts);
161 "SpatialRegionProcessor: refreshed ({} region(s))",
#define MF_INFO(comp, ctx,...)
#define MF_RT_WARN(comp, ctx,...)
#define MF_RT_ERROR(comp, ctx,...)
#define MF_RT_TRACE(comp, ctx,...)
std::vector< OrganizedRegion > m_organized_regions
std::atomic< bool > m_is_processing
void on_detach(const std::shared_ptr< SignalSourceContainer > &container) override
Detach this processor from its container.
void on_attach(const std::shared_ptr< SignalSourceContainer > &container) override
Attach this processor to a signal source container.
std::weak_ptr< SignalSourceContainer > m_container_weak
void organize_container_data(const std::shared_ptr< SignalSourceContainer > &container) override
Build m_organized_regions from get_all_region_groups().
void process(const std::shared_ptr< SignalSourceContainer > &container) override
Extract all active regions from processed_data[0] in parallel.
void refresh()
Re-sync m_organized_regions from the container's current group map.
void on_attach(const std::shared_ptr< SignalSourceContainer > &container) override
Attach to a spatial container.
void on_detach(const std::shared_ptr< SignalSourceContainer > &container) override
Detach; delegates to RegionProcessorBase::on_detach.
@ ContainerProcessing
Container operations (Kakshya - file/stream/region processing)
@ Kakshya
Containers[Signalsource, Stream, File], Regions, DataProcessors.
@ IDLE
Container is inactive with no data or not ready for processing.
@ PROCESSING
Container is actively being processed.
@ PROCESSED
Container has completed processing and results are available.
@ ACTIVE
Currently being processed.
@ READY
Ready for processing.
@ IDLE
Not being processed.
@ SPATIAL_Y
Spatial Y axis.
@ SPATIAL_Z
Spatial Z axis.
@ SPATIAL_X
Spatial X axis (images, tensors)
Role role
Semantic hint for common operations.
Minimal dimension descriptor focusing on structure only.
std::unordered_map< std::string, std::any > attributes
Extensible metadata.
std::vector< RegionSegment > segments
Audio segments in this region.
A structured audio region with metadata and transition information.