core(libva): use dynamic loader
This commit is contained in:
@@ -33,6 +33,17 @@ using namespace cv;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_VA
|
||||
#ifndef OPENCV_LIBVA_LINK
|
||||
#include "va_wrapper.impl.hpp"
|
||||
#else
|
||||
namespace cv { namespace detail {
|
||||
static void init_libva() { /* nothing */ }
|
||||
}} // namespace
|
||||
#endif
|
||||
using namespace cv::detail;
|
||||
#endif
|
||||
|
||||
namespace cv { namespace va_intel {
|
||||
|
||||
#ifdef HAVE_VA_INTEL
|
||||
@@ -54,6 +65,8 @@ Context& initializeContextFromVA(VADisplay display, bool tryInterop)
|
||||
#if !defined(HAVE_VA)
|
||||
NO_VA_SUPPORT_ERROR;
|
||||
#else // !HAVE_VA
|
||||
init_libva();
|
||||
|
||||
# ifdef HAVE_VA_INTEL
|
||||
contextInitialized = false;
|
||||
if (tryInterop)
|
||||
@@ -507,6 +520,8 @@ void convertToVASurface(VADisplay display, InputArray src, VASurfaceID surface,
|
||||
#if !defined(HAVE_VA)
|
||||
NO_VA_SUPPORT_ERROR;
|
||||
#else // !HAVE_VA
|
||||
init_libva();
|
||||
|
||||
const int stype = CV_8UC3;
|
||||
|
||||
int srcType = src.type();
|
||||
@@ -611,6 +626,8 @@ void convertFromVASurface(VADisplay display, VASurfaceID surface, Size size, Out
|
||||
#if !defined(HAVE_VA)
|
||||
NO_VA_SUPPORT_ERROR;
|
||||
#else // !HAVE_VA
|
||||
init_libva();
|
||||
|
||||
const int dtype = CV_8UC3;
|
||||
|
||||
// TODO Need to specify ACCESS_WRITE here somehow to prevent useless data copying!
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
// 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.
|
||||
|
||||
//
|
||||
// Not a standalone header, part of va_intel.cpp
|
||||
//
|
||||
|
||||
#include "opencv2/core/utils/plugin_loader.private.hpp" // DynamicLib
|
||||
|
||||
namespace cv { namespace detail {
|
||||
|
||||
typedef VAStatus (*FN_vaDeriveImage)(VADisplay dpy, VASurfaceID surface, VAImage *image);
|
||||
typedef VAStatus (*FN_vaDestroyImage)(VADisplay dpy, VAImageID image);
|
||||
typedef VAStatus (*FN_vaMapBuffer)(VADisplay dpy, VABufferID buf_id, void **pbuf);
|
||||
typedef VAStatus (*FN_vaSyncSurface)(VADisplay dpy, VASurfaceID render_target);
|
||||
typedef VAStatus (*FN_vaUnmapBuffer)(VADisplay dpy, VABufferID buf_id);
|
||||
|
||||
static FN_vaDeriveImage fn_vaDeriveImage = NULL;
|
||||
static FN_vaDestroyImage fn_vaDestroyImage = NULL;
|
||||
static FN_vaMapBuffer fn_vaMapBuffer = NULL;
|
||||
static FN_vaSyncSurface fn_vaSyncSurface = NULL;
|
||||
static FN_vaUnmapBuffer fn_vaUnmapBuffer = NULL;
|
||||
|
||||
#define vaDeriveImage fn_vaDeriveImage
|
||||
#define vaDestroyImage fn_vaDestroyImage
|
||||
#define vaMapBuffer fn_vaMapBuffer
|
||||
#define vaSyncSurface fn_vaSyncSurface
|
||||
#define vaUnmapBuffer fn_vaUnmapBuffer
|
||||
|
||||
|
||||
static std::shared_ptr<cv::plugin::impl::DynamicLib> loadLibVA()
|
||||
{
|
||||
std::shared_ptr<cv::plugin::impl::DynamicLib> lib;
|
||||
const char* envPath = getenv("OPENCV_LIBVA_RUNTIME");
|
||||
if (envPath)
|
||||
{
|
||||
lib = std::make_shared<cv::plugin::impl::DynamicLib>(envPath);
|
||||
return lib;
|
||||
}
|
||||
static const char* const candidates[] = {
|
||||
"libva.so",
|
||||
"libva.so.2",
|
||||
"libva.so.1",
|
||||
};
|
||||
for (int i = 0; i < 3; ++i)
|
||||
{
|
||||
lib = std::make_shared<cv::plugin::impl::DynamicLib>(candidates[i]);
|
||||
if (lib->isLoaded())
|
||||
break;
|
||||
}
|
||||
return lib;
|
||||
}
|
||||
static void init_libva()
|
||||
{
|
||||
static bool initialized = false;
|
||||
static auto library = loadLibVA();
|
||||
if (!initialized)
|
||||
{
|
||||
if (!library || !library->isLoaded())
|
||||
{
|
||||
library.reset();
|
||||
CV_Error(cv::Error::StsBadFunc, "OpenCV can't load VA library (libva)");
|
||||
}
|
||||
auto& lib = *library.get();
|
||||
#define VA_LOAD_SYMBOL(name) fn_ ## name = reinterpret_cast<FN_ ## name>(lib.getSymbol(#name)); \
|
||||
if (!fn_ ## name) \
|
||||
{ \
|
||||
library.reset(); \
|
||||
initialized = true; \
|
||||
CV_Error_(cv::Error::StsBadFunc, ("OpenCV can't load VA library (libva), missing symbol: %s", #name)); \
|
||||
}
|
||||
|
||||
VA_LOAD_SYMBOL(vaDeriveImage);
|
||||
VA_LOAD_SYMBOL(vaDestroyImage);
|
||||
VA_LOAD_SYMBOL(vaMapBuffer);
|
||||
VA_LOAD_SYMBOL(vaSyncSurface);
|
||||
VA_LOAD_SYMBOL(vaUnmapBuffer);
|
||||
initialized = true;
|
||||
}
|
||||
if (!library)
|
||||
CV_Error(cv::Error::StsBadFunc, "OpenCV can't load/initialize VA library (libva)");
|
||||
}
|
||||
|
||||
}} // namespace
|
||||
Reference in New Issue
Block a user