khronosfws/openmax_al/src/mediarecorder/xamediarecorder.c
changeset 55 e267340986c9
parent 47 c2e43643db4c
--- a/khronosfws/openmax_al/src/mediarecorder/xamediarecorder.c	Fri Sep 17 08:33:15 2010 +0300
+++ b/khronosfws/openmax_al/src/mediarecorder/xamediarecorder.c	Mon Oct 04 00:51:56 2010 +0300
@@ -17,17 +17,12 @@
 
 #include <stdio.h>
 #include <stdlib.h>
-#include <assert.h>
+#include <string.h>
 #include "xamediarecorder.h"
 #include "xaaudioencoderitf.h"
-#include "xaconfigextensionsitf.h"
 #include "xadynintmgmtitf.h"
-#include "xametadatainsertionitf.h"
 #include "xarecorditf.h"
-#include "xavolumeitf.h"
-#include "xametadataextractionitf.h"
 #include "xathreadsafety.h"
-#include <string.h>
 #include "xacapabilitiesmgr.h"
 #include "xamediarecorderadaptctxmmf.h"
 #include "xamediarecorderadaptctx.h"
@@ -36,12 +31,8 @@
     {
     &XA_IID_OBJECT,
     &XA_IID_AUDIOENCODER,
-    &XA_IID_CONFIGEXTENSION,
     &XA_IID_DYNAMICINTERFACEMANAGEMENT,
-    &XA_IID_METADATAINSERTION,
-    &XA_IID_RECORD,
-    &XA_IID_VOLUME,
-    &XA_IID_METADATAEXTRACTION
+    &XA_IID_RECORD
     };
 
 /* Global methods */
@@ -67,7 +58,20 @@
     DEBUG_API("->XAMediaRecorderImpl_CreateMediaRecorder");
     XA_IMPL_THREAD_SAFETY_ENTRY( XATSMediaRecorder );
 
-    if (!pRecorder)
+    /* check sink&source parameters */
+    ret = XACommon_ValidateDataLocator(3, pAudioSrc, pImageVideoSrc,
+                    pDataSnk);
+    if (ret != XA_RESULT_SUCCESS)
+        {
+        XA_IMPL_THREAD_SAFETY_EXIT( XATSMediaRecorder );
+        DEBUG_API("<-XAMediaRecorderImpl_CreateMediaRecorder");
+        return ret;
+        }
+    
+    /* check only sink media type, do not care about return value (availability) */
+    XACommon_CheckDataSource((XADataSource*) pDataSnk, &mediaType);
+    
+    if (!pRecorder || (!pAudioSrc && !pImageVideoSrc) || !pDataSnk)
         {
         /* invalid parameter */
         XA_IMPL_THREAD_SAFETY_EXIT( XATSMediaRecorder );
@@ -76,50 +80,34 @@
         return XA_RESULT_PARAMETER_INVALID;
         }
 
-    /* check sink&source parameters */
-    ret
-            = XACommon_ValidateDataLocator(3, pAudioSrc, pImageVideoSrc,
-                    pDataSnk);
-    if (ret != XA_RESULT_SUCCESS)
-        {
-        XA_IMPL_THREAD_SAFETY_EXIT( XATSMediaRecorder );
-        DEBUG_API("<-XAMediaRecorderImpl_CreateMediaRecorder");
-        return ret;
-        }
-
     /* instantiate object implementation */
     pImpl = (XAMediaRecorderImpl*) calloc(1, sizeof(XAMediaRecorderImpl));
     if (!pImpl)
         {
-
         /* memory allocation failed */
         XA_IMPL_THREAD_SAFETY_EXIT( XATSMediaRecorder );
         DEBUG_ERR("XA_RESULT_MEMORY_FAILURE");
         DEBUG_API("<-XAMediaRecorderImpl_CreateMediaRecorder");
         return XA_RESULT_MEMORY_FAILURE;
         }
+    
     pBaseObj = &pImpl->baseObj;
 
     /* Initialize base object default implementation */
     XAObjectItfImpl_Init(pBaseObj, MR_ITFCOUNT, xaMediaRecorderItfIIDs,
             XAMediaRecorderImpl_DoRealize, XAMediaRecorderImpl_DoResume,
             XAMediaRecorderImpl_FreeResources);
