khronosfws/openmax_al/src/metadataextractor/xametadataextractor.c
branchRCL_3
changeset 45 095bea5f582e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/khronosfws/openmax_al/src/metadataextractor/xametadataextractor.c	Tue Aug 31 15:43:02 2010 +0300
@@ -0,0 +1,491 @@
+/*
+ * 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: Metadata Extractor Object Impl
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include "xametadataextractor.h"
+#include "xadynamicsourceitf.h"
+#include "xadynintmgmtitf.h"
+#include "xametadataextractionitf.h"
+#include "xaconfigextensionsitf.h"
+
+#include "xacapabilitiesmgr.h"
+#include "xathreadsafety.h"
+
+#include "xaadaptationmmf.h"
+#include "xametadataadaptctxmmf.h"
+
+/* Static mapping of enumeration XAMetadataInterfaces to interface iids */
+static const XAInterfaceID* xaMetadataExtractorItfIIDs[MDE_ITFCOUNT] =
+    {
+    &XA_IID_OBJECT,
+    &XA_IID_DYNAMICINTERFACEMANAGEMENT,
+    &XA_IID_METADATAEXTRACTION,
+    &XA_IID_CONFIGEXTENSION,
+    &XA_IID_DYNAMICSOURCE
+    };
+
+/*****************************************************************************
+ * Global methods
+ *****************************************************************************/
+
+/* XAResult XAMetadataExtractorImpl_Create
+ * Description: Create object
+ * Add this method to XAGlobals.h
+ */
+XAresult XAMetadataExtractorImpl_Create(FrameworkMap* mapper,
+        XACapabilities* capabilities, XAObjectItf *pMetadataExtractor,
+        XADataSource *pDataSource, XAuint32 numInterfaces,
+        const XAInterfaceID * pInterfaceIds,
+        const XAboolean * pInterfaceRequired)
+    {
+    XAMetadataExtractorImpl* pImpl = NULL;
+    XAObjectItfImpl* pBaseObj = NULL;
+    XAuint8 itfIndex = 0;
+    FWMgrFwType fwType;
+    const char *uri = NULL;
+    XAresult res = XA_RESULT_SUCCESS;
+
+    DEBUG_API("->XAMetadataExtractorImpl_Create");
+    XA_IMPL_THREAD_SAFETY_ENTRY(XATSMediaPlayer);
+
+    if (!pMetadataExtractor)
+        {
+        XA_IMPL_THREAD_SAFETY_EXIT(XATSMediaPlayer);
+        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
+        /* invalid parameter */
+        DEBUG_API("<-XAMetadataExtractorImpl_Create");
+        return XA_RESULT_PARAMETER_INVALID;
+        }
+
+    res = XACommon_CheckDataSource(pDataSource, NULL);
+    if (res != XA_RESULT_SUCCESS)
+        {
+        XA_IMPL_THREAD_SAFETY_EXIT(XATSMediaPlayer);
+        DEBUG_API("<-XAMetadataExtractorImpl_Create");
+        return res;
+        }
+
+    /* instantiate object implementation */
+    pImpl = (XAMetadataExtractorImpl*) calloc(1,
+            sizeof(XAMetadataExtractorImpl));
+    if (!pImpl)
+        {
+        XA_IMPL_THREAD_SAFETY_EXIT(XATSMediaPlayer);
+        DEBUG_ERR("XA_RESULT_MEMORY_FAILURE");
+        /* memory allocation failed */
+        DEBUG_API("<-XAMetadataExtractorImpl_Create");
+        return XA_RESULT_MEMORY_FAILURE;
+        }
+    pBaseObj = &pImpl->baseObj;
+
+    /* Initialize base object default implementation */
+    XAObjectItfImpl_Init(pBaseObj, MDE_ITFCOUNT, xaMetadataExtractorItfIIDs,
+            XAMetadataExtractorImpl_DoRealize,
+            XAMetadataExtractorImpl_DoResume,
+            XAMetadataExtractorImpl_FreeResources);
+
+    /* Mark interfaces that need to be exposed */
+    /* Implicit and mandated interfaces */
+    pBaseObj->interfaceMap[MDE_METADATAEXTRACTIONITF].required
+            = XA_BOOLEAN_TRUE;
+    pBaseObj->interfaceMap[MDE_DYNAMICSOURCEITF].required = XA_BOOLEAN_TRUE;
+    pBaseObj->interfaceMap[MDE_DIMITF].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));
+                    XA_IMPL_THREAD_SAFETY_EXIT(XATSMediaPlayer);
+                    DEBUG_ERR("Required interface not found - abort creation!");
+                    DEBUG_API("<-XAMetadataExtractorImpl_Create");
+                    return XA_RESULT_FEATURE_UNSUPPORTED;
+                    }
+                else
+                    {
+                    DEBUG_INFO("Requested (not required) interface not found - continue creation");
+                    }
+                }
+            else
+                {
+                entry->required = XA_BOOLEAN_TRUE;
+                }
+            }
+        }
+
+    // Mark interfaces that can be handled dynamically 
+    pBaseObj->interfaceMap[MDE_CONFIGEXTENSIONITF].isDynamic
+            = XA_BOOLEAN_TRUE;
+
+    //Set ObjectItf to point to newly created object 
+    *pMetadataExtractor = (XAObjectItf) &(pBaseObj->self);
+
+    //store member variables
+    pImpl->dataSrc = pDataSource;
+
+    /* Determine framework type that can handle recording */
+    fwType = (FWMgrFwType) FWMgrMOUnknown;
+    /**/
+    if (pDataSource->pLocator)
+        {
+        XADataLocator_URI* dataLoc =
+                (XADataLocator_URI*) pDataSource->pLocator;
+        if (dataLoc->locatorType == XA_DATALOCATOR_URI)
+            {
+            uri = (char*) dataLoc->URI;
+            }
+        }
+
+    fwType = XAFrameworkMgr_GetFramework(mapper, uri, FWMgrMOPlayer);
+
+    if (fwType == FWMgrMOUnknown)
+        {
+        XAObjectItfImpl_Destroy((XAObjectItf) &(pBaseObj));
+        XA_IMPL_THREAD_SAFETY_EXIT( XATSMediaPlayer );
+        DEBUG_API("<-XAMetadataExtractorImpl_Create");
+        return XA_RESULT_CONTENT_UNSUPPORTED;
+        }
+
+    if (fwType == FWMgrFWMMF)
+        {
+        pImpl->adaptationCtxMMF = XAMetadataAdaptCtxMMF_Create(pDataSource);
+        pImpl->curAdaptCtx = pImpl->adaptationCtxMMF;
+        }
+
+    XA_IMPL_THREAD_SAFETY_EXIT(XATSMediaPlayer);
+    DEBUG_API("<-XAMetadataExtractorImpl_Create");
+    return XA_RESULT_SUCCESS;
+    }
+
+/* XAResult XAMetadataExtractorImpl_QueryNumSupportedInterfaces
+ * Description: Statically query number of supported interfaces
+ */
+XAresult XAMetadataExtractorImpl_QueryNumSupportedInterfaces(
+        XAuint32 *pNumSupportedInterfaces)
+    {
+    XAresult res = XA_RESULT_SUCCESS;
+    DEBUG_API("->XAMetadataExtractorImpl_QueryNumSupportedInterfaces");
+    if (pNumSupportedInterfaces)
+        {
+        *pNumSupportedInterfaces = MDE_ITFCOUNT;
+        res = XA_RESULT_SUCCESS;
+        }
+    else
+        {
+        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
+        res = XA_RESULT_PARAMETER_INVALID;
+        }
+    DEBUG_API_A1("<-XAMetadataExtractorImpl_QueryNumSupportedInterfaces (%d)", (int)res);
+    return res;
+    }
+/* XAResult XAMetadataExtractorImpl_QuerySupportedInterfaces
+ * Description: Statically query supported interfaces
+ */
+XAresult XAMetadataExtractorImpl_QuerySupportedInterfaces(XAuint32 index,
+        XAInterfaceID * pInterfaceId)
+    {
+    XAresult res = XA_RESULT_SUCCESS;
+    DEBUG_API("->XAMetadataExtractorImpl_QuerySupportedInterfaces");
+
+    if (index >= MDE_ITFCOUNT || !pInterfaceId)
+        {
+        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
+        res = XA_RESULT_PARAMETER_INVALID;
+        }
+    else
+        {
+        *pInterfaceId = *(xaMetadataExtractorItfIIDs[index]);
+        res = XA_RESULT_SUCCESS;
+        }
+    DEBUG_API_A1("<-XAMetadataExtractorImpl_QuerySupportedInterfaces (%d)", (int)res);
+    return res;
+    }
+
+/*****************************************************************************
+ * base object XAObjectItfImpl methods
+ *****************************************************************************/
+
+/* XAresult XAMetadataExtractorImpl_DoRealize( XAObjectItf self )
+ * Description: Realize all implicit and explicitly wanted interfaces.
+ * Create and initialize implementation-specific variables.
+ * Called from base object XAObjectItfImpl
+ */
+XAresult XAMetadataExtractorImpl_DoRealize(XAObjectItf self)
+    {
+    XAuint8 itfIdx = 0;
+    XAObjectItfImpl* pObj = (XAObjectItfImpl*) (*self);
+    XAMetadataExtractorImpl* pObjImpl = (XAMetadataExtractorImpl*) (pObj);
+    void *pItf = NULL;
+    XAresult ret = XA_RESULT_SUCCESS;
+
+    DEBUG_API("->XAMetadataExtractorImpl_DoRealize");
+    XA_IMPL_THREAD_SAFETY_ENTRY(XATSMediaPlayer);
+
+    /* check casting from correct pointer type */
+    if (!pObjImpl || pObj != pObjImpl->baseObj.self)
+        {
+        XA_IMPL_THREAD_SAFETY_EXIT(XATSMediaPlayer);
+        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
+        /* invalid parameter */
+        DEBUG_API("<-XAMetadataExtractorImpl_DoRealize");
+        return XA_RESULT_PARAMETER_INVALID;
+        }
+
+    /* Realize all implicit and explicitly wanted interfaces */
+    for (itfIdx = 0; itfIdx < MDE_ITFCOUNT; itfIdx++)
+        {
+        if (!(pObj->interfaceMap[itfIdx].pItf)
+                && pObj->interfaceMap[itfIdx].required)
+            {
+            switch (itfIdx)
+                {
+                case MDE_DIMITF:
+                    pItf = XADIMItfImpl_Create();
+                    if (pItf)
+                        {
+                        XADIMItfImpl_Init(pItf, self,
+                                XAMetadataExtractorImpl_DoAddItf,
+                                XAMetadataExtractorImpl_DoResumeItf,
+                                XAMetadataExtractorImpl_DoRemoveItf);
+                        }
+                    break;
+
+                case MDE_METADATAEXTRACTIONITF:
+                    pItf = XAMetadataExtractionItfImpl_Create(
+                            pObjImpl->curAdaptCtx);
+                    break;
+                case MDE_CONFIGEXTENSIONITF:
+                    pItf = XAConfigExtensionsItfImpl_Create();
+                    XAConfigExtensionsItfImpl_SetContext(pItf,
+                            pObjImpl->curAdaptCtx);
+                    break;
+                case MDE_DYNAMICSOURCEITF:
+                    pItf = XADynamicSourceItfImpl_Create(
+                            pObjImpl->curAdaptCtx);
+                    break;
+
+                default:
+                    break;
+                }
+            if (!pItf)
+                {
+                XA_IMPL_THREAD_SAFETY_EXIT(XATSMediaPlayer);
+                DEBUG_ERR("XA_RESULT_MEMORY_FAILURE");
+                /* memory allocation failed */
+                DEBUG_API("<-XAMetadataExtractorImpl_DoRealize");
+                return XA_RESULT_MEMORY_FAILURE;
+                }
+            else
+                {
+                pObj->interfaceMap[itfIdx].pItf = pItf;
+                }
+            }
+        }
+    /*Initialize adaptation context*/
+    /* init adaptation */
+
+    if (pObjImpl->curAdaptCtx->fwtype == FWMgrFWMMF)
+        {
+        ret = XAMetadataAdaptCtxMMF_PostInit(
+                (XAAdaptationMMFCtx*) pObjImpl->adaptationCtxMMF);
+        }
+
+    if (ret != XA_RESULT_SUCCESS)
+        {
+        XA_IMPL_THREAD_SAFETY_EXIT(XATSMediaPlayer);
+        DEBUG_ERR("Adaptation init failed!");
+        DEBUG_API("<-XAMetadataExtractorImpl_DoRealize");
+        return ret;
+        }
+    pObj->state = XA_OBJECT_STATE_REALIZED;
+    XA_IMPL_THREAD_SAFETY_EXIT(XATSMediaPlayer);
+    DEBUG_API("<-XAMetadataExtractorImpl_DoRealize");
+    return XA_RESULT_SUCCESS;
+    }
+
+/* XAresult XAMetadataExtractorImpl_DoResume
+ * Description: Resume object from suspended state
+ */
+XAresult XAMetadataExtractorImpl_DoResume(XAObjectItf self)
+    {
+    DEBUG_API("->XAMetadataExtractorImpl_DoResume");
+    DEBUG_API("<-XAMetadataExtractorImpl_DoResume");
+    /* "suspended" state not supported by this implementation */
+    return XA_RESULT_PRECONDITIONS_VIOLATED;
+    }
+
+/* void XAMetadataExtractorImpl_FreeResources
+ * Description: Free all resources reserved at XAMetadataExtractorImpl_DoRealize()
+ */
+void XAMetadataExtractorImpl_FreeResources(XAObjectItf self)
+    {
+    XAObjectItfImpl* pObj = (XAObjectItfImpl*) (*self);
+
+    XAuint8 itfIdx = 0;
+    void *pItf = NULL;
+    XAMetadataExtractorImpl* pImpl = (XAMetadataExtractorImpl*) (*self);
+    DEBUG_API("->XAMetadataExtractorImpl_FreeResources");
+    XA_IMPL_THREAD_SAFETY_ENTRY_FOR_VOID_FUNCTIONS(XATSMediaPlayer);
+
+    assert( pObj && pImpl && pObj == pObj->self );
+
+    for (itfIdx = 0; itfIdx < MDE_ITFCOUNT; itfIdx++)
+        {
+        pItf = pObj->interfaceMap[itfIdx].pItf;
+        if (pItf)
+            {
+            switch (itfIdx)
+                {
+                case MDE_METADATAEXTRACTIONITF:
+                    XAMetadataExtractionItfImpl_Free(pItf);
+                    break;
+                case MDE_DYNAMICSOURCEITF:
+                    XADynamicSourceItfImpl_Free(pItf);
+                    break;
+                case MDE_DIMITF:
+                    XADIMItfImpl_Free(pItf);
+                    break;
+                case MDE_CONFIGEXTENSIONITF:
+                    XAConfigExtensionsItfImpl_Free(pItf);
+                    break;
+                }
+            pObj->interfaceMap[itfIdx].pItf = NULL;
+            }
+        }
+
+    if (pImpl->curAdaptCtx)
+        {
+        if (pImpl->curAdaptCtx->fwtype == FWMgrFWMMF)
+            {
+            XAMetadataAdaptCtxMMF_Destroy(
+                    (XAAdaptationMMFCtx*) pImpl->adaptationCtxMMF);
+            pImpl->adaptationCtxMMF = NULL;
+            }
+        }
+
+    pImpl->curAdaptCtx = NULL;
+
+    XA_IMPL_THREAD_SAFETY_EXIT_FOR_VOID_FUNCTIONS(XATSMediaPlayer);
+    DEBUG_API("<-XAMetadataExtractorImpl_FreeResources");
+    return;
+    }
+
+/*****************************************************************************
+ * MetadataExtractorImpl -specific methods
+ *****************************************************************************/
+
+/* XAMetadataExtractorImpl_DoAddItf
+ * Dynamically add an interface, object specific parts
+ */
+XAresult XAMetadataExtractorImpl_DoAddItf(XAObjectItf self,
+        XAObjItfMapEntry *mapEntry)
+    {
+
+    XAObjectItfImpl* pObj = (XAObjectItfImpl*) (*self);
+    XAMetadataExtractorImpl* pImpl = (XAMetadataExtractorImpl*) (pObj);
+
+    XAresult ret = XA_RESULT_SUCCESS;
+    DEBUG_API("->XAMetadataExtractorImpl_DoAddItf");
+
+    if (mapEntry)
+        {
+        switch (mapEntry->mapIdx)
+            {
+            case MDE_CONFIGEXTENSIONITF:
+                mapEntry->pItf = XAConfigExtensionsItfImpl_Create();
+
+                XAConfigExtensionsItfImpl_SetContext(mapEntry->pItf,
+                        pImpl->adaptationCtxGst);
+
+                break;
+            default:
+                DEBUG_ERR("XAMetadataExtractorImpl_DoAddItf unknown id");
+                ret = XA_RESULT_FEATURE_UNSUPPORTED;
+                break;
+            }
+        if (!mapEntry->pItf && ret == XA_RESULT_SUCCESS)
+            {
+            DEBUG_ERR("XAMetadataExtractorImpl_DoAddItf itf creation failed");
+            ret = XA_RESULT_MEMORY_FAILURE;
+            }
+        }
+    else
+        {
+        ret = XA_RESULT_PARAMETER_INVALID;
+        }
+
+    DEBUG_API("<-XAMetadataExtractorImpl_DoAddItf");
+    return ret;
+    }
+
+/* XAMetadataExtractorImpl_DoResumeItf
+ * Try to resume lost interface, object specific parts
+ */
+XAresult XAMetadataExtractorImpl_DoResumeItf(XAObjectItf self,
+        XAObjItfMapEntry *mapEntry)
+    {
+    XAresult ret = XA_RESULT_SUCCESS;
+    DEBUG_API("->XAMetadataExtractorImpl_DoResumeItf");
+    /* For now, no difference between suspended and unrealised itfs */
+    ret = XAMetadataExtractorImpl_DoAddItf(self, mapEntry);
+    DEBUG_API("<-XAMetadataExtractorImpl_DoResumeItf");
+    return ret;
+    }
+
+/* XAMetadataExtractorImpl_DoRemoveItf
+ * Dynamically remove an interface, object specific parts
+ */
+XAresult XAMetadataExtractorImpl_DoRemoveItf(XAObjectItf self,
+        XAObjItfMapEntry *mapEntry)
+    {
+    XAresult ret = XA_RESULT_SUCCESS;
+    DEBUG_API("->XAMetadataExtractorImpl_DoRemoveItf");
+    ret = XA_RESULT_SUCCESS;
+    if (mapEntry)
+        {
+        switch (mapEntry->mapIdx)
+            {
+            case MDE_CONFIGEXTENSIONITF:
+                XAConfigExtensionsItfImpl_Free(mapEntry->pItf);
+                break;
+            default:
+                DEBUG_ERR("XAMetadataExtractorImpl_DoRemoveItf unknown id");
+                ret = XA_RESULT_FEATURE_UNSUPPORTED;
+                break;
+            }
+        mapEntry->pItf = NULL;
+        }
+    else
+        {
+        ret = XA_RESULT_PARAMETER_INVALID;
+        }
+    DEBUG_API("<-XAMetadataExtractorImpl_DoRemoveItf");
+    return ret;
+    }
+/* END OF FILE */