14 : m_sequence(
std::move(sequence))
15 , m_force_cpu(force_cpu)
18 m_executor = std::make_unique<Yantra::VisionGpuExecutor>();
26 const bool valid = std::dynamic_pointer_cast<VideoStreamContainer>(container)
27 || std::dynamic_pointer_cast<WindowContainer>(container)
28 || std::dynamic_pointer_cast<TextureContainer>(container);
31 error<std::invalid_argument>(
34 std::source_location::current(),
35 "VisionProcessor requires a VideoStreamContainer, WindowContainer, "
36 "or TextureContainer; got {}",
37 typeid(*container).name());
40 const auto& structure = container->get_structure();
41 m_width =
static_cast<uint32_t
>(structure.get_width());
42 m_height =
static_cast<uint32_t
>(structure.get_height());
48 m_executor = std::make_unique<Yantra::VisionGpuExecutor>();
57 "VisionProcessor attached to container with zero spatial dimensions");
83 std::span<const float> frame;
84 if (
auto vc = std::dynamic_pointer_cast<VideoStreamContainer>(container)) {
85 frame = vc->processed_frame_as_float(0);
86 vc->invalidate_float_frame_cache(0);
87 }
else if (
auto wc = std::dynamic_pointer_cast<WindowContainer>(container)) {
88 frame = wc->processed_frame_as_float(0);
89 wc->invalidate_float_frame_cache(0);
90 }
else if (
auto tc = std::dynamic_pointer_cast<TextureContainer>(container)) {
91 frame = tc->as_normalised_float(0);
96 const void* raw = container->get_raw_data();
119 m_result_source = std::make_shared<Vruta::BroadcastSource<Kinesis::Vision::VisionResult>>();
#define MF_INFO(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
std::shared_ptr< Buffers::VKBuffer > m_upload_staging
Kinesis::Vision::VisionExecutor m_cpu_executor
std::shared_ptr< Vruta::BroadcastSource< Kinesis::Vision::VisionResult > > m_result_source
void on_attach(const std::shared_ptr< SignalSourceContainer > &container) override
Cache frame geometry from get_structure().
Kinesis::Vision::VisionSequence m_sequence
std::unique_ptr< Yantra::VisionGpuExecutor > m_executor
std::atomic< bool > m_is_processing
std::shared_ptr< Core::VKImage > m_gpu_frame
void on_detach(const std::shared_ptr< SignalSourceContainer > &container) override
Clear cached geometry and reset executor state.
void set_sequence(Kinesis::Vision::VisionSequence sequence)
Replace the pipeline and reset inter-frame executor state.
void process(const std::shared_ptr< SignalSourceContainer > &container) override
Execute the VisionSequence on processed_data[0].
VisionProcessor(Kinesis::Vision::VisionSequence sequence, bool force_cpu=false)
Construct with the vision pipeline to execute each process() call.
std::shared_ptr< Vruta::BroadcastSource< Kinesis::Vision::VisionResult > > get_result_source()
Shared BroadcastSource signalled with each VisionResult after a successful process() call.
Kinesis::Vision::VisionResult m_result
void reset()
Clear stored inter-frame state.
VisionResult run(const VisionSequence &sequence, std::span< const float > frame, uint32_t w, uint32_t h)
Execute a VisionSequence on one frame.
static TextureLoom & instance()
std::shared_ptr< VKBuffer > create_image_staging_buffer(size_t size)
Allocate a persistent host-visible staging buffer sized for repeated streaming uploads to an image of...
@ ContainerProcessing
Container operations (Kakshya - file/stream/region processing)
@ Kakshya
Containers[Signalsource, Stream, File], Regions, DataProcessors.
@ RGBA8
Four channel 8-bit.
Ordered sequence of VisionSteps describing a complete vision pipeline.