blob: 30dae85a3dbe0242dc0ccabe4f88090ca001dab8 [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 PacketVideo
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the License for the specific language governing permissions
* and limitations under the License.
* -------------------------------------------------------------------
*/
#ifndef PVMF_JB_EVENT_NOTIFIER_H
#define PVMF_JB_EVENT_NOTIFIER_H
#ifndef OSCL_BASE_H_INCLUDED
#include "oscl_base.h"
#endif
#ifndef PVLOGGER_H_INCLUDED
#include "pvlogger.h"
#endif
#ifndef PVMF_MEDIA_CLOCK_H_INCLUDED
#include "pvmf_media_clock.h"
#endif
#ifndef PVMF_JITTER_BUFFER_COMMON_INTERNAL_H
#include "pvmf_jitter_buffer_common_internal.h"
#endif
enum CLOCK_NOTIFICATION_INTF_TYPE
{
CLOCK_NOTIFICATION_INTF_TYPE_UNKNOWN,
CLOCK_NOTIFICATION_INTF_TYPE_NONDECREASING,
CLOCK_NOTIFICATION_INTF_TYPE_CLIENTPLAYBACK,
CLOCK_NOTIFICATION_INTF_TYPE_ESTIMATEDSERVER
};
class PVMFJBEventNotifierObserver
{
public:
virtual void ProcessCallback(CLOCK_NOTIFICATION_INTF_TYPE aClockNotificationInterfaceType, uint32 aCallBkId, const OsclAny* aContext, PVMFStatus aStatus) = 0;
};
class PVMFJBEventNotificationRequestInfo;
class PVMFJBEventNotifierRequestInfo
{
public:
PVMFJBEventNotifierRequestInfo(): ipRequestInfo(NULL)
, iCallBackId(0) {}
PVMFJBEventNotificationRequestInfo* ipRequestInfo;
uint32 iCallBackId;
};
class NonDecClkNotificationInterfaceObserver: public PVMFMediaClockNotificationsObs
{
public:
NonDecClkNotificationInterfaceObserver(Oscl_Vector<PVMFJBEventNotifierRequestInfo*, OsclMemAllocator>& aJBEvntNtfrRequestInfoVectNonDecClk)
: irJBEvntNtfrRequestInfoVectNonDecClk(aJBEvntNtfrRequestInfoVectNonDecClk)
{
ipLogger = PVLogger::GetLoggerObject("PVMFJBEventNotifier");
}
void ProcessCallBack(uint32 aCallBackID, PVTimeComparisonUtils::MediaTimeStatus aTimerAccuracy, uint32 aDelta, const OsclAny* aContextData, PVMFStatus aStatus);
virtual void NotificationsInterfaceDestroyed();
private:
Oscl_Vector<PVMFJBEventNotifierRequestInfo*, OsclMemAllocator>& irJBEvntNtfrRequestInfoVectNonDecClk;
PVLogger* ipLogger;
};
class EstimatedSrvrClkNotificationInterfaceObserver: public PVMFMediaClockNotificationsObs
{
public:
EstimatedSrvrClkNotificationInterfaceObserver(Oscl_Vector<PVMFJBEventNotifierRequestInfo*, OsclMemAllocator>& aJBEvntNtfrRequestInfoVectEstimatedServClk)
: irJBEvntNtfrRequestInfoVectEstimatedServClk(aJBEvntNtfrRequestInfoVectEstimatedServClk)
{
ipLogger = PVLogger::GetLoggerObject("PVMFJBEventNotifier");
}
void ProcessCallBack(uint32 aCallBackID, PVTimeComparisonUtils::MediaTimeStatus aTimerAccuracy, uint32 aDelta, const OsclAny* aContextData, PVMFStatus aStatus);
virtual void NotificationsInterfaceDestroyed();
private:
Oscl_Vector<PVMFJBEventNotifierRequestInfo*, OsclMemAllocator>& irJBEvntNtfrRequestInfoVectEstimatedServClk;
PVLogger* ipLogger;
};
class ClientPlaybackClkNotificationInterfaceObserver: public PVMFMediaClockNotificationsObs
{
public:
ClientPlaybackClkNotificationInterfaceObserver(Oscl_Vector<PVMFJBEventNotifierRequestInfo*, OsclMemAllocator>& aJBEvntNtfrRequestInfoVectClientPlaybackClk):
irJBEvntNtfrRequestInfoVectClientPlaybackClk(aJBEvntNtfrRequestInfoVectClientPlaybackClk)
{
ipLogger = PVLogger::GetLoggerObject("PVMFJBEventNotifier");
}
void ProcessCallBack(uint32 aCallBackID, PVTimeComparisonUtils::MediaTimeStatus aTimerAccuracy, uint32 aDelta, const OsclAny* aContextData, PVMFStatus aStatus);
virtual void NotificationsInterfaceDestroyed();
private:
Oscl_Vector<PVMFJBEventNotifierRequestInfo*, OsclMemAllocator>& irJBEvntNtfrRequestInfoVectClientPlaybackClk;
PVLogger* ipLogger;
};
class PVMFJBEventNotificationRequestInfo
{
public:
PVMFJBEventNotificationRequestInfo(CLOCK_NOTIFICATION_INTF_TYPE aClockNotificationsIntfType, PVMFJBEventNotifierObserver* aObserver, OsclAny* aContext = NULL)
: iClockNotificationIntfType(aClockNotificationsIntfType)
, ipObserver(aObserver)
, ipContext(aContext)
{
}
PVMFJBEventNotificationRequestInfo(const PVMFJBEventNotificationRequestInfo& aJBNotificationReqinfo)
{
iClockNotificationIntfType = aJBNotificationReqinfo.iClockNotificationIntfType;
ipObserver = aJBNotificationReqinfo.ipObserver;
ipContext = aJBNotificationReqinfo.ipContext;
}
const OsclAny* GetContextData() const
{
return ipContext;
}
CLOCK_NOTIFICATION_INTF_TYPE GetMediaClockNotificationsInterfaceType() const
{
return iClockNotificationIntfType;
}
PVMFJBEventNotifierObserver* GetObserver() const
{
return ipObserver;
}
private:
CLOCK_NOTIFICATION_INTF_TYPE iClockNotificationIntfType;
PVMFJBEventNotifierObserver* ipObserver;
const OsclAny* ipContext;
};
class PVMFJBEventNotifier
{
public:
OSCL_IMPORT_REF static PVMFJBEventNotifier* New(PVMFMediaClock& aNonDecreasingClock, PVMFMediaClock& aClientPlaybackClock, PVMFMediaClock& aEstimatedServerClock);
OSCL_IMPORT_REF bool RequestCallBack(const PVMFJBEventNotificationRequestInfo& aNotificationRequestInfo, uint32 aDelay, uint32& aCallBkId);
OSCL_IMPORT_REF bool RequestAbsoluteTimeCallBack(const PVMFJBEventNotificationRequestInfo& aNotificationRequestInfo, uint32 aAbsoluteTime, uint32& aCallBkId);
OSCL_IMPORT_REF void CancelCallBack(const PVMFJBEventNotificationRequestInfo& aNotificationRequestInfo, uint32 aCallBkId);
OSCL_IMPORT_REF void CancelAllPendingCallbacks(CLOCK_NOTIFICATION_INTF_TYPE aType, PVMFJBEventNotifierObserver* aObserver = NULL);
OSCL_IMPORT_REF void CancelAllPendingCallbacks();
OSCL_IMPORT_REF ~PVMFJBEventNotifier();
private:
/**
*/
PVMFJBEventNotifier(PVMFMediaClock& aNonDecreasingClock, PVMFMediaClock& aClientPlaybackClock, PVMFMediaClock& aEstimatedServerClock)
: irNonDecreasingClock(aNonDecreasingClock)
, irClientPlaybackClock(aClientPlaybackClock)
, irEstimatedServerClock(aEstimatedServerClock)
, ipNonDecreasingClockNotificationsInf(NULL)
, ipClientPlayBackClockNotificationsInf(NULL)
, ipEstimatedClockNotificationsInf(NULL)
, ipNonDecreasingClkNotificationInterfaceObserver(NULL)
, ipClientPlaybackClkNotificationInterfaceObserver(NULL)
, ipEstimatedSrvrClkNotificationInterfaceObserver(NULL)
{}
//Can leave: Yes
//Possible leave code (s): OsclErrNoMemory
void Construct();
void CleanUp();
void CancelCallBack(CLOCK_NOTIFICATION_INTF_TYPE aType, PVMFJBEventNotifierObserver* aObserver, uint32& aCallBkId);
PVMFMediaClock& irNonDecreasingClock;
PVMFMediaClock& irClientPlaybackClock;
PVMFMediaClock& irEstimatedServerClock;
//Notification interfaces
PVMFMediaClockNotificationsInterface* ipNonDecreasingClockNotificationsInf;
PVMFMediaClockNotificationsInterface* ipClientPlayBackClockNotificationsInf;
PVMFMediaClockNotificationsInterface* ipEstimatedClockNotificationsInf;
NonDecClkNotificationInterfaceObserver* ipNonDecreasingClkNotificationInterfaceObserver;
ClientPlaybackClkNotificationInterfaceObserver* ipClientPlaybackClkNotificationInterfaceObserver;
EstimatedSrvrClkNotificationInterfaceObserver* ipEstimatedSrvrClkNotificationInterfaceObserver;
//Todo: Need to consider data structure for efficeincy of removing elements in between (linked list?)
Oscl_Vector<PVMFJBEventNotifierRequestInfo*, OsclMemAllocator> iJBEvntNtfrRequestInfoVectEstimatedServClk;
Oscl_Vector<PVMFJBEventNotifierRequestInfo*, OsclMemAllocator> iJBEvntNtfrRequestInfoVectClientPlaybackClk;
Oscl_Vector<PVMFJBEventNotifierRequestInfo*, OsclMemAllocator> iJBEvntNtfrRequestInfoVectNonDecClk;
PVLogger* ipLogger;
};
#endif