MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
RegionProcessorBase.cpp
Go to the documentation of this file.
3
4namespace MayaFlux::Kakshya {
5
6void RegionProcessorBase::on_attach(std::shared_ptr<SignalSourceContainer> container)
7{
8 if (!container) {
9 throw std::invalid_argument("Container cannot be null");
10 }
11
12 m_container_weak = container;
13 m_structure = container->get_structure();
14
15 m_cache_manager = std::make_unique<RegionCacheManager>(m_max_cache_size);
16 m_cache_manager->initialize();
17
19
20 organize_container_data(container);
21
22 container->mark_ready_for_processing(true);
23}
24
25void RegionProcessorBase::on_detach(std::shared_ptr<SignalSourceContainer> /*container*/)
26{
27 m_container_weak.reset();
28 m_cache_manager.reset();
29 m_organized_regions.clear();
30 m_current_position.clear();
31}
32
33void RegionProcessorBase::cache_region_if_needed(const RegionSegment& segment, const std::shared_ptr<SignalSourceContainer>& container)
34{
36 return;
37
38 if (m_cache_manager->get_cached_segment(segment)) {
39 return;
40 }
41
42 uint64_t segment_size = segment.get_total_elements();
43 if (segment_size <= m_max_cache_size / 10) { // Use max 10% of cache per segment
44 try {
45 RegionCache cache;
46 cache.data = container->get_region_data(segment.source_region);
47 cache.source_region = segment.source_region;
48 cache.load_time = std::chrono::steady_clock::now();
49
50 m_cache_manager->cache_region(cache);
51 } catch (const std::exception& e) {
52 // Silently fail caching - not critical
53 }
54 }
55}
56
57bool RegionProcessorBase::advance_position(std::vector<uint64_t>& position, uint64_t steps, const OrganizedRegion* region)
58{
59 if (position.empty())
60 return false;
61
62 for (auto& pos : position) {
63 pos += steps;
64 }
65
66 if ((region != nullptr) && region->looping_enabled && !region->loop_start.empty() && !region->loop_end.empty()) {
67 for (size_t dim = 0; dim < std::min(position.size(), region->loop_start.size()); ++dim) {
68 if (position[dim] >= region->loop_end[dim]) {
69 position[dim] = region->loop_start[dim] + (position[dim] - region->loop_end[dim]);
70 }
71 }
72 }
73
74 auto frame_count = m_structure.get_frame_count();
75 for (auto& pos : position) {
76 if (pos >= frame_count) {
77 pos = frame_count - 1;
78 return false;
79 }
80 }
81
82 return true;
83}
84
85void RegionProcessorBase::ensure_output_dimensioning(std::vector<DataVariant>& output_data, const std::vector<uint64_t>& required_shape)
86{
87 if (output_data.size() < required_shape[1]) {
88 output_data.resize(required_shape[1], DataVariant {});
89 }
90
91 for (auto& data : output_data) {
92 std::visit([required_shape](auto& dt) {
93 if (dt.size() < required_shape[0]) {
94 dt.resize(required_shape[0]);
95 }
96 },
97 data);
98 }
99}
100
101}
virtual void cache_region_if_needed(const RegionSegment &segment, const std::shared_ptr< SignalSourceContainer > &container)
Cache a region's data if beneficial and not already cached.
std::unique_ptr< RegionCacheManager > m_cache_manager
virtual void organize_container_data(std::shared_ptr< SignalSourceContainer > container)=0
Organize container data into structured regions.
virtual bool advance_position(std::vector< uint64_t > &position, uint64_t steps=1, const OrganizedRegion *region=nullptr)
Advance position according to memory layout and looping.
virtual void ensure_output_dimensioning(std::vector< DataVariant > &output_data, const std::vector< uint64_t > &required_shape)
Ensure output data is properly dimensioned for region extraction.
void on_detach(std::shared_ptr< SignalSourceContainer > container) override
Detach this processor from its container.
void on_attach(std::shared_ptr< SignalSourceContainer > container) override
Attach this processor to a signal source container.
std::vector< OrganizedRegion > m_organized_regions
std::weak_ptr< SignalSourceContainer > m_container_weak
std::variant< std::vector< double >, std::vector< float >, std::vector< uint8_t >, std::vector< uint16_t >, std::vector< uint32_t >, std::vector< std::complex< float > >, std::vector< std::complex< double > >, std::vector< glm::vec2 >, std::vector< glm::vec3 >, std::vector< glm::vec4 >, std::vector< glm::mat4 > > DataVariant
Multi-type data storage for different precision needs.
Definition NDData.hpp:73
static size_t get_frame_size(const std::vector< DataDimension > &dimensions)
Extract the size of non time dimensions (channel, spatial, frequency)
static size_t get_frame_count(const std::vector< DataDimension > &dimensions)
Extract frame count from video dimensions.
std::vector< uint64_t > loop_start
Loop start coordinates.
std::vector< uint64_t > loop_end
Loop end coordinates.
A structured audio region with metadata and transition information.
Region source_region
Region this cache corresponds to.
std::vector< DataVariant > data
Cached data.
std::chrono::steady_clock::time_point load_time
When cache was loaded.
Stores cached data for a region, with metadata for cache management.
Region source_region
Associated region.
uint64_t get_total_elements() const
Get the total number of elements in the segment.
Represents a discrete segment of audio data with caching capabilities.