MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
PipelineBufferData.cpp
Go to the documentation of this file.
2
7
9
10Kakshya::DataVariant extract_buffer_data(const std::shared_ptr<Buffers::AudioBuffer>& buffer, bool should_process)
11{
12 auto audio_buffer = std::dynamic_pointer_cast<Buffers::AudioBuffer>(buffer);
13 if (audio_buffer) {
14 if (should_process) {
15 audio_buffer->process_default();
16 }
17 const auto& data_span = audio_buffer->get_data();
18 std::vector<double> data_vector(data_span.begin(), data_span.end());
19 return data_vector;
20 }
21
22 return std::vector<double> {};
23}
24
25void write_to_buffer(const std::shared_ptr<Buffers::AudioBuffer>& buffer, const Kakshya::DataVariant& data)
26{
27 auto audio_buffer = std::dynamic_pointer_cast<Buffers::AudioBuffer>(buffer);
28 if (audio_buffer) {
29 try {
30 auto audio_data = std::get<std::vector<double>>(data);
31 auto& buffer_data = audio_buffer->get_data();
32
33 if (buffer_data.size() != audio_data.size()) {
34 buffer_data.resize(audio_data.size());
35 }
36
37 std::ranges::copy(audio_data, buffer_data.begin());
38
39 } catch (const std::bad_variant_access& e) {
40 error_rethrow(Journal::Component::Kriya,
42 std::source_location::current(),
43 "Data type mismatch when writing to audio buffer: {}",
44 e.what());
45 }
46 }
47}
48
49void write_to_container(const std::shared_ptr<Kakshya::DynamicSoundStream>& container, const Kakshya::DataVariant& data, uint32_t channel)
50{
51 try {
52 const auto& audio_data = std::get<std::vector<double>>(data);
53 std::span<const double> data_span(audio_data.data(), audio_data.size());
54
55 container->append_frames(data_span, channel);
56
57 } catch (const std::bad_variant_access& e) {
58 error_rethrow(Journal::Component::Kriya,
60 std::source_location::current(),
61 "Data type mismatch when writing to container: {}",
62 e.what());
63 } catch (const std::exception& e) {
64 error_rethrow(Journal::Component::Kriya,
66 std::source_location::current(),
67 "Error writing to container: {}",
68 e.what());
69 }
70}
71
72Kakshya::DataVariant read_from_container(const std::shared_ptr<Kakshya::DynamicSoundStream>& container,
73 uint64_t,
74 uint32_t length)
75{
76 try {
77 uint32_t read_length = length;
78 if (read_length == 0) {
79 read_length = static_cast<uint32_t>(container->get_total_elements() / container->get_num_channels());
80 }
81
82 std::vector<double> output_data(static_cast<size_t>(read_length * container->get_num_channels()));
83 std::span<double> output_span(output_data.data(), output_data.size());
84
85 uint64_t frames_read = container->read_frames(output_span, read_length);
86
87 if (frames_read < output_data.size()) {
88 output_data.resize(frames_read);
89 }
90
91 return output_data;
92
93 } catch (const std::exception& e) {
94 error_rethrow(Journal::Component::Kriya,
96 std::source_location::current(),
97 "Error reading from container: {}",
98 e.what());
99
100 return std::vector<double> {};
101 }
102}
103
104void write_to_container(const std::shared_ptr<Kakshya::DynamicVideoStream>& container, const Kakshya::DataVariant& data)
105{
106 try {
107 const auto& pixels = std::get<std::vector<uint8_t>>(data);
108 const size_t frame_bytes = container->get_frame_byte_size();
109
110 if (frame_bytes == 0 || pixels.size() % frame_bytes != 0) {
111 error<std::invalid_argument>(Journal::Component::Kriya,
113 std::source_location::current(),
114 "Pixel data of {} bytes is not a whole number of {} byte frames",
115 pixels.size(), frame_bytes);
116 }
117
118 for (size_t offset = 0; offset < pixels.size(); offset += frame_bytes) {
119 container->append_frame(std::span<const uint8_t>(pixels.data() + offset, frame_bytes));
120 }
121
122 } catch (const std::bad_variant_access& e) {
123 error_rethrow(Journal::Component::Kriya,
125 std::source_location::current(),
126 "Data type mismatch when writing to video container: {}",
127 e.what());
128 } catch (const std::exception& e) {
129 error_rethrow(Journal::Component::Kriya,
131 std::source_location::current(),
132 "Error writing to video container: {}",
133 e.what());
134 }
135}
136
137Kakshya::DataVariant read_from_container(const std::shared_ptr<Kakshya::VideoStreamContainer>& container,
138 uint64_t start,
139 uint32_t length)
140{
141 std::vector<uint8_t> output;
142
143 const uint64_t total = container->get_total_source_frames();
144 const uint64_t end = length == 0 ? total : std::min<uint64_t>(total, start + length);
145
146 for (uint64_t frame = start; frame < end && container->is_frame_available(frame); ++frame) {
147 const auto pixels = container->get_frame_pixels(frame);
148 output.insert(output.end(), pixels.begin(), pixels.end());
149 }
150
151 return output;
152}
153
154}
uint64_t length
Definition Composite.cpp:11
uint64_t offset
Definition Composite.cpp:10
const std::vector< float > * pixels
Definition Decoder.cpp:48
std::shared_ptr< NetworkGeometryBuffer > buffer
uint32_t total
@ CoroutineScheduling
Coroutine scheduling and temporal coordination (Vruta::TaskScheduler)
@ Kriya
Automatable tasks and fluent scheduling api for Nodes and Buffers.
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:70
Kakshya::DataVariant read_from_container(const std::shared_ptr< Kakshya::DynamicSoundStream > &container, uint64_t, uint32_t length)
void write_to_buffer(const std::shared_ptr< Buffers::AudioBuffer > &buffer, const Kakshya::DataVariant &data)
Kakshya::DataVariant extract_buffer_data(const std::shared_ptr< Buffers::AudioBuffer > &buffer, bool should_process)
void write_to_container(const std::shared_ptr< Kakshya::DynamicSoundStream > &container, const Kakshya::DataVariant &data, uint32_t channel)