// This file is part of OpenCV project. // It is subject to the license terms in the LICENSE file found in the top-level directory // of this distribution and at http://opencv.org/license.html. #ifndef PLUGIN_CAPTURE_API_HPP #define PLUGIN_CAPTURE_API_HPP #include #include #if !defined(BUILD_PLUGIN) /// increased for backward-compatible changes, e.g. add new function /// Caller API <= Plugin API -> plugin is fully compatible /// Caller API > Plugin API -> plugin is not fully compatible, caller should use extra checks to use plugins with older API #define CAPTURE_API_VERSION 1 /// increased for incompatible changes, e.g. remove function argument /// Caller ABI == Plugin ABI -> plugin is compatible /// Caller ABI > Plugin ABI -> plugin is not compatible, caller should use shim code to use old ABI plugins (caller may know how lower ABI works, so it is possible) /// Caller ABI < Plugin ABI -> plugin can't be used (plugin should provide interface with lower ABI to handle that) #define CAPTURE_ABI_VERSION 1 #else // !defined(BUILD_PLUGIN) #if !defined(CAPTURE_ABI_VERSION) || !defined(CAPTURE_API_VERSION) #error "Plugin must define CAPTURE_ABI_VERSION and CAPTURE_API_VERSION before including plugin_capture_api.hpp" #endif #endif // !defined(BUILD_PLUGIN) #ifdef __cplusplus extern "C" { #endif typedef CvResult (CV_API_CALL *cv_videoio_capture_retrieve_cb_t)(int stream_idx, unsigned const char* data, int step, int width, int height, int type, void* userdata); typedef struct CvPluginCapture_t* CvPluginCapture; struct OpenCV_VideoIO_Capture_Plugin_API_v1_0_api_entries { /** OpenCV capture ID (VideoCaptureAPIs) @note API-ENTRY 1, API-Version == 0 */ int id; /** @brief Open video capture @param filename File name or NULL to use camera_index instead @param camera_index Camera index (used if filename == NULL) @param[out] handle pointer on Capture handle @note API-CALL 2, API-Version == 0 */ CvResult (CV_API_CALL *Capture_open)(const char* filename, int camera_index, CV_OUT CvPluginCapture* handle); /** @brief Release Capture handle @param handle Capture handle @note API-CALL 3, API-Version == 0 */ CvResult (CV_API_CALL *Capture_release)(CvPluginCapture handle); /** @brief Get property value @param handle Capture handle @param prop Property index @param[out] val property value @note API-CALL 4, API-Version == 0 */ CvResult (CV_API_CALL *Capture_getProperty)(CvPluginCapture handle, int prop, CV_OUT double* val); /** @brief Set property value @param handle Capture handle @param prop Property index @param val property value @note API-CALL 5, API-Version == 0 */ CvResult (CV_API_CALL *Capture_setProperty)(CvPluginCapture handle, int prop, double val); /** @brief Grab frame @param handle Capture handle @note API-CALL 6, API-Version == 0 */ CvResult (CV_API_CALL *Capture_grab)(CvPluginCapture handle); /** @brief Retrieve frame @param handle Capture handle @param stream_idx stream index to retrieve (BGR/IR/depth data) @param callback retrieve callback (synchronous) @param userdata callback context data @note API-CALL 7, API-Version == 0 */ CvResult (CV_API_CALL *Capture_retreive)(CvPluginCapture handle, int stream_idx, cv_videoio_capture_retrieve_cb_t callback, void* userdata); }; // OpenCV_VideoIO_Capture_Plugin_API_v1_0_api_entries struct OpenCV_VideoIO_Capture_Plugin_API_v1_1_api_entries { /** @brief Open video capture with parameters @param filename File name or NULL to use camera_index instead @param camera_index Camera index (used if filename == NULL) @param params pointer on 2*n_params array of 'key,value' pairs @param n_params number of passed parameters @param[out] handle pointer on Capture handle @note API-CALL 8, API-Version == 1 */ CvResult (CV_API_CALL *Capture_open_with_params)( const char* filename, int camera_index, int* params, unsigned n_params, CV_OUT CvPluginCapture* handle); }; // OpenCV_VideoIO_Capture_Plugin_API_v1_1_api_entries typedef struct OpenCV_VideoIO_Capture_Plugin_API_v1_0 { OpenCV_API_Header api_header; struct OpenCV_VideoIO_Capture_Plugin_API_v1_0_api_entries v0; } OpenCV_VideoIO_Capture_Plugin_API_v1_0; typedef struct OpenCV_VideoIO_Capture_Plugin_API_v1_1 { OpenCV_API_Header api_header; struct OpenCV_VideoIO_Capture_Plugin_API_v1_0_api_entries v0; struct OpenCV_VideoIO_Capture_Plugin_API_v1_1_api_entries v1; } OpenCV_VideoIO_Capture_Plugin_API_v1_1; #if CAPTURE_ABI_VERSION == 1 && CAPTURE_API_VERSION == 1 typedef struct OpenCV_VideoIO_Capture_Plugin_API_v1_1 OpenCV_VideoIO_Capture_Plugin_API; #elif CAPTURE_ABI_VERSION == 1 && CAPTURE_API_VERSION == 0 typedef struct OpenCV_VideoIO_Capture_Plugin_API_v1_0 OpenCV_VideoIO_Capture_Plugin_API; #else #error "Not supported configuration: check CAPTURE_ABI_VERSION/CAPTURE_API_VERSION" #endif #ifdef BUILD_PLUGIN CV_PLUGIN_EXPORTS const OpenCV_VideoIO_Capture_Plugin_API* CV_API_CALL opencv_videoio_capture_plugin_init_v1 (int requested_abi_version, int requested_api_version, void* reserved /*NULL*/) CV_NOEXCEPT; #else // BUILD_PLUGIN typedef const OpenCV_VideoIO_Capture_Plugin_API* (CV_API_CALL *FN_opencv_videoio_capture_plugin_init_t) (int requested_abi_version, int requested_api_version, void* reserved /*NULL*/); #endif // BUILD_PLUGIN #ifdef __cplusplus } #endif #endif // PLUGIN_CAPTURE_API_HPP