26 container->mark_ready_for_processing(
true);
32 "FrameAccessProcessor attached: {}×{}×{} frames={}, frame_bytes={}, batch={}",
36 }
catch (
const std::exception& e) {
39 std::source_location::current(),
40 "Failed to attach FrameAccessProcessor: {}",
71 if (
auto stream = std::dynamic_pointer_cast<StreamContainer>(container)) {
75 const auto& stream_positions = stream->get_read_position();
76 if (!stream_positions.empty()) {
81 if (
auto vc = std::dynamic_pointer_cast<VideoStreamContainer>(container))
90 std::source_location::current(),
91 "FrameAccessProcessor requires VIDEO_COLOR or IMAGE_COLOR modality, got {}",
97 std::source_location::current(),
98 "Frame dimensions cannot be zero ({}×{})",
104 std::source_location::current(),
105 "Channel count cannot be zero");
110 "FrameAccessProcessor: container has zero frames");
115 "FrameAccessProcessor: batch size {} exceeds total frames {}, clamping",
121 "FrameAccessProcessor validated: {}×{}×{}, {} total frames, batch {}",
133 "FrameAccessProcessor not prepared for processing");
138 if (!source_container || source_container.get() != container.get()) {
140 "FrameAccessProcessor: source container mismatch or expired");
159 if (frames_to_extract == 0) {
164 auto video_container = std::dynamic_pointer_cast<VideoStreamContainer>(source_container);
165 if (!video_container) {
167 "FrameAccessProcessor: container is not a VideoStreamContainer");
174 auto& processed_data_vector = container->get_processed_data();
175 processed_data_vector.resize(1);
177 auto* dest = std::get_if<std::vector<uint8_t>>(&processed_data_vector[0]);
179 processed_data_vector[0] = std::vector<uint8_t>();
180 dest = std::get_if<std::vector<uint8_t>>(&processed_data_vector[0]);
182 dest->resize(byte_count);
184 uint8_t* write_ptr = dest->data();
187 for (uint64_t i = 0; i < frames_to_extract; ++i) {
189 if (pixels.empty()) {
200 "FrameAccessProcessor: one or more frames unavailable at frame {}",
207 "FrameAccessProcessor: auto-advance enabled but frame data was incomplete. Waiting for next process call without advancing frame.");
212 if (frames_to_advance > 0) {
221 }
catch (
const std::exception& e) {
223 "FrameAccessProcessor::process failed: {}", e.what());
237 "FrameAccessProcessor: batch size cannot be zero, clamping to 1");
253 uint64_t loop_start = 0;
263 if (loop_end > loop_start) {
264 uint64_t loop_length = loop_end - loop_start + 1;
266 new_frame = loop_start + (overflow % loop_length);
268 new_frame = loop_start;
#define MF_INFO(comp, ctx,...)
#define MF_RT_ERROR(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
void set_frames_per_batch(uint64_t count)
Set the number of frames extracted per process() call.
void process(const std::shared_ptr< SignalSourceContainer > &container) override
Extract the current frame(s) into the container's processed_data.
std::chrono::steady_clock::time_point m_last_process_time
void on_detach(const std::shared_ptr< SignalSourceContainer > &container) override
Detach the processor from its container.
void advance_frame(uint64_t frames_to_advance)
Advance the frame cursor, respecting loop boundaries.
uint64_t m_frame_byte_size
std::weak_ptr< SignalSourceContainer > m_source_container_weak
void on_attach(const std::shared_ptr< SignalSourceContainer > &container) override
Attach the processor to a video container.
ContainerDataStructure m_structure
uint64_t m_frames_per_batch
void validate()
Validate that the container is suitable for frame-based processing.
double m_frame_accumulator
Sub-frame accumulator for wall-clock-driven advancement.
double m_frame_rate
Cached video frame rate in frames per second.
std::atomic< bool > m_is_processing
void store_metadata(const std::shared_ptr< SignalSourceContainer > &container)
Cache dimension metadata and frame geometry from the container.
@ ContainerProcessing
Container operations (Kakshya - file/stream/region processing)
@ Kakshya
Containers[Signalsource, Stream, File], Regions, DataProcessors.
@ VIDEO_COLOR
4D video (time + 2D + color)
@ IMAGE_COLOR
2D RGB/RGBA image
std::vector< DataDimension > dimensions
uint64_t get_channel_count() const
uint64_t get_height() const
uint64_t get_width() const
size_t get_frame_count() const
std::vector< uint64_t > end_coordinates
Ending frame index (inclusive)
std::vector< uint64_t > start_coordinates
Starting frame index (inclusive)