khronosfws/openmax_al/src/mediaplayer/xamediaplayer.c
changeset 16 43d09473c595
parent 12 5a06f39ad45b
child 21 2ed61feeead6
child 31 8dfd592727cb
--- a/khronosfws/openmax_al/src/mediaplayer/xamediaplayer.c	Mon May 03 12:59:52 2010 +0300
+++ b/khronosfws/openmax_al/src/mediaplayer/xamediaplayer.c	Fri May 14 16:22:35 2010 +0300
@@ -34,11 +34,12 @@
 #include "xavideopostprocessingitf.h"
 #include "xaconfigextensionsitf.h"
 #include "xathreadsafety.h"
-#ifdef _GSTREAMER_BACKEND_  
-#include "XAMetadataAdaptation.h"
-#endif
+#include "xametadataadaptation.h"
+#include "xacapabilitiesmgr.h"
 #include "xadynamicsourceitf.h"
-
+#include "xastreaminformationitf.h"
+#include "xanlinearvolumeitf.h"
+#include "xanvolumeextitf.h"
 
 extern void* vfHandle;
 
@@ -59,7 +60,10 @@
     &XA_IID_METADATAEXTRACTION,
     &XA_IID_METADATATRAVERSAL,
     &XA_IID_PLAYBACKRATE,
-    &XA_IID_VIDEOPOSTPROCESSING
+    &XA_IID_VIDEOPOSTPROCESSING,
+    &XA_IID_NOKIAVOLUMEEXT,
+    &XA_IID_NOKIALINEARVOLUME,
+    &XA_IID_STREAMINFORMATION
 };
 
 /* Global methods */
@@ -67,7 +71,9 @@
 /* XAResult XAMediaPlayerImpl_CreateMediaPlayer
  * Create object
  */
