khronosfws/openmax_al/src/mediaplayer/xaprefetchstatusitf.c
changeset 12 5a06f39ad45b
child 16 43d09473c595
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/khronosfws/openmax_al/src/mediaplayer/xaprefetchstatusitf.c	Fri Apr 16 15:29:42 2010 +0300
@@ -0,0 +1,276 @@
+/*
+* 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: 
+*
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#include "xaprefetchstatusitf.h"
+#ifdef _GSTREAMER_BACKEND_
+#include "XAAdaptationContextBase.h"
+#endif
+
+static XAPrefetchStatusItfImpl* GetImpl(XAPrefetchStatusItf self)
+{
+    if(self)
+    {
+        XAPrefetchStatusItfImpl* impl = (XAPrefetchStatusItfImpl*)(*self);
+        if(impl && impl == impl->self)
+        {
+            return impl;
+        }
+    }
+    return NULL;
+}
+
+XAresult XAPrefetchStatusItfImpl_GetPrefetchStatus(XAPrefetchStatusItf self,
+                                                   XAuint32 *pStatus)
+{
+    XAresult ret = XA_RESULT_SUCCESS;
+    XAPrefetchStatusItfImpl *impl = GetImpl(self);
+    DEBUG_API("->XAPrefetchStatusItfImpl_GetPrefetchStatus");
+
+    if(!impl || !pStatus )
+    {
+        /* invalid parameter */
+        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
+        DEBUG_API("<-XAPrefetchStatusItfImpl_GetPrefetchStatus");
+        return XA_RESULT_PARAMETER_INVALID;
+    }
+
+    *pStatus = impl->pStatus;
+
+    DEBUG_API("<-XAPrefetchStatusItfImpl_GetPrefetchStatus");
+    return ret;
+}
+
+XAresult XAPrefetchStatusItfImpl_GetFillLevel(XAPrefetchStatusItf self,
+                                              XApermille *pLevel)
+{
+    XAresult ret = XA_RESULT_SUCCESS;
+    XAPrefetchStatusItfImpl *impl = GetImpl(self);
+    DEBUG_API("->XAPrefetchStatusItfImpl_GetFillLevel");
+
+    if(!impl || !pLevel)
+    {
+        /* invalid parameter */
+        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
+        DEBUG_API("<-XAPrefetchStatusItfImpl_GetFillLevel");
+        return XA_RESULT_PARAMETER_INVALID;
+    }
+
+    *pLevel = impl->pLevel;
+
+    DEBUG_API("<-XAPrefetchStatusItfImpl_GetFillLevel");
+    return ret;
+}
+
+XAresult XAPrefetchStatusItfImpl_RegisterCallback(XAPrefetchStatusItf self,
+                                                  xaPrefetchCallback callback,
+                                                  void *pContext)
+{
+    XAresult ret = XA_RESULT_SUCCESS;
+    XAPrefetchStatusItfImpl *impl = GetImpl(self);
+    DEBUG_API("->XAPrefetchStatusItfImpl_RegisterCallback");
+
+    if(!impl)
+    {
+        /* invalid parameter */
+        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
+        DEBUG_API("<-XAPrefetchStatusItfImpl_RegisterCallback");
+        return XA_RESULT_PARAMETER_INVALID;
+    }
+
+    /* Can be null to reset callback */
+    impl->callback = callback;
+    impl->cbcontext = pContext;
+    impl->cbPtrToSelf = self;
+
+    DEBUG_API("<-XAPrefetchStatusItfImpl_RegisterCallback");
+    return ret;
+}
+
+XAresult XAPrefetchStatusItfImpl_SetCallbackEventsMask(XAPrefetchStatusItf self,
+                                                       XAuint32 eventFlags)
+{
+    XAresult ret = XA_RESULT_SUCCESS;
+    XAPrefetchStatusItfImpl *impl = GetImpl(self);
+    DEBUG_API("->XAPrefetchStatusItfImpl_SetCallbackEventsMask");
+
+    if(!impl  )
+    {
+        /* invalid parameter */
+        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
+        DEBUG_API("<-XAPrefetchStatusItfImpl_SetCallbackEventsMask");
+        return XA_RESULT_PARAMETER_INVALID;
+    }
+
+    impl->eventFlags = eventFlags;
+
+    DEBUG_API("<-XAPrefetchStatusItfImpl_SetCallbackEventsMask");
+    return ret;
+}
+
+XAresult XAPrefetchStatusItfImpl_GetCallbackEventsMask(XAPrefetchStatusItf self,
+                                                       XAuint32 *pEventFlags)
+{
+    XAresult ret = XA_RESULT_SUCCESS;
+    XAPrefetchStatusItfImpl *impl = GetImpl(self);
+    DEBUG_API("->XAPrefetchStatusItfImpl_GetCallbackEventsMask");
+
+    if(!impl || !pEventFlags)
+    {
+        /* invalid parameter */
+        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
+        DEBUG_API("<-XAPrefetchStatusItfImpl_GetCallbackEventsMask");
+        return XA_RESULT_PARAMETER_INVALID;
+    }
+
+    *pEventFlags = impl->eventFlags;
+
+    DEBUG_API("<-XAPrefetchStatusItfImpl_GetCallbackEventsMask");
+    return ret;
+}
+
+XAresult XAPrefetchStatusItfImpl_SetFillUpdatePeriod(XAPrefetchStatusItf self,
+                                                     XApermille period)
+{
+    XAresult ret = XA_RESULT_SUCCESS;
+    XAPrefetchStatusItfImpl *impl = GetImpl(self);
+    DEBUG_API("->XAPrefetchStatusItfImpl_SetFillUpdatePeriod");
+
+    if(!impl || period == 0 || period > 1000 )
+    {
+        /* invalid parameter */
+        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
+        DEBUG_API("<-XAPrefetchStatusItfImpl_SetFillUpdatePeriod");
+        return XA_RESULT_PARAMETER_INVALID;
+    }
+
+    impl->fillUpdatePeriod = period;
+
+    DEBUG_API("<-XAPrefetchStatusItfImpl_SetFillUpdatePeriod");
+    return ret;
+}
+
+XAresult XAPrefetchStatusItfImpl_GetFillUpdatePeriod(XAPrefetchStatusItf self,
+                                                     XApermille *pPeriod)
+{
+    XAresult ret = XA_RESULT_SUCCESS;
+    XAPrefetchStatusItfImpl *impl = GetImpl(self);
+    DEBUG_API("->XAPrefetchStatusItfImpl_GetFillUpdatePeriod");
+
+    if(!impl || !pPeriod)
+    {
+        /* invalid parameter */
+        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
+        DEBUG_API("<-XAPrefetchStatusItfImpl_GetFillUpdatePeriod");
+        return XA_RESULT_PARAMETER_INVALID;
+    }
+
+    *pPeriod = impl->fillUpdatePeriod;
+
+    DEBUG_API("<-XAPrefetchStatusItfImpl_GetFillUpdatePeriod");
+    return ret;
+}
+
+#ifdef _GSTREAMER_BACKEND_
+
+/*
+ * implementation-specific methods
+ */
+XAPrefetchStatusItfImpl* XAPrefetchStatusItfImpl_Create( XAAdaptationBaseCtx* adaptationCtx )
+{
+    XAPrefetchStatusItfImpl *self = (XAPrefetchStatusItfImpl*)
+        calloc(1,sizeof(XAPrefetchStatusItfImpl));
+    DEBUG_API("->XAPrefetchStatusItfImpl_Create");
+
+    if(self)
+    {
+        /* init itf default implementation */
+        self->itf.GetCallbackEventsMask = XAPrefetchStatusItfImpl_GetCallbackEventsMask;
+        self->itf.GetFillLevel = XAPrefetchStatusItfImpl_GetFillLevel;
+        self->itf.GetFillUpdatePeriod = XAPrefetchStatusItfImpl_GetFillUpdatePeriod;
+        self->itf.GetPrefetchStatus = XAPrefetchStatusItfImpl_GetPrefetchStatus;
+        self->itf.RegisterCallback = XAPrefetchStatusItfImpl_RegisterCallback;
+        self->itf.SetCallbackEventsMask = XAPrefetchStatusItfImpl_SetCallbackEventsMask;
+        self->itf.SetFillUpdatePeriod = XAPrefetchStatusItfImpl_SetFillUpdatePeriod;
+
+        self->callback = NULL;
+        self->cbcontext = NULL;
+        self->eventFlags = 0;
+        self->fillUpdatePeriod = PREFETCHSTATUSITF_DEFAULT_UPDATE_PERIOD;
+        self->pStatus = XA_PREFETCHSTATUS_SUFFICIENTDATA;
+        self->adaptationCtx = adaptationCtx;
+        self->cbPtrToSelf = NULL;
+
+        XAAdaptationBase_AddEventHandler( adaptationCtx, &XAPrefetchStatusItfImpl_AdaptCb, XA_PREFETCHITFEVENTS, self );
+
+        self->self = self;
+    }
+
+    DEBUG_API("<-XAPrefetchStatusItfImpl_Create");
+    return self;
+}
+#endif
+
+void XAPrefetchStatusItfImpl_Free(XAPrefetchStatusItfImpl* self)
+{
+    DEBUG_API("->XAPrefetchStatusItfImpl_Free");
+    assert(self==self->self);
+#ifdef _GSTREAMER_BACKEND_
+    XAAdaptationBase_RemoveEventHandler( (XAAdaptationBaseCtx*)self->adaptationCtx, &XAPrefetchStatusItfImpl_AdaptCb );
+#endif    
+    free(self);
+    DEBUG_API("<-XAPrefetchStatusItfImpl_Free");
+}
+
+#ifdef _GSTREAMER_BACKEND_
+
+/* void XAPrefetchStatusItfImpl_AdaptCb
+ * Description: Listen changes in adaptation
+ */
+void XAPrefetchStatusItfImpl_AdaptCb( void *pHandlerCtx, XAAdaptEvent *event )
+{
+    XAPrefetchStatusItfImpl* impl = (XAPrefetchStatusItfImpl*)pHandlerCtx;
+    DEBUG_API("->XAPrefetchStatusItfImpl_AdaptCb");
+    if(!impl)
+    {
+        DEBUG_ERR("XAPrefetchStatusItfImpl_AdaptCb, invalid context pointer!");
+        DEBUG_API("<-XAPrefetchStatusItfImpl_AdaptCb");
+        return;
+    }
+    assert(event);
+    if( event->eventid == XA_ADAPT_BUFFERING )
+    {
+        /* Adaptation sends percents convert it to permille */
+        impl->fillUpdatePeriod = ((*(XAint32*)(event->data))*10);
+
+        /*Check do we have to send event */
+        if( impl->callback && impl->eventFlags & XA_PREFETCHEVENT_FILLLEVELCHANGE )
+        {
+            if ( (*(XAint32*)event->data) >  impl->fillUpdatePeriod / 10 )
+            {
+                impl->callback(impl->cbPtrToSelf, impl->cbcontext, XA_PREFETCHEVENT_FILLLEVELCHANGE);
+            }
+        }
+    }
+
+    DEBUG_API("<-XAPrefetchStatusItfImpl_AdaptCb");
+}
+#endif
+