From 25a9a32f8e381f442259b5d95c8c6f29ad806034 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Tue, 5 Mar 2019 13:22:52 +0300 Subject: [PATCH] videoio: plugins, add strict checks --- modules/videoio/src/backend_plugin.cpp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/modules/videoio/src/backend_plugin.cpp b/modules/videoio/src/backend_plugin.cpp index ab6960f398..e1d8f3835b 100644 --- a/modules/videoio/src/backend_plugin.cpp +++ b/modules/videoio/src/backend_plugin.cpp @@ -167,6 +167,14 @@ public: CV_LOG_INFO(NULL, "Video I/O: plugin is incompatible: " << lib->getName()); return; } + if (plugin_api_->api_header.opencv_version_major != CV_VERSION_MAJOR || + plugin_api_->api_header.opencv_version_minor != CV_VERSION_MINOR) + { + CV_LOG_ERROR(NULL, "Video I/O: wrong OpenCV version used by plugin '" << plugin_api_->api_header.api_description << "': " << + cv::format("%d.%d, OpenCV version is '" CV_VERSION "'", plugin_api_->api_header.opencv_version_major, plugin_api_->api_header.opencv_version_minor)) + plugin_api_ = NULL; + return; + } // TODO Preview: add compatibility API/ABI checks CV_LOG_INFO(NULL, "Video I/O: loaded plugin '" << plugin_api_->api_header.api_description << "'"); } @@ -264,8 +272,17 @@ void PluginBackendFactory::loadPlugin() Ptr pluginBackend = makePtr(lib); if (pluginBackend && pluginBackend->plugin_api_) { - backend = pluginBackend; - return; + if (pluginBackend->plugin_api_->captureAPI != id_) + { + CV_LOG_ERROR(NULL, "Video I/O: plugin '" << pluginBackend->plugin_api_->api_header.api_description << + "': unexpected backend ID: " << + pluginBackend->plugin_api_->captureAPI << " vs " << (int)id_ << " (expected)"); + } + else + { + backend = pluginBackend; + return; + } } } catch (...)