-XAresult XAMediaPlayerImpl_CreateMediaPlayer(XAObjectItf *pPlayer,
+XAresult XAMediaPlayerImpl_CreateMediaPlayer(FrameworkMap* mapper,
+                                            XACapabilities* capabilities,   
+                                             XAObjectItf *pPlayer,
                                              XADataSource *pDataSrc,
                                              XADataSource *pBankSrc,
                                              XADataSink *pAudioSnk,
@@ -81,11 +87,13 @@
     XAuint8 itfIdx = 0;
     XAMediaType mediaType = XA_MEDIATYPE_UNKNOWN;
     XAMediaPlayerImpl* pPlayerImpl = NULL;
+    FWMgrFwType fwType;
     XAObjectItfImpl* pBaseObj = NULL;
+    const char *uri = NULL;
     XAresult ret = XA_RESULT_SUCCESS;
-    XADataLocator_URI* tmpUri;
+    
+    DEBUG_API("->XAMediaPlayerImpl_CreateMediaPlayer");
 
-    DEBUG_API("->XAMediaPlayerImpl_CreateMediaPlayer");
     XA_IMPL_THREAD_SAFETY_ENTRY(XATSMediaPlayer);
 
     if(!pPlayer || !pDataSrc)
@@ -199,11 +207,11 @@
     pBaseObj->interfaceMap[MP_METADATATRAVERSALITF].isDynamic = XA_BOOLEAN_TRUE;
     pBaseObj->interfaceMap[MP_PLAYBACKRATEITF].isDynamic = XA_BOOLEAN_TRUE;
 
-
-    /* Set ObjectItf to point to newly created object */
+    
+    /*Set ObjectItf to point to newly created object*/ 
     *pPlayer = (XAObjectItf)&(pBaseObj->self);
 
-    /* initialize XAPlayerImpl variables */
+    /*initialize XAPlayerImpl variables */
 
     pPlayerImpl->dataSrc = pDataSrc;
     pPlayerImpl->bankSrc = pBankSrc;
@@ -211,43 +219,61 @@
     pPlayerImpl->imageVideoSnk = pImageVideoSnk;
     pPlayerImpl->vibra = pVibra;
     pPlayerImpl->LEDArray = pLEDArray;
-    
-    tmpUri = (XADataLocator_URI*)(pPlayerImpl->dataSrc->pLocator);
-    XAMediaPlayerImpl_DeterminePlaybackEngine(*pPlayer, tmpUri);
+
+    /* Determine framework type that can handle recording */
+    fwType = (FWMgrFwType)FWMgrMOUnknown;
+    /**/
+    if (pDataSrc->pLocator)
+    {
+        XADataLocator_URI* dataLoc = (XADataLocator_URI*)pDataSrc->pLocator;
+        if (dataLoc->locatorType == XA_DATALOCATOR_URI)
+            {
+            uri = (char*)dataLoc->URI;
+            }
+    }
+    fwType = XAFrameworkMgr_GetFramework(
+                        mapper,
+                        uri,
+                        FWMgrMOPlayer);
+
+    if (fwType == FWMgrMOUnknown)
+        {
+        ret = XA_RESULT_CONTENT_UNSUPPORTED;
+        XAObjectItfImpl_Destroy((XAObjectItf)&(pBaseObj));
+        XA_IMPL_THREAD_SAFETY_EXIT( XATSMediaPlayer );
+        DEBUG_API("<-XAMediaPlayerImpl_CreateMediaPlayer");
+        return ret;
+        }
     
-    /* This code is put here to return Feature Not Supported since adaptation is not present*/
-    /*************************************************/
-    XAObjectItfImpl_Destroy((XAObjectItf)&(pBaseObj));
-    XA_IMPL_THREAD_SAFETY_EXIT(XATSMediaPlayer);
-    DEBUG_ERR("Required interface not found - abort creation!");
-    DEBUG_API("<-XAMediaPlayerImpl_CreateMediaPlayer");
-    return XA_RESULT_FEATURE_UNSUPPORTED;
-    /*************************************************/
-    
-/*    if(pPlayerImpl->isMMFPlayback)
-    {
+    if(fwType == FWMgrFWMMF)
+    {    
         pPlayerImpl->adaptationCtxMMF = XAMediaPlayerAdaptMMF_Create(pPlayerImpl->dataSrc,
                                                                pPlayerImpl->bankSrc,
                                                                pPlayerImpl->audioSnk,
                                                                pPlayerImpl->imageVideoSnk,
                                                                pPlayerImpl->vibra,
                                                                pPlayerImpl->LEDArray);
-    
+        
+        pPlayerImpl->curAdaptCtx = pPlayerImpl->adaptationCtxMMF;    
     }
     else
     {
-#ifdef _GSTREAMER_BACKEND_  
-       pPlayerImpl->adaptationCtx = XAMediaPlayerAdapt_Create(pPlayerImpl->dataSrc,
+       pPlayerImpl->adaptationCtxGst = XAMediaPlayerAdapt_Create(pPlayerImpl->dataSrc,
                                                            pPlayerImpl->bankSrc,
                                                            pPlayerImpl->audioSnk,
                                                            pPlayerImpl->imageVideoSnk,
                                                            pPlayerImpl->vibra,
                                                            pPlayerImpl->LEDArray);
-#endif
+       
+       pPlayerImpl->curAdaptCtx = pPlayerImpl->adaptationCtxGst;
     }
+    
+    pPlayerImpl->curAdaptCtx->capslist = capabilities;
+    pPlayerImpl->curAdaptCtx->fwtype = fwType;
+    
     XA_IMPL_THREAD_SAFETY_EXIT( XATSMediaPlayer );
     DEBUG_API("<-XAMediaPlayerImpl_CreateMediaPlayer");
-    return XA_RESULT_SUCCESS;*/
+    return XA_RESULT_SUCCESS;
 }
 
 /* XAResult XAMediaPlayerImpl_QueryNumSupportedInterfaces
@@ -282,9 +308,9 @@
     if (index >= MP_ITFCOUNT || !pInterfaceId )
     {
         if(pInterfaceId)
-            {
+        {
             *pInterfaceId = XA_IID_NULL;
-            }
+        }
         DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
         DEBUG_API("<-XAMediaPlayerImpl_QuerySupportedInterfaces");
         return XA_RESULT_PARAMETER_INVALID;
@@ -307,7 +333,6 @@
     XAuint8 itfIdx = 0;
     void *pItf = NULL;
     XAresult ret = XA_RESULT_SUCCESS;
-    XADataLocator_URI* tmpUri;
 
     DEBUG_API("->XAMediaPlayerImpl_DoRealize");
     XA_IMPL_THREAD_SAFETY_ENTRY( XATSMediaPlayer );
@@ -340,11 +365,7 @@
                     }
                     break;
                 case MP_PLAYITF:
-                    pItf = XAPlayItfImpl_Create(
-#ifdef _GSTREAMER_BACKEND_
-                            pImpl->adaptationCtx,
-#endif
-                            pImpl->adaptationCtxMMF);
+                    pItf = XAPlayItfImpl_Create(pImpl);
                     if ( pImpl->dataSrc )
                     {
                 		XAuint32 locType = *((XAuint32*)(pImpl->dataSrc->pLocator));
@@ -357,11 +378,6 @@
                 				DEBUG_INFO_A1("Stored view finder pointer to global address %x", vfHandle);
                 			    }
                 		    }
-                		else if(locType == XA_DATALOCATOR_URI )
-                		    {
-                            tmpUri = (XADataLocator_URI*)(pImpl->dataSrc->pLocator);
-                            XAPlayItfImpl_DeterminePlaybackEngine(pItf, tmpUri);
-                		    }
                 		else
                 		    {
                 		
@@ -369,44 +385,51 @@
                     }
                     break;
                 case MP_VOLUMEITF:
-#ifdef _GSTREAMER_BACKEND_  
-                    pItf = XAVolumeItfImpl_Create(pImpl->adaptationCtx);
+                    pItf = XAVolumeItfImpl_Create(pImpl->curAdaptCtx);
                     break;
                 case MP_SEEKITF:
-                    pItf = XASeekItfImpl_Create(pImpl->adaptationCtx);
+                    pItf = XASeekItfImpl_Create(pImpl);
                     break;
                 case MP_PREFETCHSTATUSITF:
-                    pItf = XAPrefetchStatusItfImpl_Create( pImpl->adaptationCtx );
+                    pItf = XAPrefetchStatusItfImpl_Create( pImpl );
                     break;
                 case MP_METADATAEXTRACTIONITF:
-                    pItf = XAMetadataExtractionItfImpl_Create( pImpl->adaptationCtx );
+                    pItf = XAMetadataExtractionItfImpl_Create( pImpl->curAdaptCtx );
                     break;
                 case MP_METADATATRAVERSALITF:
-                    pItf = XAMetadataTraversalItfImpl_Create( pImpl->adaptationCtx );
+                    pItf = XAMetadataTraversalItfImpl_Create( pImpl->curAdaptCtx );
                     break;
                 case MP_PLAYBACKRATEITF:
-                    pItf = XAPlaybackRateItfImpl_Create(pImpl->adaptationCtx);
+                    pItf = XAPlaybackRateItfImpl_Create(pImpl);
                     break;
                 case MP_CONFIGEXTENSIONITF:
                     pItf = XAConfigExtensionsItfImpl_Create();
-                    XAConfigExtensionsItfImpl_SetContext( pItf, pImpl->adaptationCtx);
+                    XAConfigExtensionsItfImpl_SetContext( pItf, pImpl->curAdaptCtx);
                     break;
                 case MP_DYNAMICSOURCEITF:
-                    pItf = XADynamicSourceItfImpl_Create(pImpl->adaptationCtx);
+                    pItf = XADynamicSourceItfImpl_Create(pImpl->curAdaptCtx);
                     break;
                 case MP_EQUALIZERITF:
-                    pItf = XAEqualizerItfImpl_Create(pImpl->adaptationCtx);
+                    pItf = XAEqualizerItfImpl_Create(pImpl->curAdaptCtx);
                     break;
                 case MP_IMAGECONTROLSITF:
-                    pItf = XAImageControlsItfImpl_Create(pImpl->adaptationCtx);
+                    pItf = XAImageControlsItfImpl_Create(pImpl->curAdaptCtx);
                     break;
                 case MP_IMAGEEFFECTSITF:
-                    pItf = XAImageEffectsItfImpl_Create(pImpl->adaptationCtx);
+                    pItf = XAImageEffectsItfImpl_Create(pImpl->curAdaptCtx);
                     break;
                 case MP_VIDEOPOSTPROCESSINGITF:
-                    pItf = XAVideoPostProcessingItfImpl_Create(pImpl->adaptationCtx);
-#endif
+                    pItf = XAVideoPostProcessingItfImpl_Create(pImpl->curAdaptCtx);
+                    break;
+               case MP_NOKIAVOLUMEEXT:
+                    pItf = XANokiaVolumeExtItfImpl_Create(pImpl->curAdaptCtx);
                     break;
+               case MP_NOKIALINEARVOLUME:
+                    pItf = XANokiaLinearVolumeItfImpl_Create(pImpl->curAdaptCtx);
+                    break;                                        
+                case MP_STREAMINFORMATIONITF:
+                    pItf = XAStreamInformationItfImpl_Create(pImpl->curAdaptCtx);
+                    break;                    
                 default:
                     break;
             }
@@ -425,15 +448,13 @@
         }
     }
     /* init adaptation */
-    if(pImpl->isMMFPlayback)
+    if(pImpl->curAdaptCtx->fwtype == FWMgrFWMMF)
     {
-       ret = XAMediaPlayerAdaptMMF_PostInit( pImpl->adaptationCtxMMF );
+       ret = XAMediaPlayerAdaptMMF_PostInit( (XAAdaptationMMFCtx*)pImpl->adaptationCtxMMF );
     }
     else
     {
-#ifdef _GSTREAMER_BACKEND_
-       ret = XAMediaPlayerAdapt_PostInit( pImpl->adaptationCtx );
-#endif
+       ret = XAMediaPlayerAdapt_PostInit( (XAAdaptationGstCtx*)pImpl->adaptationCtxGst );
     }
     if ( ret != XA_RESULT_SUCCESS )
     {
@@ -469,16 +490,11 @@
 {
     XAObjectItfImpl* pObj = (XAObjectItfImpl*)(*self);
     XAuint8 itfIdx = 0;
-
+    XAMediaPlayerImpl* pImpl = (XAMediaPlayerImpl*)pObj;
     DEBUG_API("->XAMediaPlayerImpl_FreeResources");
     XA_IMPL_THREAD_SAFETY_ENTRY_FOR_VOID_FUNCTIONS( XATSMediaPlayer );
-#ifdef _GSTREAMER_BACKEND_
-    XAMediaPlayerImpl* pImpl = (XAMediaPlayerImpl*)pObj;
+
     assert(pObj && pImpl && pObj == pObj->self);
-#endif
-
-    
-
     for(itfIdx = 0; itfIdx < MP_ITFCOUNT; itfIdx++)
     {
         void *pItf = pObj->interfaceMap[itfIdx].pItf;
@@ -528,17 +544,33 @@
                 case MP_VIDEOPOSTPROCESSINGITF:
                     XAVideoPostProcessingItfImpl_Free(pItf);
                     break;
+                case MP_NOKIAVOLUMEEXT:
+                    XANokiaVolumeExtItfImpl_Free(pItf);
+                    break;
+                case MP_NOKIALINEARVOLUME:
+                    XANokiaLinearVolumeItfImpl_Free(pItf);
+                    break;                                        
+                case MP_STREAMINFORMATIONITF:
+                    XAStreamInformationItfImpl_Free(pItf);
+                    break;
+                    
             }
             pObj->interfaceMap[itfIdx].pItf = NULL;
         }
     }
-#ifdef _GSTREAMER_BACKEND_
-    if ( pImpl->adaptationCtx != NULL )
-    {
-        XAMediaPlayerAdapt_Destroy( pImpl->adaptationCtx );
-        pImpl->adaptationCtx = NULL;
-    }
-#endif
+    
+    if(pImpl->curAdaptCtx)
+        {
+        if(pImpl->curAdaptCtx->fwtype == FWMgrFWMMF)
+            {
+            XAMediaPlayerAdaptMMF_Destroy( (XAAdaptationMMFCtx*)pImpl->adaptationCtxMMF );
+            }
+        else
+            {
+            XAMediaPlayerAdapt_Destroy( (XAAdaptationGstCtx*)pImpl->adaptationCtxGst );
+            }
+        }
+
     XA_IMPL_THREAD_SAFETY_EXIT_FOR_VOID_FUNCTIONS( XATSMediaPlayer );
     DEBUG_API("<-XAMediaPlayerImpl_FreeResources");
     return;
@@ -549,10 +581,10 @@
  */
 XAresult XAMediaPlayerImpl_DoAddItf(XAObjectItf self, XAObjItfMapEntry *mapEntry  )
 {
-#ifdef _GSTREAMER_BACKEND_  
+  
     XAObjectItfImpl* pObj = (XAObjectItfImpl*)(*self);
     XAMediaPlayerImpl* pImpl = (XAMediaPlayerImpl*)(pObj);
-#endif
+
     XAresult ret = XA_RESULT_SUCCESS;
     DEBUG_API("->XAMediaPlayerImpl_DoAddItf");
 
@@ -560,23 +592,23 @@
     {
         switch( mapEntry->mapIdx )
             {
-#ifdef _GSTREAMER_BACKEND_  
+  
             case MP_METADATAEXTRACTIONITF:
-                mapEntry->pItf = XAMetadataExtractionItfImpl_Create( pImpl->adaptationCtx );
+                mapEntry->pItf = XAMetadataExtractionItfImpl_Create( pImpl->curAdaptCtx );
                 break;
             case MP_METADATATRAVERSALITF:
-                mapEntry->pItf = XAMetadataTraversalItfImpl_Create( pImpl->adaptationCtx );
+                mapEntry->pItf = XAMetadataTraversalItfImpl_Create( pImpl->curAdaptCtx );
                 break;
             case MP_PLAYBACKRATEITF:
-                mapEntry->pItf = XAPlaybackRateItfImpl_Create(pImpl->adaptationCtx);
+                mapEntry->pItf = XAPlaybackRateItfImpl_Create(pImpl);
                 break;
             case MP_EQUALIZERITF:
-                mapEntry->pItf = XAEqualizerItfImpl_Create( pImpl->adaptationCtx );
+                mapEntry->pItf = XAEqualizerItfImpl_Create( pImpl->curAdaptCtx );
                 break;
             case MP_IMAGEEFFECTSITF:
-                mapEntry->pItf = XAImageEffectsItfImpl_Create( pImpl->adaptationCtx );
+                mapEntry->pItf = XAImageEffectsItfImpl_Create( pImpl->curAdaptCtx );
                 break;
-#endif
+
             default:
                 DEBUG_ERR("XAMediaPlayerImpl_DoAddItf unknown id");
                 ret = XA_RESULT_FEATURE_UNSUPPORTED;
@@ -653,30 +685,4 @@
     DEBUG_API("<-XAMediaPlayerImpl_DoRemoveItf");
     return ret;
 }
-XAresult XAMediaPlayerImpl_DeterminePlaybackEngine(XAObjectItf self, XADataLocator_URI *uri)
-{
- 
-  XAresult ret = XA_RESULT_SUCCESS;
-  char* tempPtr = NULL;
-  char extension[5];
-  
-  XAObjectItfImpl* pObj = (XAObjectItfImpl*)(*self);
-  XAMediaPlayerImpl* pImpl = (XAMediaPlayerImpl*)pObj;
-  DEBUG_API("->XAMediaPlayerImpl_DeterminePlaybackEngine");
-    
-  //need to move to configuration file and add more in final class
-  
-  pImpl->isMMFPlayback = XA_BOOLEAN_TRUE;
-	
-  tempPtr = strchr((char*)(uri->URI), '.');
-  strcpy(extension, tempPtr);
-	
-  if(!strcmp(extension, ".wav"))
-  {
-     pImpl->isMMFPlayback = XA_BOOLEAN_FALSE;
-  }
 
-  DEBUG_API("<-XAMediaPlayerImpl_DeterminePlaybackEngine"); 
-  return ret;  
-  
-}