--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/khronosfws/openmax_al/src/engine/xaengine.c Tue Aug 31 15:43:02 2010 +0300
@@ -0,0 +1,380 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: Engine Implementation
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#include "xaengine.h"
+#include "xaobjectitf.h"
+#include "xaengineitf.h"
+#include "xathreadsyncitf.h"
+#include "xadynintmgmtitf.h"
+#include "xaaudioiodevicecapabilitiesitf.h"
+#include "xaaudioencodercapabilitiesitf.h"
+#include "xaconfigextensionsitf.h"
+#include "xathreadsafety.h"
+#include "xaframeworkmgr.h"
+
+/* Static mapping of enumeration XAEngineInterfaces to interface iids */
+static const XAInterfaceID* xaEngineItfIIDs[ENGINE_ITFCOUNT] =
+ {
+ &XA_IID_OBJECT,
+ &XA_IID_ENGINE,
+ &XA_IID_DYNAMICINTERFACEMANAGEMENT,
+ &XA_IID_THREADSYNC,
+ /* &XA_IID_CONFIGEXTENSION,*/
+ /* &XA_IID_DEVICEVOLUME,*/
+ &XA_IID_AUDIOIODEVICECAPABILITIES,
+ /* &XA_IID_AUDIODECODERCAPABILITIES,*/
+ &XA_IID_AUDIOENCODERCAPABILITIES
+ /*
+ &XA_IID_CAMERACAPABILITIES,
+ &XA_IID_IMAGEDECODERCAPABILITIES,
+ &XA_IID_IMAGEENCODERCAPABILITIES,
+ &XA_IID_VIDEODECODERCAPABILITIES,
+ &XA_IID_VIDEOENCODERCAPABILITIES
+ */
+ };
+
+/*****************************************************************************
+ * Global methods
+ *****************************************************************************/
+
+/* XAResult XAEngineImpl_Create
+ * Description: Create object
+ */
+XAresult XAEngineImpl_Create(XAObjectItf *pEngine, XAuint32 numOptions,
+ const XAEngineOption *pEngineOptions, XAuint32 numInterfaces,
+ const XAInterfaceID *pInterfaceIds,
+ const XAboolean *pInterfaceRequired)
+ {
+ XAEngineImpl* pImpl = NULL;
+ XAObjectItfImpl* pBaseObj = NULL;
+ XAuint32 itfIndex = 0;
+ //XAboolean optEnabled = XA_BOOLEAN_FALSE;
+ XAboolean threadSafeEnabled = XA_BOOLEAN_TRUE;
+ DEBUG_API("->XAEngineImpl_Create");
+
+ if (!pEngine)
+ {
+ DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
+ DEBUG_API("<-XAEngineImpl_Create");
+ /* invalid parameter */
+ return XA_RESULT_PARAMETER_INVALID;
+ }
+
+ /* check engine options */
+ if (pEngineOptions && (numOptions != 0))
+ {
+ int i;
+ for (i = 0; i < numOptions; i++)
+ {
+ if (pEngineOptions[i].feature == XA_ENGINEOPTION_LOSSOFCONTROL)
+ {
+ //XAboolean optEnabled = pEngineOptions[i].data;
+ // TODO: do something with the above value or else remove the code
+ }
+ if (pEngineOptions[i].feature == XA_ENGINEOPTION_THREADSAFE)
+ {
+ threadSafeEnabled = pEngineOptions[i].data;
+ }
+ }
+ }
+
+ /* instantiate object implementation */
+ pImpl = (XAEngineImpl*) calloc(1, sizeof(XAEngineImpl));
+ if (!pImpl)
+ {
+ DEBUG_ERR("XA_RESULT_MEMORY_FAILURE");
+ DEBUG_API("<-XAEngineImpl_Create");
+ /* memory allocation failed */
+ return XA_RESULT_MEMORY_FAILURE;
+ }
+ pBaseObj = &pImpl->baseObj;
+
+ /* Initialize base object default implementation */
+ XAObjectItfImpl_Init(pBaseObj, ENGINE_ITFCOUNT, xaEngineItfIIDs,
+ XAEngineImpl_DoRealize, XAEngineImpl_DoResume,
+ XAEngineImpl_FreeResources);
+
+ /* Mark interfaces that need to be exposed */
+ /* Implicit and mandated interfaces */
+ pBaseObj->interfaceMap[ENGINE_ENGINEITF].required = XA_BOOLEAN_TRUE;
+ pBaseObj->interfaceMap[ENGINE_DIMITF].required = XA_BOOLEAN_TRUE;
+ pBaseObj->interfaceMap[ENGINE_THREADSYNCITF].required = XA_BOOLEAN_TRUE;
+ pBaseObj->interfaceMap[ENGINE_AUDIOIODEVICECAPAITF].required
+ = XA_BOOLEAN_TRUE;
+ pBaseObj->interfaceMap[ENGINE_AUDIOENCODERCAPAITF].required
+ = XA_BOOLEAN_TRUE;
+ /* Explicit interfaces */
+ if ((numInterfaces != 0) && pInterfaceIds && pInterfaceRequired)
+ {
+ /* Check required interfaces */
+ for (itfIndex = 0; itfIndex < numInterfaces; itfIndex++)
+ {
+ /* If mapEntry is null then required interface is not supported.*/
+ XAObjItfMapEntry *entry = XAObjectItfImpl_GetItfEntry(
+ (XAObjectItf) &(pBaseObj), pInterfaceIds[itfIndex]);
+ if (!entry)
+ {
+ if (pInterfaceRequired[itfIndex])
+ {
+ /* required interface cannot be accommodated - fail creation */
+ XAObjectItfImpl_Destroy((XAObjectItf) &(pBaseObj));
+ DEBUG_ERR("Required interface not found - abort creation!");
+ DEBUG_API("<-XAEngineImpl_Create");
+ return XA_RESULT_FEATURE_UNSUPPORTED;
+ }
+ else
+ {
+ DEBUG_INFO("Requested (not required) interface not found - continue creation");
+ }
+ }
+ else
+ {
+ entry->required = XA_BOOLEAN_TRUE;
+ }
+ }
+ }
+
+ /* Initialize XAEngineImpl variables */
+ if (threadSafeEnabled)
+ {
+ XAresult ret = XA_RESULT_SUCCESS;
+ pImpl->isThreadSafe = threadSafeEnabled;
+ ret = XAThreadSafety_Init(threadSafeEnabled);
+ if (ret != XA_RESULT_SUCCESS)
+ {
+ DEBUG_INFO_A1("Unable to initialize thread safety - ret:%x", ret );
+ }
+ }
+
+ /* Set ObjectItf to point to newly created object */
+ *pEngine = ((XAObjectItf) &(pBaseObj->self));
+
+ DEBUG_API("<-XAEngineImpl_Create");
+ return XA_RESULT_SUCCESS;
+ }
+
+/* XAResult XAEngineImpl_QueryNumSupportedInterfaces
+ * Description: Statically query number of supported interfaces
+ */
+XAresult XAEngineImpl_QueryNumSupportedInterfaces(
+ XAuint32 *pNumSupportedInterfaces)
+ {
+ DEBUG_API("->XAEngineImpl_QueryNumSupportedInterfaces");
+ if (pNumSupportedInterfaces)
+ {
+ *pNumSupportedInterfaces = ENGINE_ITFCOUNT;
+ DEBUG_API("<-XAEngineImpl_QueryNumSupportedInterfaces");
+ return XA_RESULT_SUCCESS;
+ }
+ else
+ {
+ DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
+ DEBUG_API("<-XAEngineImpl_QueryNumSupportedInterfaces");
+ return XA_RESULT_PARAMETER_INVALID;
+ }
+ }
+
+/* XAResult XAEngineImpl_QuerySupportedInterfaces
+ * Description: Statically query supported interfaces
+ */
+XAresult XAEngineImpl_QuerySupportedInterfaces(XAuint32 index,
+ XAInterfaceID *pInterfaceId)
+ {
+ DEBUG_API("->XAEngineImpl_QuerySupportedInterfaces");
+ if (index >= ENGINE_ITFCOUNT || !pInterfaceId)
+ {
+ if (pInterfaceId)
+ {
+ *pInterfaceId = XA_IID_NULL;
+ }
+ DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
+ DEBUG_API("<-XAEngineImpl_QuerySupportedInterfaces");
+ return XA_RESULT_PARAMETER_INVALID;
+ }
+ else
+ {
+ *pInterfaceId = *(xaEngineItfIIDs[index]);
+ DEBUG_API("<-XAEngineImpl_QuerySupportedInterfaces");
+ return XA_RESULT_SUCCESS;
+ }
+ }
+
+/*****************************************************************************
+ * base object XAObjectItfImpl methods
+ *****************************************************************************/
+
+/* XAresult XAEngineImpl_DoRealize
+ * Description: Realize all implicit and explicitly wanted interfaces.
+ * Create and initialize implementation-specific variables.
+ * Called from base object XAObjectItfImpl
+ */
+XAresult XAEngineImpl_DoRealize(XAObjectItf self)
+ {
+ XAuint8 itfIdx = 0;
+ XAObjectItfImpl* pObj = (XAObjectItfImpl*) (*self);
+ XAEngineImpl* pObjImpl = (XAEngineImpl*) (pObj);
+ XAresult ret = XA_RESULT_SUCCESS;
+
+ DEBUG_API("->XAEngineImpl_DoRealize");
+
+ /* check casting from correct pointer type */
+ if (!pObjImpl || pObj != pObjImpl->baseObj.self)
+ {
+ DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
+ DEBUG_API("<-XAEngineImpl_DoRealize");
+ /* invalid parameter */
+ return XA_RESULT_PARAMETER_INVALID;
+ }
+
+ /* Table containing use-case framework map */
+ pObjImpl->frameworkMap = XAFrameworkMgr_CreateFrameworkMap();
+ if (pObjImpl->frameworkMap == NULL)
+ {
+ DEBUG_ERR("XA_RESULT_MEMORY_FAILURE");
+ DEBUG_API("<-XAEngineImpl_DoRealize");
+ /* memory allocation failed */
+ return XA_RESULT_MEMORY_FAILURE;
+ }
+
+ /* Create capabilities list */
+ ret = XACapabilitiesMgr_CreateCapabilitieList(pObjImpl->frameworkMap,
+ &(pObjImpl->capabilities));
+ if (ret != XA_RESULT_SUCCESS)
+ {
+ return ret;
+ }
+
+ /* Realize all implicit and explicitly wanted interfaces */
+ for (itfIdx = 0; itfIdx < ENGINE_ITFCOUNT; itfIdx++)
+ {
+ if (!(pObj->interfaceMap[itfIdx].pItf)
+ && pObj->interfaceMap[itfIdx].required)
+ {
+ void *pItf = NULL;
+ switch (itfIdx)
+ {
+ case ENGINE_ENGINEITF:
+ pItf = XAEngineItfImpl_Create(pObjImpl->frameworkMap,
+ pObjImpl->capabilities);
+ break;
+ case ENGINE_THREADSYNCITF:
+ pItf = XAThreadSyncItfImpl_Create();
+ break;
+ case ENGINE_DIMITF:
+ pItf = XADIMItfImpl_Create();
+ break;
+ case ENGINE_AUDIOIODEVICECAPAITF:
+ pItf = XAAudIODevCapaItfImpl_Create(
+ pObjImpl->capabilities);
+ break;
+ case ENGINE_AUDIOENCODERCAPAITF:
+ pItf = XAAudioEncoderCapabilitiesItfImpl_Create(
+ pObjImpl->capabilities);
+ break;
+ default:
+ break;
+ }
+ if (!pItf)
+ {
+ DEBUG_ERR("XA_RESULT_MEMORY_FAILURE");
+ DEBUG_API("<-XAEngineImpl_DoRealize");
+ /* memory allocation failed */
+ return XA_RESULT_MEMORY_FAILURE;
+ }
+ else
+ {
+ pObj->interfaceMap[itfIdx].pItf = pItf;
+ }
+ }
+ }
+
+ pObj->state = XA_OBJECT_STATE_REALIZED;
+ DEBUG_API("<-XAEngineImpl_DoRealize");
+ return XA_RESULT_SUCCESS;
+ }
+
+/* XAresult XAEngineImpl_DoResume
+ * Description: Resume object from suspended state
+ */
+XAresult XAEngineImpl_DoResume(XAObjectItf self)
+ {
+ DEBUG_API("->XAEngineImpl_DoResume");
+ DEBUG_API("<-XAEngineImpl_DoResume");
+
+ return XA_RESULT_PRECONDITIONS_VIOLATED;
+ }
+
+/* void XAEngineImpl_FreeResources
+ * Description: Free all resources reserved at XA%ExampleObject%Impl_DoRealize()
+ */
+void XAEngineImpl_FreeResources(XAObjectItf self)
+ {
+ XAObjectItfImpl* pObj = (XAObjectItfImpl*) (*self);
+ XAEngineImpl* pImpl = (XAEngineImpl*) (*self);
+ XAuint8 itfIdx = 0;
+ DEBUG_API("->XAEngineImpl_FreeResources");
+ assert( pObj && pImpl && pObj == pObj->self );
+
+ /* free all allocated interfaces */
+ for (itfIdx = 0; itfIdx < ENGINE_ITFCOUNT; itfIdx++)
+ {
+ void *pItf = pObj->interfaceMap[itfIdx].pItf;
+ if (pItf)
+ {
+ switch (itfIdx)
+ {
+ case ENGINE_ENGINEITF:
+ XAEngineItfImpl_Free(pItf);
+ break;
+ case ENGINE_THREADSYNCITF:
+ XAThreadSyncItfImpl_Free(pItf);
+ break;
+ case ENGINE_DIMITF:
+ XADIMItfImpl_Free(pItf);
+ break;
+ case ENGINE_AUDIOIODEVICECAPAITF:
+ XAAudIODevCapaItfImpl_Free(pItf);
+ break;
+ case ENGINE_AUDIOENCODERCAPAITF:
+ XAAudioEncoderCapabilitiesItfImpl_Free(pItf);
+ break;
+ default:
+ break;
+ }
+ pObj->interfaceMap[itfIdx].pItf = NULL;
+ }
+ }
+
+ /* free all other allocated resources*/
+
+ /* free framework map */
+ XAFrameworkMgr_DeleteFrameworkMap(&pImpl->frameworkMap);
+
+ /* free capabilities list */
+ XACapabilitiesMgr_DeleteCapabilitieList(&pImpl->capabilities);
+
+ XAThreadSafety_Destroy();
+
+ DEBUG_API("<-XAEngineImpl_FreeResources");
+ return;
+ }
+
+/* END OF FILE */