shithub: openh264

ref: 4d674231706f0b2b335608e8cb2b93e1586372d6
dir: /processing/src/testbed/wels_process.cpp/

View raw version
/*!
 * \copy
 *     Copyright (c)  2013, Cisco Systems
 *     All rights reserved.
 *
 *     Redistribution and use in source and binary forms, with or without
 *     modification, are permitted provided that the following conditions
 *     are met:
 *
 *        * Redistributions of source code must retain the above copyright
 *          notice, this list of conditions and the following disclaimer.
 *
 *        * Redistributions in binary form must reproduce the above copyright
 *          notice, this list of conditions and the following disclaimer in
 *          the documentation and/or other materials provided with the
 *          distribution.
 *
 *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 *     "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 *     LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 *     FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 *     COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 *     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 *     BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 *     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 *     LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 *     ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 *     POSSIBILITY OF SUCH DAMAGE.
 *
 */

#include <windows.h>
#include "wels_process.h"
#include "bundleloader.h"

// entry API declaration
typedef vResult (WELSAPI* pfnCreateVpInterface) (void**, int);
typedef vResult (WELSAPI* pfnDestroyVpInterface) (void*, int);

////////////////////////////////////////////////////////
void* loadlib() {
#if defined(WIN32)
  HMODULE shModule = LoadLibraryA ("WelsVP.dll");
  if (shModule == NULL)
    shModule = LoadLibraryA ("../WelsVP.dll");

#elif defined(MACOS)
  const char WelsVPLib[] = "WelsVP.bundle";
  CFBundleRef shModule = LoadBundle (WelsVPLib);

#elif defined(UNIX)
  const char WelsVPLib[] = "WelsVP.so";
  void* shModule = dlopen (WelsVPLib, RTLD_LAZY);
#endif

  return (void*)shModule;
}

void freelib (void* lib) {
  if (lib) {
#ifdef WIN32
    HMODULE shModule = (HMODULE)lib;
    FreeLibrary (shModule);

#elif defined(MACOS)
    CFBundleRef shModule = (CFBundleRef)lib;
    FreeBundle (shModule);

#elif defined(UNIX)
    void* shModule = lib;
    dlclose (shModule);
#endif
  }
}

void* queryfunc (void* lib, const char* name) {
  void* pFunc = NULL;
#ifdef WIN32
  HMODULE shModule = (HMODULE)lib;
  pFunc = (void*)GetProcAddress (shModule, name);
#elif defined(MACOS)
  CFBundleRef shModule = (CFBundleRef)lib;
  pFunc = (void*)GetProcessAddress (shModule, name);
#elif defined(UNIX)
  void* shModule = lib;
  pFunc = (void*)dlsym (shModule, name);
#endif

  return pFunc;
}

IWelsVpPlugin::IWelsVpPlugin (int& ret)
  : flag (0)
  , ivp (NULL)
  , hlib (NULL) {
  pfnCreateVpInterface  pCreateVpInterface  = NULL;
  pfnDestroyVpInterface pDestroyVpInterface = NULL;
  iface[0] = iface[1] = NULL;

  hlib  = loadlib();
  if (!hlib)
    goto exit;

  pCreateVpInterface  = (pfnCreateVpInterface)  queryfunc (hlib, ("CreateVpInterface"));
  pDestroyVpInterface = (pfnDestroyVpInterface) queryfunc (hlib, ("DestroyVpInterface"));
  if (!pCreateVpInterface || !pDestroyVpInterface)
    goto exit;

  iface[0] = (void*) pCreateVpInterface;
  iface[1] = (void*) pDestroyVpInterface;
  pCreateVpInterface ((void**)&ivp, WELSVP_INTERFACE_VERION);
  if (!iface)
    goto exit;

  ret = 0;
  return;

exit:
  ret = 1;
}

IWelsVpPlugin::~IWelsVpPlugin() {
  if (hlib) {
    pfnDestroyVpInterface pDestroyVpInterface = (pfnDestroyVpInterface) iface[1];
    if (pDestroyVpInterface)
      pDestroyVpInterface ((void*)ivp, WELSVP_INTERFACE_VERION);

    freelib (hlib);
    hlib = NULL;
  }
}

vResult IWelsVpPlugin::Init (int nType, void* pCfg) {
  vResult ret = vRet_NotSupport;
  if (hlib && nType > 0)
    ret = ivp->Init (nType, pCfg);
  return ret;
}

vResult IWelsVpPlugin::Uninit (int nType) {
  vResult ret = vRet_NotSupport;
  if (hlib && nType > 0)
    ret = ivp->Uninit (nType);
  return ret;
}

vResult IWelsVpPlugin::Flush (int nType) {
  vResult ret = vRet_NotSupport;
  if (hlib && nType > 0)
    ret = ivp->Flush (nType);
  return ret;
}

vResult IWelsVpPlugin::Process (int nType, vPixMap* src, vPixMap* dst) {
  vResult ret = vRet_NotSupport;
  if (hlib && nType > 0)
    ret = ivp->Process (nType, src, dst);
  return ret;
}

vResult IWelsVpPlugin::Get (int nType, void* pParam) {
  vResult ret = vRet_NotSupport;
  if (hlib && nType > 0)
    ret = ivp->Get (nType, pParam);
  return ret;
}

vResult IWelsVpPlugin::Set (int nType, void* pParam) {
  vResult ret = vRet_NotSupport;
  if (hlib && nType > 0)
    ret = ivp->Set (nType, pParam);
  return ret;
}

vResult IWelsVpPlugin::SpecialFeature (int nType, void* pIn, void* pOut) {
  vResult ret = vRet_NotSupport;
  if (hlib && nType > 0)
    ret = ivp->SpecialFeature (nType, pIn, pOut);
  return ret;
}