MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ transform_regions() [2/2]

template<OperationReadyData DataType, typename TransformFunc >
requires std::invocable<TransformFunc, DataType>
DataType MayaFlux::Yantra::transform_regions ( DataType &  input,
const std::shared_ptr< Kakshya::SignalSourceContainer > &  container,
const std::vector< Kakshya::Region > &  regions,
TransformFunc  transform_func,
std::vector< std::vector< double > > &  working_buffer 
)

Region-selective transformation using container-based extraction (OUT-OF-PLACE)

Template Parameters
DataTypeOperationReadyData type
TransformFuncFunction type for transformation
Parameters
inputInput data - will NOT be modified
containerSignal source container
regionsRegions to transform and place back into copy
transform_funcTransformation function
working_bufferBuffer for operations (will be resized if needed)
Returns
Transformed data

Definition at line 88 of file MatrixHelper.hpp.

93{
94 if (!container) {
95 throw std::invalid_argument("Container is required for region-based transformations");
96 }
97
98 auto [target_data, structure_info] = OperationHelper::setup_operation_buffer(input, working_buffer);
99
100 for (const auto& region : regions) {
101 auto region_data = container->get_region_data(region);
102 auto transformed_region = transform_func(region_data);
103 auto transformed_doubles = OperationHelper::extract_numeric_data(transformed_region);
104
105 auto start_sample = static_cast<uint64_t>(region.start_coordinates[0]);
106 auto end_sample = static_cast<uint64_t>(region.end_coordinates[0]);
107
108 for (size_t channel_idx = 0; channel_idx < target_data.size() && channel_idx < transformed_doubles.size(); ++channel_idx) {
109 auto& target_channel = target_data[channel_idx];
110 const auto& transformed_channel = transformed_doubles[channel_idx];
111
112 if (start_sample < target_channel.size() && end_sample <= target_channel.size()) {
113 auto target_span = target_channel.subspan(start_sample, end_sample - start_sample);
114 auto copy_size = std::min(transformed_channel.size(), target_span.size());
115
116 std::ranges::copy(transformed_channel | std::views::take(copy_size),
117 target_span.begin());
118 }
119 }
120 }
121
122 return OperationHelper::reconstruct_from_double<DataType>(working_buffer, structure_info);
123}

References MayaFlux::Yantra::OperationHelper::extract_numeric_data(), and MayaFlux::Yantra::OperationHelper::setup_operation_buffer().

+ Here is the call graph for this function: