/* Taken from libcamera.org */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace libcamera; typedef struct { uint8_t *imageData; uint32_t size; uint64_t request; } LibcameraOutData; class LibCamera { public: LibCamera(){}; ~LibCamera(){}; int initCamera(int width, int height, PixelFormat format, int buffercount, int rotation); int startCamera(); bool readFrame(LibcameraOutData *frameData); void returnFrameBuffer(LibcameraOutData frameData); void set(ControlList controls); void stopCamera(); void closeCamera(); private: int startCapture(); int queueRequest(Request *request); void requestComplete(Request *request); void processRequest(Request *request); unsigned int cameraIndex_; uint64_t last_; std::unique_ptr cm; std::shared_ptr camera_; bool camera_acquired_ = false; bool camera_started_ = false; std::unique_ptr config_; std::unique_ptr allocator_; std::vector> requests_; // std::map stream_; std::map> mappedBuffers_; std::queue requestQueue; ControlList controls_; std::mutex control_mutex_; std::mutex camera_stop_mutex_; std::mutex free_requests_mutex_; };