videoio: plugins, add strict checks
authorAlexander Alekhin <alexander.alekhin@intel.com>
Tue, 5 Mar 2019 10:22:52 +0000 (13:22 +0300)
committerAlexander Alekhin <alexander.alekhin@intel.com>
Tue, 5 Mar 2019 10:22:52 +0000 (13:22 +0300)
modules/videoio/src/backend_plugin.cpp

index ab6960f..e1d8f38 100644 (file)
@@ -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> pluginBackend = makePtr<PluginBackend>(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 (...)