#include "FFGLPluginSDK.h"
#include <memory.h>
extern CFFGLPluginInfo* g_CurrPluginInfo;
static CFreeFrameGLPlugin* s_pPrototype = NULL;
void *getInfo()
{
return (void *)(g_CurrPluginInfo->GetPluginInfo());
}
DWORD initialise()
{
if (g_CurrPluginInfo==NULL)
return FF_FAIL;
if (s_pPrototype==NULL)
{
FPCREATEINSTANCEGL *pInstantiate = g_CurrPluginInfo->GetFactoryMethod();
DWORD dwRet = pInstantiate(&s_pPrototype);
if ((dwRet == FF_FAIL) || (s_pPrototype == NULL))
return FF_FAIL;
return FF_SUCCESS;
}
return FF_SUCCESS;
}
DWORD deInitialise()
{
if (s_pPrototype != NULL) {
delete s_pPrototype;
s_pPrototype = NULL;
}
return FF_SUCCESS;
}
DWORD getNumParameters()
{
if (s_pPrototype == NULL) {
DWORD dwRet = initialise();
if (dwRet == FF_FAIL) return FF_FAIL;
}
return (DWORD) s_pPrototype->GetNumParams();
}
char* getParameterName(DWORD index)
{
if (s_pPrototype == NULL) {
DWORD dwRet = initialise();
if (dwRet == FF_FAIL) return NULL;
}
return s_pPrototype->GetParamName(index);
}
DWORD getParameterDefault(DWORD index)
{
if (s_pPrototype == NULL) {
DWORD dwRet = initialise();
if (dwRet == FF_FAIL) return FF_FAIL;
}
void* pValue = s_pPrototype->GetParamDefault(index);
if (pValue == NULL) return FF_FAIL;
else {
if( s_pPrototype->GetParamType(index) == FF_TYPE_TEXT ){
return (DWORD)pValue; }else{
DWORD dwRet;
memcpy(&dwRet, pValue, 4);
return dwRet;
}
}
}
DWORD getPluginCaps(DWORD index)
{
int MinInputs = -1;
int MaxInputs = -1;
if (s_pPrototype == NULL) {
DWORD dwRet = initialise();
if (dwRet == FF_FAIL) return FF_FAIL;
}
switch (index) {
case FF_CAP_16BITVIDEO:
return FF_FALSE;
case FF_CAP_24BITVIDEO:
return FF_FALSE;
case FF_CAP_32BITVIDEO:
return FF_FALSE;
case FF_CAP_PROCESSFRAMECOPY:
return FF_FALSE;
case FF_CAP_PROCESSOPENGL:
return FF_TRUE;
case FF_CAP_SETTIME:
if (s_pPrototype->GetTimeSupported())
return FF_TRUE;
else
return FF_FALSE;
case FF_CAP_MINIMUMINPUTFRAMES:
MinInputs = s_pPrototype->GetMinInputs();
if (MinInputs < 0) return FF_FALSE;
return DWORD(MinInputs);
case FF_CAP_MAXIMUMINPUTFRAMES:
MaxInputs = s_pPrototype->GetMaxInputs();
if (MaxInputs < 0) return FF_FALSE;
return DWORD(MaxInputs);
case FF_CAP_COPYORINPLACE:
return FF_FALSE;
default:
return FF_FALSE;
}
return FF_FAIL;
}
void *getExtendedInfo()
{
return (void *)(g_CurrPluginInfo->GetPluginExtendedInfo());
}
DWORD getParameterType(DWORD index)
{
if (s_pPrototype == NULL) {
DWORD dwRet = initialise();
if (dwRet == FF_FAIL) return FF_FAIL;
}
return s_pPrototype->GetParamType(index);
}
DWORD instantiateGL(const FFGLViewportStruct *pGLViewport)
{
if (g_CurrPluginInfo==NULL || pGLViewport==NULL)
return FF_FAIL;
if (s_pPrototype == NULL)
{
DWORD dwRet = initialise();
if ((dwRet == FF_FAIL) || (s_pPrototype == NULL))
return FF_FAIL;
}
FPCREATEINSTANCEGL *pInstantiate = g_CurrPluginInfo->GetFactoryMethod();
CFreeFrameGLPlugin *pInstance = NULL;
DWORD dwRet = pInstantiate(&pInstance);
if ((dwRet == FF_FAIL) || (pInstance == NULL))
return FF_FAIL;
pInstance->m_pPlugin = pInstance;
for (int i = 0; i < s_pPrototype->GetNumParams(); ++i)
{
void* pValue = s_pPrototype->GetParamDefault(DWORD(i));
SetParameterStruct ParamStruct;
ParamStruct.ParameterNumber = DWORD(i);
if( s_pPrototype->GetParamType(DWORD(i)) == FF_TYPE_TEXT )
{
ParamStruct.NewParameterValue = (DWORD)pValue;
}
else
{
memcpy(&ParamStruct.NewParameterValue, pValue, 4);
}
dwRet = pInstance->SetParameter(&ParamStruct);
if (dwRet == FF_FAIL)
{
delete pInstance;
return FF_FAIL;
}
}
if (pInstance->InitGL(pGLViewport)==FF_SUCCESS)
{
return (DWORD)pInstance;
}
pInstance->DeInitGL();
delete pInstance;
return FF_FAIL;
}
DWORD deInstantiateGL(void *instanceID)
{
CFreeFrameGLPlugin *p = (CFreeFrameGLPlugin *)instanceID;
if (p != NULL)
{
p->DeInitGL();
delete p;
return FF_SUCCESS;
}
return FF_FAIL;
}
#ifdef WIN32
plugMainUnion __stdcall plugMain(DWORD functionCode, DWORD inputValue, DWORD instanceID)
#elif TARGET_OS_MAC
plugMainUnion plugMain(DWORD functionCode, DWORD inputValue, DWORD instanceID)
#elif __linux__
plugMainUnion plugMain(DWORD functionCode, DWORD inputValue, DWORD instanceID)
#endif
{
plugMainUnion retval;
CFreeFrameGLPlugin* pPlugObj;
pPlugObj = (CFreeFrameGLPlugin*) instanceID;
switch (functionCode) {
case FF_GETINFO:
retval.PISvalue = (PluginInfoStruct*)getInfo();
break;
case FF_INITIALISE:
retval.ivalue = initialise();
break;
case FF_DEINITIALISE:
retval.ivalue = deInitialise();
break;
case FF_GETNUMPARAMETERS:
retval.ivalue = getNumParameters();
break;
case FF_GETPARAMETERNAME:
retval.svalue = getParameterName(inputValue);
break;
case FF_GETPARAMETERDEFAULT:
retval.ivalue = getParameterDefault(inputValue);
break;
case FF_GETPLUGINCAPS:
retval.ivalue = getPluginCaps(inputValue);
break;
case FF_GETEXTENDEDINFO:
retval.ivalue = (DWORD) getExtendedInfo();
break;
case FF_GETPARAMETERTYPE:
retval.ivalue = getParameterType(inputValue);
break;
case FF_GETPARAMETERDISPLAY:
if (pPlugObj != NULL)
retval.svalue = pPlugObj->GetParameterDisplay(inputValue);
else
retval.svalue = (char*)FF_FAIL;
break;
case FF_SETPARAMETER:
if (pPlugObj != NULL)
retval.ivalue = pPlugObj->SetParameter((const SetParameterStruct*) inputValue);
else
retval.ivalue = FF_FAIL;
break;
case FF_GETPARAMETER:
if (pPlugObj != NULL)
retval.ivalue = pPlugObj->GetParameter(inputValue);
else
retval.ivalue = FF_FAIL;
break;
case FF_INSTANTIATEGL:
retval.ivalue = (DWORD)instantiateGL((const FFGLViewportStruct *)inputValue);
break;
case FF_DEINSTANTIATEGL:
if (pPlugObj != NULL)
retval.ivalue = deInstantiateGL(pPlugObj);
else
retval.ivalue = FF_FAIL;
break;
case FF_GETIPUTSTATUS:
if (pPlugObj != NULL)
retval.ivalue = pPlugObj->GetInputStatus(inputValue);
else
retval.ivalue = FF_FAIL;
break;
case FF_PROCESSOPENGL:
if (pPlugObj != NULL)
{
ProcessOpenGLStruct *pogls = (ProcessOpenGLStruct *)inputValue;
if (pogls!=NULL)
retval.ivalue = pPlugObj->ProcessOpenGL(pogls);
else
retval.ivalue = FF_FAIL;
}
else
retval.ivalue = FF_FAIL;
break;
case FF_SETTIME:
if (pPlugObj != NULL)
{
double *inputTime = (double *)inputValue;
if (inputTime!=NULL)
retval.ivalue = pPlugObj->SetTime(*inputTime);
else
retval.ivalue = FF_FAIL;
}
else
retval.ivalue = FF_FAIL;
break;
case FF_INSTANTIATE:
case FF_DEINSTANTIATE:
case FF_PROCESSFRAME:
case FF_PROCESSFRAMECOPY:
default:
retval.ivalue = FF_FAIL;
break;
}
return retval;
}