shithub: openh264

ref: edba95536681d8c589ed6dccc1b88a8499a98d3b
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; 
}