16 template <
typename... Vecs>
18 using type = std::variant<std::span<const typename Vecs::value_type>...>;
62 std::vector<uint16_t>,
63 std::vector<uint32_t>,
64 std::vector<std::complex<float>>,
65 std::vector<std::complex<double>>,
66 std::vector<glm::vec2>,
67 std::vector<glm::vec3>,
68 std::vector<glm::vec4>,
69 std::vector<glm::mat4>
279 DataDimension(std::string n, uint64_t s, uint64_t st = 1,
Role r = Role::CUSTOM);
328 static DataDimension spatial(uint64_t
size,
char axis, uint64_t stride = 1, std::string
name =
"spatial");
362 static DataDimension grouped(std::string
name, uint64_t element_count, uint8_t components_per_element,
Role role = Role::CUSTOM);
370 DataDimension& with_range(
double min,
double max, std::optional<double> invalid = std::nullopt);
400 using DataModule = std::pair<std::vector<DataVariant>, std::vector<DataDimension>>;
412 template <
typename T>
415 const std::vector<uint64_t>& shape,
416 T default_value = T {},
420 auto dims = create_dimensions(modality, shape, layout);
421 auto variants = create_variants(modality, shape, default_value, strategy);
423 return { std::move(variants), std::move(dims) };
433 static std::vector<DataDimension> create_dimensions(
434 DataModality modality,
435 const std::vector<uint64_t>& shape,
436 MemoryLayout layout = MemoryLayout::ROW_MAJOR);
445 template <
typename T>
448 return create_for_modality(DataModality::AUDIO_1D, { samples }, default_value);
459 template <
typename T>
462 return create_for_modality(DataModality::AUDIO_MULTICHANNEL, { samples,
channels }, default_value);
473 template <
typename T>
476 return create_for_modality(DataModality::IMAGE_2D, {
height,
width }, default_value);
487 template <
typename T>
490 return create_for_modality(DataModality::SPECTRAL_2D, { time_windows, frequency_bins }, default_value);
499 static std::vector<uint64_t> calculate_strides(
500 const std::vector<uint64_t>& shape,
501 MemoryLayout layout);
513 template <
typename T>
516 const std::vector<uint64_t>& shape,
520 std::vector<DataVariant> variants;
522 if (org == OrganizationStrategy::INTERLEAVED) {
523 uint64_t
total = std::accumulate(shape.begin(), shape.end(), uint64_t(1), std::multiplies<>());
524 variants.emplace_back(std::vector<T>(
total, default_value));
529 case DataModality::AUDIO_1D:
530 variants.emplace_back(std::vector<T>(shape[0], default_value));
533 case DataModality::AUDIO_MULTICHANNEL: {
534 uint64_t samples = shape[0];
537 for (uint64_t ch = 0; ch <
channels; ++ch) {
538 variants.emplace_back(std::vector<T>(samples, default_value));
543 case DataModality::IMAGE_2D:
544 variants.emplace_back(std::vector<T>(shape[0] * shape[1], default_value));
547 case DataModality::IMAGE_COLOR: {
548 uint64_t
height = shape[0];
549 uint64_t
width = shape[1];
553 for (uint64_t ch = 0; ch <
channels; ++ch) {
554 variants.emplace_back(std::vector<T>(
pixels, default_value));
559 case DataModality::DEPTH_MAP: {
560 uint64_t
pixels = shape[0] * shape[1];
561 uint64_t components = shape[2];
562 variants.reserve(components);
563 for (uint64_t c = 0; c < components; ++c) {
564 variants.emplace_back(std::vector<T>(
pixels, default_value));
569 case DataModality::SPECTRAL_2D:
570 variants.emplace_back(std::vector<T>(shape[0] * shape[1], default_value));
573 case DataModality::VOLUMETRIC_3D:
574 variants.emplace_back(std::vector<T>(shape[0] * shape[1] * shape[2], default_value));
577 case DataModality::VIDEO_GRAYSCALE: {
578 uint64_t frames = shape[0];
579 uint64_t
height = shape[1];
580 uint64_t
width = shape[2];
582 variants.reserve(frames);
583 for (uint64_t f = 0; f < frames; ++f) {
584 variants.emplace_back(std::vector<T>(frame_size, default_value));
589 case DataModality::VIDEO_COLOR: {
590 uint64_t frames = shape[0];
591 uint64_t
height = shape[1];
592 uint64_t
width = shape[2];
595 variants.reserve(frames *
channels);
596 for (uint64_t f = 0; f < frames; ++f) {
597 for (uint64_t ch = 0; ch <
channels; ++ch) {
598 variants.emplace_back(std::vector<T>(frame_size, default_value));
604 case DataModality::VIDEO_DEPTH: {
605 uint64_t frames = shape[0];
606 uint64_t
pixels = shape[1] * shape[2];
607 uint64_t components = shape[3];
608 variants.reserve(components);
609 for (uint64_t c = 0; c < components; ++c) {
610 variants.emplace_back(std::vector<T>(frames *
pixels, default_value));
616 uint64_t
total = std::accumulate(shape.begin(), shape.end(), uint64_t(1), std::multiplies<>());
617 variants.emplace_back(std::vector<T>(
total, default_value));
671 return std::visit([](
const auto& s) {
return s.empty(); },
m_span);
675 [[nodiscard]]
size_t size()
const
677 return std::visit([](
const auto& s) {
return s.size(); },
m_span);
694 return std::visit([](
const auto& s) {
695 return std::type_index(
typeid(
typename std::decay_t<
decltype(s)>::value_type));
723 template <DataVariantElement T>
724 [[nodiscard]] std::span<const T>
as()
const
726 const auto* s = std::get_if<std::span<const T>>(&
m_span);
727 return s ? *s : std::span<const T> {};
const std::vector< float > * pixels
FrameView()=default
Construct an empty FrameView.
const DataSpanVariant & raw() const
Direct access to the underlying DataSpanVariant for internal use.
std::span< const T > as() const
Return a typed span over the frame data without conversion.
size_t size() const
Number of elements in the frame, in units of the native element type.
std::type_index element_type() const
Runtime query for the native element type of this frame.
FrameView(DataSpanVariant span)
Construct from a DataSpanVariant produced by get_frame_span_impl().
bool empty() const
Returns true if the view holds no elements.
Zero-copy typed view over one frame of container storage.
Concept to constrain types to valid DataVariant elements.
typename detail::span_const_from_vector_variant< DataVariant >::type DataSpanVariant
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.
DataModality
Data modality types for cross-modal analysis.
@ DEPTH_MAP
[height, width, components] - range/disparity image
@ AUDIO_MULTICHANNEL
Multi-channel audio.
@ SPECTRAL_2D
2D spectral data (time + frequency)
@ AUDIO_1D
1D audio signal
@ VIDEO_DEPTH
[frames, height, width, components] - streaming range data
@ UNKNOWN
Unknown or undefined modality.
@ IMAGE_COLOR_ARRAY
4D (idx + 2D + color)
@ VERTICES_3D
3D vertex data (positions, normals, etc.)
@ SCALAR_F32
Single-channel float data.
@ VOLUMETRIC_3D
3D volumetric data
@ VIDEO_GRAYSCALE
3D video (time + 2D grayscale)
@ VIDEO_COLOR
4D video (time + 2D + color)
@ TENSOR_ND
N-dimensional tensor.
@ TEXTURE_2D
2D texture data
@ IMAGE_COLOR
2D RGB/RGBA image
@ IMAGE_2D
2D image (grayscale or single channel)
MemoryLayout
Memory layout for multi-dimensional data.
@ ROW_MAJOR
C/C++ style (last dimension varies fastest)
@ COLUMN_MAJOR
Fortran/MATLAB style (first dimension varies fastest)
OrganizationStrategy
Data organization strategy for multi-channel/multi-frame data.
@ HYBRID
Mixed approach based on access patterns.
@ USER_DEFINED
Custom organization.
@ PLANAR
Separate DataVariant per logical unit (LLL...RRR for stereo)
@ INTERLEAVED
Single DataVariant with interleaved data (LRLRLR for stereo)
std::string_view modality_to_string(DataModality modality)
Convert DataModality enum to string representation.
bool is_structured_modality(DataModality modality)
Check if a modality represents structured data (vectors, matrices).
ComponentGroup(uint8_t c, uint8_t o=0)
Grouping information for sub-dimensions.
std::optional< double > invalid
Numeric interpretation of the values along this dimension.
static DataModule create_audio_multichannel(uint64_t samples, uint64_t channels, T default_value=T {})
Create multi-channel audio data module.
std::optional< ValueRange > value_range
Role
Semantic role of the dimension.
static DataModule create_spectral_2d(uint64_t time_windows, uint64_t frequency_bins, T default_value=T {})
Create 2D spectral data module.
std::string name
Human-readable identifier for the dimension.
static DataModule create_audio_1d(uint64_t samples, T default_value=T {})
Create 1D audio data module.
static DataModule create_image_2d(uint64_t height, uint64_t width, T default_value=T {})
Create 2D image data module.
std::pair< std::vector< DataVariant >, std::vector< DataDimension > > DataModule
Data container combining variants and dimensions.
static std::vector< DataVariant > create_variants(DataModality modality, const std::vector< uint64_t > &shape, T default_value, OrganizationStrategy org=OrganizationStrategy::PLANAR)
Create data variants for a specific modality.
static DataModule create_for_modality(DataModality modality, const std::vector< uint64_t > &shape, T default_value=T {}, MemoryLayout layout=MemoryLayout::ROW_MAJOR, OrganizationStrategy strategy=OrganizationStrategy::PLANAR)
Create data module for a specific modality.
std::optional< ComponentGroup > grouping
Minimal dimension descriptor focusing on structure only.
std::variant< std::span< const typename Vecs::value_type >... > type
Type traits to determine if a type is a valid DataVariant element.