diff -r a36789189b53 -r 095bea5f582e khronosfws/openmax_al/src/mediaplayer/xaprefetchstatusitf.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/khronosfws/openmax_al/src/mediaplayer/xaprefetchstatusitf.c Tue Aug 31 15:43:02 2010 +0300 @@ -0,0 +1,269 @@ +/* +* 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 +#include +#include + +#include "xaprefetchstatusitf.h" + +#include "xaadaptationgst.h" + + +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; +} + +/* + * implementation-specific methods + */ +XAPrefetchStatusItfImpl* XAPrefetchStatusItfImpl_Create( XAMediaPlayerImpl* impl ) +{ + 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 = impl->curAdaptCtx; + self->cbPtrToSelf = NULL; + + XAAdaptationBase_AddEventHandler( self->adaptationCtx, &XAPrefetchStatusItfImpl_AdaptCb, XA_PREFETCHITFEVENTS, self ); + + self->self = self; + } + + DEBUG_API("<-XAPrefetchStatusItfImpl_Create"); + return self; +} + + +void XAPrefetchStatusItfImpl_Free(XAPrefetchStatusItfImpl* self) +{ + DEBUG_API("->XAPrefetchStatusItfImpl_Free"); + assert(self==self->self); + XAAdaptationBase_RemoveEventHandler( (XAAdaptationBaseCtx*)self->adaptationCtx, &XAPrefetchStatusItfImpl_AdaptCb ); + free(self); + DEBUG_API("<-XAPrefetchStatusItfImpl_Free"); +} + +/* 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"); +} +