Program Listing for File video_feed_provider.hpp#

Return to documentation for file (src/video/video_feed_provider.hpp)

#pragma once
#include <QImage>
#include <QQuickImageProvider>
#include <QReadWriteLock>
#include <vector>

namespace mosaic {

// Provides per-camera BGR preview frames to QML via the "videofeed" image provider.
// Thread-safe: update_frame() is called from the main thread after a queued
// signal hop from the grabber thread.
//
// QML usage:
//   Image { cache: false; source: "image://videofeed/" + cameraIndex + "?v=" + backend.frameGen }
//   Changing the ?v= query string forces a re-request even for the same index.
class VideoFeedProvider : public QQuickImageProvider {
   public:
    VideoFeedProvider();

    // Called by the image loader thread — must be thread-safe.
    QImage requestImage(const QString& id, QSize* size, const QSize& requestedSize) override;

    // Called from the main thread when a new preview frame arrives.
    void update_frame(int cameraIndex, const QImage& img);

    // Pre-allocate slots so requestImage never returns an index-out-of-range image.
    void set_camera_count(int count);

   private:
    mutable QReadWriteLock m_lock;
    std::vector<QImage> m_frames;
};

} // namespace mosaic