#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(); void configureStill(int width, int height, PixelFormat format, int buffercount, int rotation); int startCamera(); int resetCamera(int width, int height, PixelFormat format, int buffercount, int rotation); bool readFrame(LibcameraOutData *frameData); void returnFrameBuffer(LibcameraOutData frameData); void set(ControlList controls); void stopCamera(); void closeCamera(); Stream *VideoStream(uint32_t *w, uint32_t *h, uint32_t *stride) const; char * getCameraId(); private: int startCapture(); int queueRequest(Request *request); void requestComplete(Request *request); void processRequest(Request *request); void StreamDimensions(Stream const *stream, uint32_t *w, uint32_t *h, uint32_t *stride) const; 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_; Stream *viewfinder_stream_ = nullptr; std::string cameraId; };