-
+        
     /* Mark interfaces that need to be exposed */
-    /* Implicit and mandated interfaces */
-    pBaseObj->interfaceMap[MR_RECORDITF].required = XA_BOOLEAN_TRUE;
-    if (pAudioSrc && mediaType != XA_MEDIATYPE_IMAGE)
-        {
-        pBaseObj->interfaceMap[MR_AUDIOENCODERITF].required = XA_BOOLEAN_TRUE;
-        }
-
+    /* Mandated Implicit interfaces */
     pBaseObj->interfaceMap[MR_DIMITF].required = XA_BOOLEAN_TRUE;
 
-    /* Explicit interfaces */
+    /* Mark interfaces that can be handled dynamically */
+    /* Mandated dynamic itfs */
+
+    /*Mandated  Explicit interfaces */
     if ((numInterfaces != 0) && pInterfaceIds && pInterfaceRequired)
         {
-        /* check only sink media type, do not care about return value (availability) */
-        XACommon_CheckDataSource((XADataSource*) pDataSnk, &mediaType);
         /* Check required interfaces */
         for (itfIdx = 0; itfIdx < numInterfaces; itfIdx++)
             {
@@ -141,52 +129,11 @@
                     }
                 }
             else
-                { /* weed out unsupported content-aware itf's */
-                if ((mediaType == XA_MEDIATYPE_IMAGE || !pAudioSrc)
-                        && (entry->mapIdx == MR_VOLUMEITF || entry->mapIdx == MR_AUDIOENCODERITF))
-                    {
-                    entry->required = XA_BOOLEAN_FALSE;
-                    if (pInterfaceRequired[itfIdx])
-                        {
-                        DEBUG_ERR("Required interface not supported for given media - abort creation!");
-                        ret = XA_RESULT_FEATURE_UNSUPPORTED;
-                        break;
-                        }
-                    }
-                else
-                    {
-                    entry->required = XA_BOOLEAN_TRUE;
-                    }
-
-                if (entry->mapIdx == MR_RECORDITF)
-                    {
-                    DEBUG_ERR("RecordItf requested - support stream mode");
-                    pImpl->recModes |= XA_RECMODE_STREAM;
-                    }
+                {
+                entry->required = XA_BOOLEAN_TRUE;
                 }
             }
         }
-    if (pImpl->recModes == 0)
-        {
-        DEBUG_ERR("Warning!!! No recording interfaces requested - unable to record!!");
-        }
-    /*check sink and src parameters*/
-    if (ret == XA_RESULT_SUCCESS)
-        {
-        ret = XACommon_ValidateDataLocator(3, pDataSnk, pAudioSrc,
-                pImageVideoSrc);
-        /*datasink ignored if only snapshotitf is used*/
-        if (!pDataSnk && (pImpl->recModes & XA_RECMODE_STREAM))
-            {
-            DEBUG_ERR("No datasink to record to!");
-            ret = XA_RESULT_PARAMETER_INVALID;
-            }
-        if (!pAudioSrc && !pImageVideoSrc)
-            {
-            DEBUG_ERR("No data sources set!");
-            ret = XA_RESULT_PARAMETER_INVALID;
-            }
-        }
 
     if (ret != XA_RESULT_SUCCESS)
         { /* creation fails */
@@ -195,20 +142,17 @@
         DEBUG_API("<-XAMediaRecorderImpl_CreateMediaRecorder");
         return ret;
         }
-
-    /* Mark interfaces that can be handled dynamically */
-    /* Mandated dynamic itfs */
-    pBaseObj->interfaceMap[MR_METADATAINSERTIONITF].isDynamic
-            = XA_BOOLEAN_TRUE;
-
+    
     /* Initialize XAMediaRecorderImpl variables */
     pImpl->audioSrc = pAudioSrc;
     pImpl->dataSnk = pDataSnk;
     pImpl->imageVideoSrc = pImageVideoSrc;
+    pImpl->recModes |= XA_RECMODE_STREAM;
+
     /* Determine framework type that can handle recording */
     fwType = (FWMgrFwType) FWMgrMOUnknown;
     /**/
-    if (pDataSnk && pDataSnk->pLocator)
+    if (pDataSnk->pLocator)
         {
         XADataLocator_URI* dataLoc = (XADataLocator_URI*) pDataSnk->pLocator;
         if (dataLoc->locatorType == XA_DATALOCATOR_URI)
@@ -216,34 +160,41 @@
             uri = (char*) dataLoc->URI;
             }
         }
+    
     fwType = XAFrameworkMgr_GetFramework(mapper, uri, FWMgrMORecorder);
 
-    if (fwType == FWMgrMOUnknown)
+    switch(fwType)
         {
-        ret = XA_RESULT_CONTENT_UNSUPPORTED;
+        case FWMgrFWMMF:
+            {
+
+            pImpl->adaptationCtx = XAMediaRecorderAdaptMMF_Create(
+                    pImpl->audioSrc, pImpl->imageVideoSrc, pImpl->dataSnk,
+                    pImpl->recModes);
+            }
+            break;
+        case FWMgrFWGST:
+            {
+            pImpl->adaptationCtx = XAMediaRecorderAdapt_Create(pImpl->audioSrc,
+                    pImpl->imageVideoSrc, pImpl->dataSnk, pImpl->recModes);
+            break;
+            }
+        case FWMgrFWUknown:
+        default:
+            {
+            ret = XA_RESULT_CONTENT_UNSUPPORTED;
+            break;
+            }
+        }
+    
+    if (ret != XA_RESULT_SUCCESS)
+        { /* creation fails */
         XAObjectItfImpl_Destroy((XAObjectItf) &(pBaseObj));
         XA_IMPL_THREAD_SAFETY_EXIT( XATSMediaRecorder );
         DEBUG_API("<-XAMediaRecorderImpl_CreateMediaRecorder");
         return ret;
         }
-
-    /* Set ObjectItf to point to newly created object */
-    *pRecorder = (XAObjectItf) &(pBaseObj->self);
-
-    if (fwType == FWMgrFWMMF)
-        {
-
-        pImpl->adaptationCtx = XAMediaRecorderAdaptMMF_Create(
-                pImpl->audioSrc, pImpl->imageVideoSrc, pImpl->dataSnk,
-                pImpl->recModes);
-        }
-    else
-        {
-
-        pImpl->adaptationCtx = XAMediaRecorderAdapt_Create(pImpl->audioSrc,
-                pImpl->imageVideoSrc, pImpl->dataSnk, pImpl->recModes);
-        }
-
+    
     if (pImpl->adaptationCtx)
         {
         pImpl->adaptationCtx->capslist = capabilities;
@@ -258,6 +209,9 @@
         return ret;
         }
 
+    /* Set ObjectItf to point to newly created object */
+    *pRecorder = (XAObjectItf) &(pBaseObj->self);
+    
     XA_IMPL_THREAD_SAFETY_EXIT( XATSMediaRecorder );
     DEBUG_API("<-XAMediaRecorderImpl_CreateMediaRecorder");
     return XA_RESULT_SUCCESS;
@@ -270,18 +224,9 @@
         XAuint32 *pNumSupportedInterfaces)
     {
     DEBUG_API("->XAMediaRecorderImpl_QueryNumSupportedInterfaces");
-    if (pNumSupportedInterfaces)
-        {
-        *pNumSupportedInterfaces = MR_ITFCOUNT;
-
-        DEBUG_API("<-XAMediaRecorderImpl_QueryNumSupportedInterfaces");
-        return XA_RESULT_SUCCESS;
-        }
-    else
-        {
-        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
-        return XA_RESULT_PARAMETER_INVALID;
-        }
+    *pNumSupportedInterfaces = MR_ITFCOUNT;
+    DEBUG_API("<-XAMediaRecorderImpl_QueryNumSupportedInterfaces");
+    return XA_RESULT_SUCCESS;
     }
 /* XAResult XAMediaRecorderImpl_QuerySupportedInterfaces
  * Statically query supported interfaces
@@ -290,7 +235,7 @@
         XAInterfaceID *pInterfaceId)
     {
     DEBUG_API("->XAMediaRecorderImpl_QuerySupportedInterfaces");
-    if (index >= MR_ITFCOUNT || !pInterfaceId)
+    if (index >= MR_ITFCOUNT)
         {
         DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
         return XA_RESULT_PARAMETER_INVALID;
@@ -298,7 +243,6 @@
     else
         {
         *pInterfaceId = *(xaMediaRecorderItfIIDs[index]);
-
         DEBUG_API("<-XAMediaRecorderImpl_QuerySupportedInterfaces");
         return XA_RESULT_SUCCESS;
         }
@@ -331,25 +275,7 @@
         XA_IMPL_THREAD_SAFETY_EXIT( XATSMediaRecorder );
         return XA_RESULT_PARAMETER_INVALID;
         }
-
-    /* init adaptation */
-    if (pObjImpl->adaptationCtx->fwtype == FWMgrFWMMF)
-        {
-        ret = XAMediaRecorderAdaptMMF_PostInit(
-                (XAAdaptationMMFCtx*) pObjImpl->adaptationCtx);
-        }
-    else
-        {
-        ret = XAMediaRecorderAdapt_PostInit(
-                (XAAdaptationGstCtx*) pObjImpl->adaptationCtx);
-        }
-
-    if (ret != XA_RESULT_SUCCESS)
-        {
-        XA_IMPL_THREAD_SAFETY_EXIT( XATSMediaRecorder );
-        return ret;
-        }
-
+ 
     /* Realize all implicit and explicitly wanted interfaces */
     for (itfIdx = 0; itfIdx < MR_ITFCOUNT; itfIdx++)
         {
@@ -375,22 +301,6 @@
                 case MR_AUDIOENCODERITF:
                     pItf = XAAudioEncoderItfImpl_Create(pObjImpl);
                     break;
-                case MR_METADATAINSERTIONITF:
-                    pItf = XAMetadataInsertionItfImpl_Create(pObjImpl);
-                    break;
-
-                case MR_CONFIGEXTENSIONITF:
-                    pItf = XAConfigExtensionsItfImpl_Create();
-                    XAConfigExtensionsItfImpl_SetContext(pItf,
-                            pObjImpl->adaptationCtx);
-                    break;
-                case MR_VOLUMEITF:
-                    pItf = XAVolumeItfImpl_Create(pObjImpl->adaptationCtx);
-                    break;
-                case MR_METADATAEXTRACTIONITF:
-                    pItf = XAMetadataExtractionItfImpl_Create(
-                            pObjImpl->adaptationCtx);
-                    break;
                 default:
                     break;
                 }
@@ -408,6 +318,27 @@
             }
         }
 
+    /* init adaptation */
+    if (pObjImpl->adaptationCtx->fwtype == FWMgrFWMMF)
+        {
+        ret = XAMediaRecorderAdaptMMF_PostInit(
+                (XAAdaptationMMFCtx*) pObjImpl->adaptationCtx);
+        }
+    else
+        {
+        ret = XAMediaRecorderAdapt_PostInit(
+                (XAAdaptationGstCtx*) pObjImpl->adaptationCtx);
+        }
+
+    if (ret != XA_RESULT_SUCCESS)
+        {
+        XA_IMPL_THREAD_SAFETY_EXIT( XATSMediaRecorder );
+        return ret;
+        }
+
+    XAAdaptationBase_AddEventHandler(pObjImpl->adaptationCtx,
+            &XAMediaRecorderImpl_AdaptCb, XA_OBJECTITFEVENTS, pObjImpl);
+    
     pObj->state = XA_OBJECT_STATE_REALIZED;
     DEBUG_API("<-XAMediaRecorderImpl_DoRealize");
     XA_IMPL_THREAD_SAFETY_EXIT( XATSMediaRecorder );
@@ -436,7 +367,6 @@
     XAMediaRecorderImpl* pImpl = (XAMediaRecorderImpl*) (*self);
     DEBUG_API("->XAMediaRecorderImpl_FreeResources");
     XA_IMPL_THREAD_SAFETY_ENTRY_FOR_VOID_FUNCTIONS( XATSMediaRecorder );
-    assert( pObj && pImpl && pObj == pObj->self );
 
     /* free all allocated interfaces */
     for (itfIdx = 0; itfIdx < MR_ITFCOUNT; itfIdx++)
@@ -449,24 +379,12 @@
                 case MR_AUDIOENCODERITF:
                     XAAudioEncoderItfImpl_Free(pItf);
                     break;
-                case MR_CONFIGEXTENSIONITF:
-                    XAConfigExtensionsItfImpl_Free(pItf);
-                    break;
                 case MR_DIMITF:
                     XADIMItfImpl_Free(pItf);
                     break;
-                case MR_METADATAINSERTIONITF:
-                    XAMetadataInsertionItfImpl_Free(pItf);
-                    break;
                 case MR_RECORDITF:
                     XARecordItfImpl_Free(pItf);
                     break;
-                case MR_VOLUMEITF:
-                    XAVolumeItfImpl_Free(pItf);
-                    break;
-                case MR_METADATAEXTRACTIONITF:
-                    XAMetadataExtractionItfImpl_Free(pItf);
-                    break;
                 default:
                     break;
                 }
@@ -496,6 +414,38 @@
     return;
     }
 
+/* void XARecordItfImpl_AdaptCb
+ * Description: Listen changes in adaptation
+ */
+void XAMediaRecorderImpl_AdaptCb(void *pHandlerCtx, XAAdaptEvent *event)
+    {
+    XAObjectItfImpl* impl = (XAObjectItfImpl*) pHandlerCtx;
+    DEBUG_API("->XAMediaRecorderImpl_AdaptCb");
+
+    if (!impl)
+        {
+        DEBUG_ERR("XAMediaRecorderImpl_AdaptCb, invalid context pointer!");
+        DEBUG_API("<-XAMediaRecorderImpl_AdaptCb");
+        return;
+        }
+
+    if(impl->callBack)
+        {
+        if(event)
+            {
+            XAObjItfCBData* data = (XAObjItfCBData*)(event->data);
+            if(data->event == XA_OBJECT_EVENT_RESOURCES_LOST )
+                {
+                impl->state = data->param;
+                }
+            impl->callBack(impl->cbPtrToSelf, impl->context, data->event, data->result, data->param, data->interface);
+            }
+        }
+    
+    DEBUG_API("<-XAMediaRecorderImpl_AdaptCb");
+    }
+
+
 /*****************************************************************************
  * MediaRecorderImpl -specific methods
  *****************************************************************************/
@@ -506,10 +456,6 @@
 XAresult XAMediaRecorderImpl_DoAddItf(XAObjectItf self,
         XAObjItfMapEntry *mapEntry)
     {
-
-    XAObjectItfImpl* pObj = (XAObjectItfImpl*) (*self);
-    XAMediaRecorderImpl* pImpl = (XAMediaRecorderImpl*) (pObj);
-
     XAresult ret = XA_RESULT_SUCCESS;
 
     DEBUG_API("->XAMediaRecorderImpl_DoAddItf");
@@ -519,10 +465,6 @@
         {
         switch (mapEntry->mapIdx)
             {
-
-            case MR_METADATAINSERTIONITF:
-                mapEntry->pItf = XAMetadataInsertionItfImpl_Create(pImpl);
-                break;
             default:
                 DEBUG_ERR("XAMediaRecorderImpl_DoAddItf unknown id");
                 ret = XA_RESULT_FEATURE_UNSUPPORTED;
@@ -574,9 +516,6 @@
         {
         switch (mapEntry->mapIdx)
             {
-            case MR_METADATAINSERTIONITF:
-                XAMetadataInsertionItfImpl_Free(mapEntry->pItf);
-                break;
             default:
                 DEBUG_ERR("XAMediaRecorderImpl_DoRemoveItf unknown id");
                 ret = XA_RESULT_FEATURE_UNSUPPORTED;