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

◆ process()

void FrameAccessProcessor::process ( const std::shared_ptr< SignalSourceContainer > &  container)
overridevirtual

Extract the current frame(s) into the container's processed_data.

Builds a Region spanning [m_current_frame .. m_current_frame + m_frames_per_batch) across the full spatial extent, delegates to get_region_data(), and copies the result into processed_data as a single interleaved DataVariant. Advances the frame cursor if auto-advance is enabled.

Parameters
containerThe SignalSourceContainer to process.

Implements MayaFlux::Kakshya::DataProcessor.

Definition at line 129 of file FrameAccessProcessor.cpp.

130{
131 if (!m_prepared) {
133 "FrameAccessProcessor not prepared for processing");
134 return;
135 }
136
137 auto source_container = m_source_container_weak.lock();
138 if (!source_container || source_container.get() != container.get()) {
140 "FrameAccessProcessor: source container mismatch or expired");
141 return;
142 }
143
144 m_is_processing = true;
145 m_last_process_time = std::chrono::steady_clock::now();
146
147 try {
148 uint64_t frames_to_extract = std::min(m_frames_per_batch,
150
151 if (frames_to_extract == 0 && m_looping_enabled && m_total_frames > 0) {
152 m_current_frame = 0;
153 if (!m_loop_region.start_coordinates.empty()) {
155 }
156 frames_to_extract = std::min(m_frames_per_batch, m_total_frames - m_current_frame);
157 }
158
159 if (frames_to_extract == 0) {
160 m_is_processing = false;
161 return;
162 }
163
164 auto video_container = std::dynamic_pointer_cast<VideoStreamContainer>(source_container);
165 if (!video_container) {
167 "FrameAccessProcessor: container is not a VideoStreamContainer");
168 m_is_processing = false;
169 return;
170 }
171
172 const uint64_t byte_count = frames_to_extract * m_frame_byte_size;
173
174 auto& processed_data_vector = container->get_processed_data();
175 processed_data_vector.resize(1);
176
177 auto* dest = std::get_if<std::vector<uint8_t>>(&processed_data_vector[0]);
178 if (!dest) {
179 processed_data_vector[0] = std::vector<uint8_t>();
180 dest = std::get_if<std::vector<uint8_t>>(&processed_data_vector[0]);
181 }
182 dest->resize(byte_count);
183
184 uint8_t* write_ptr = dest->data();
185 bool all_ok = true;
186
187 for (uint64_t i = 0; i < frames_to_extract; ++i) {
188 auto pixels = video_container->get_frame_pixels(m_current_frame + i);
189 if (pixels.empty()) {
190 std::memset(write_ptr, 0, m_frame_byte_size);
191 all_ok = false;
192 } else {
193 std::memcpy(write_ptr, pixels.data(), m_frame_byte_size);
194 }
195 write_ptr += m_frame_byte_size;
196 }
197
198 if (!all_ok) {
200 "FrameAccessProcessor: one or more frames unavailable at frame {}",
202 }
203
204 if (m_auto_advance) {
205 if (!all_ok) {
207 "FrameAccessProcessor: auto-advance enabled but frame data was incomplete. Waiting for next process call without advancing frame.");
208 }
209 if (m_frame_rate > 0.0) {
211 auto frames_to_advance = static_cast<uint64_t>(m_frame_accumulator);
212 if (frames_to_advance > 0) {
213 m_frame_accumulator -= static_cast<double>(frames_to_advance);
214 advance_frame(frames_to_advance);
215 }
216 } else {
217 advance_frame(frames_to_extract);
218 }
219 }
220
221 } catch (const std::exception& e) {
223 "FrameAccessProcessor::process failed: {}", e.what());
224 }
225
226 m_is_processing = false;
227}
#define MF_RT_ERROR(comp, ctx,...)
std::chrono::steady_clock::time_point m_last_process_time
void advance_frame(uint64_t frames_to_advance)
Advance the frame cursor, respecting loop boundaries.
std::weak_ptr< SignalSourceContainer > m_source_container_weak
double m_frame_accumulator
Sub-frame accumulator for wall-clock-driven advancement.
double m_frame_rate
Cached video frame rate in frames per second.
@ ContainerProcessing
Container operations (Kakshya - file/stream/region processing)
@ Kakshya
Containers[Signalsource, Stream, File], Regions, DataProcessors.
std::vector< uint64_t > start_coordinates
Starting frame index (inclusive)
Definition Region.hpp:69

References advance_frame(), MayaFlux::Journal::ContainerProcessing, MayaFlux::Journal::Kakshya, m_auto_advance, m_current_frame, m_frame_accumulator, m_frame_byte_size, m_frame_rate, m_frames_per_batch, m_global_fps, m_is_processing, m_last_process_time, m_loop_region, m_looping_enabled, m_prepared, m_source_container_weak, m_total_frames, MF_RT_ERROR, and MayaFlux::Kakshya::Region::start_coordinates.

+ Here is the call graph for this function: