diff -r a493a607b5bf -r eabc8c503852 khronosfws/openmax_al/src/mediarecorder/xamediarecorder.c --- a/khronosfws/openmax_al/src/mediarecorder/xamediarecorder.c Fri Sep 03 19:34:12 2010 -0500 +++ b/khronosfws/openmax_al/src/mediarecorder/xamediarecorder.c Tue Sep 21 11:38:43 2010 -0500 @@ -17,17 +17,12 @@ #include #include -#include +#include #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 #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;