blob: be6b16d0b2e0be5f5b9a70d9ba22cef0fc2c13d1 [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 PV_PLAYER_ENGINE_H_INCLUDED
#define PV_PLAYER_ENGINE_H_INCLUDED
#ifndef OSCL_BASE_H_INCLUDED
#include "oscl_base.h"
#endif
#ifndef OSCL_MEM_H_INCLUDED
#include "oscl_mem.h"
#endif
#ifndef OSCL_SCHEDULER_AO_H_INCLUDED
#include "oscl_scheduler_ao.h"
#endif
#ifndef OSCL_VECTOR_H_INCLUDED
#include "oscl_vector.h"
#endif
#ifndef OSCL_PRIQUEUE_H_INCLUDED
#include "oscl_priqueue.h"
#endif
#ifndef PVMF_MEDIA_CLOCK_H_INCLUDED
#include "pvmf_media_clock.h"
#endif
#ifndef PV_ENGINE_TYPES_H_INCLUDED
#include "pv_engine_types.h"
#endif
#ifndef PV_PLAYER_DATASOURCE_H_INCLUDED
#include "pv_player_datasource.h"
#endif
#ifndef PV_PLAYER_DATASINK_H_INCLUDED
#include "pv_player_datasink.h"
#endif
#ifndef PV_PLAYER_INTERFACE_H_INCLUDED
#include "pv_player_interface.h"
#endif
#ifndef PV_ENGINE_OBSERVER_H_INCLUDED
#include "pv_engine_observer.h"
#endif
#ifndef PVMF_NODE_INTERFACE_H_INCLUDED
#include "pvmf_node_interface.h"
#endif
#ifndef PV_PLAYER_DATAPATH_H_INCLUDED
#include "pv_player_datapath.h"
#endif
#ifndef PV_PLAYER_NODE_REGISTRY_H_INCLUDED
#include "pv_player_node_registry.h"
#endif
#ifndef PVMF_META_DATA_TYPES_H_INCLUDED
#include "pvmf_meta_data_types.h"
#endif
#ifndef PVMF_META_DATA_EXTENSION_H_INCLUDED
#include "pvmf_meta_data_extension.h"
#endif
#ifndef PVMF_DATA_SOURCE_INIT_EXTENSION_H_INCLUDED
#include "pvmf_data_source_init_extension.h"
#endif
#ifndef PVMF_MEDIA_PRESENTATION_INFO_H_INCLUDED
#include "pvmf_media_presentation_info.h"
#endif
#ifndef OSCL_TIMER_H_INCLUDED
#include "oscl_timer.h"
#endif
#ifndef OSCL_MEM_MEMPOOL_H_INCLUDED
#include "oscl_mem_mempool.h"
#endif
#ifndef PVMI_CONFIG_AND_CAPABILITY_H_INCLUDED
#include "pvmi_config_and_capability.h"
#endif
#ifndef PV_PLAYER_LICENSE_ACQUISITION_INTERFACE_H_INCLUDED
#include "pv_player_license_acquisition_interface.h"
#endif
#ifndef PVMF_DATA_SOURCE_PLAYBACK_CONTROL_H_INCLUDED
#include "pvmf_data_source_playback_control.h"
#endif
#ifndef PV_PLAYER_TRACK_SELECTION_INTERFACE_H_INCLUDED
#include "pv_player_track_selection_interface.h"
#endif
#ifndef PV_PLAYER_REGISTRY_INTERFACE_H_INCLUDED
#include "pv_player_registry_interface.h"
#endif
#include "threadsafe_queue.h"
/**
* PVPlayerEngineState enum
*
* Enumeration of internal pvPlayer engine state.
*
**/
typedef enum
{
PVP_ENGINE_STATE_IDLE = 1,
PVP_ENGINE_STATE_INITIALIZING,
PVP_ENGINE_STATE_INITIALIZED,
PVP_ENGINE_STATE_PREPARING,
PVP_ENGINE_STATE_TRACK_SELECTION_1_DONE,
PVP_ENGINE_STATE_TRACK_SELECTION_2_DONE,
PVP_ENGINE_STATE_TRACK_SELECTION_3_DONE,
PVP_ENGINE_STATE_PREPARED,
PVP_ENGINE_STATE_STARTING,
PVP_ENGINE_STATE_STARTED,
PVP_ENGINE_STATE_AUTO_PAUSING,
PVP_ENGINE_STATE_AUTO_PAUSED,
PVP_ENGINE_STATE_AUTO_RESUMING,
PVP_ENGINE_STATE_PAUSING,
PVP_ENGINE_STATE_PAUSED,
PVP_ENGINE_STATE_RESUMING,
PVP_ENGINE_STATE_STOPPING,
PVP_ENGINE_STATE_RESETTING,
PVP_ENGINE_STATE_ERROR
} PVPlayerEngineState;
typedef union PVPlayerEngineCommandParamUnion
{
bool bool_value;
float float_value;
double double_value;
uint8 uint8_value;
int32 int32_value;
uint32 uint32_value;
PVPPlaybackPosition playbackpos_value;
oscl_wchar* pWChar_value;
char* pChar_value;
uint8* pUint8_value;
int32* pInt32_value;
uint32* pUint32_value;
int64* pInt64_value;
uint64* pUint64_value;
PVPPlaybackPosition* pPlaybackpos_value;
OsclAny* pOsclAny_value;
} _PVPlayerEngineCommandParamUnion;
/**
* PVPlayerEngineCommand Class
*
* PVPlayerEngineCommand class is a data class to hold issued commands inside the player engine
**/
class PVPlayerEngineCommand
{
public:
/**
* The constructor for PVPlayerEngineCommand which allows the data values to be set.
*
* @param aCmdType The command type value for this command. The value is an engine-specific 32-bit value.
* @param aCmdId The command ID assigned by the engine for this command.
* @param aContextData The pointer to the passed-in context data for this command.
*
* @returns None
**/
PVPlayerEngineCommand(int32 aCmdType, PVCommandId aCmdId, OsclAny* aContextData = NULL,
Oscl_Vector<PVPlayerEngineCommandParamUnion, OsclMemAllocator>* aParamVector = NULL, bool aAPICommand = true) :
iCmdType(aCmdType), iCmdId(aCmdId), iContextData(aContextData), iAPICommand(aAPICommand)
{
iParamVector.clear();
if (aParamVector)
{
iParamVector = *aParamVector;
}
}
/**
* The copy constructor for PVPlayerEngineCommand. Used mainly for Oscl_Vector.
*
* @param aCmd The reference to the source PVPlayerEngineCommand to copy the data values from.
*
* @returns None
**/
PVPlayerEngineCommand(const PVPlayerEngineCommand& aCmd)
{
iCmdType = aCmd.iCmdType;
iCmdId = aCmd.iCmdId;
iContextData = aCmd.iContextData;
iAPICommand = aCmd.iAPICommand;
iParamVector = aCmd.iParamVector;
iMimeType = aCmd.iMimeType;
iUuid = aCmd.iUuid;
}
/**
* This function returns the stored command type value.
*
* @returns The signed 32-bit command type value for this command.
**/
int32 GetCmdType()const
{
return iCmdType;
}
/**
* This function returns the stored command ID value.
*
* @returns The PVCommandId value for this command.
**/
PVCommandId GetCmdId()const
{
return iCmdId;
}
/**
* This function returns the stored context data pointer.
*
* @returns The pointer to the context data for this command
**/
OsclAny* GetContext()const
{
return iContextData;
}
/**
* This function tells whether the command is an API command or not
*
* @returns true if API command, false if not.
**/
bool IsAPICommand()const
{
return iAPICommand;
}
/**
* This function returns the command parameter from the specified index.
* If the specified index is not available, empty parameter will be returned
*
* @param aIndex The index of the parameter to return
*
* @returns The stored parameter for this command
**/
PVPlayerEngineCommandParamUnion GetParam(uint32 aIndex)const
{
if (aIndex >= iParamVector.size())
{
PVPlayerEngineCommandParamUnion param;
oscl_memset(&param, 0, sizeof(PVPlayerEngineCommandParamUnion));
return param;
}
else
{
return iParamVector[aIndex];
}
}
/**
* This function returns Mime type parameter for this command
*
* @returns The Mime type parameter for this command
*/
const PvmfMimeString& GetMimeType()const
{
return iMimeType;
}
/**
* This function returns Uuid parameter for this command
*
* @returns The Uuid parameter for this command
*/
PVUuid GetUuid()const
{
return iUuid;
}
/**
* This function stores Mime type parameter of this command
*/
void SetMimeType(const PvmfMimeString& aMimeType)
{
iMimeType = aMimeType;
}
/**
* This function stores the Uuid parameter of this command
*/
void SetUuid(const PVUuid& aUuid)
{
iUuid = aUuid;
}
/**
* Equality operator, for use by OsclPriorityQueue.
*/
bool operator==(const PVPlayerEngineCommand& aCmd) const
{
return iCmdId == aCmd.iCmdId;
}
int32 iCmdType;
PVCommandId iCmdId;
OsclAny* iContextData;
bool iAPICommand;
Oscl_Vector<PVPlayerEngineCommandParamUnion, OsclMemAllocator> iParamVector;
OSCL_HeapString<OsclMemAllocator> iMimeType;
PVUuid iUuid;
};
/**
* PVPlayerEngineCommandType enum
*
* Enumeration of types of commands that can be issued to the pvPlayer.
*
**/
typedef enum
{
// Engine API commands
PVP_ENGINE_COMMAND_GET_SDK_INFO = 1,
PVP_ENGINE_COMMAND_GET_SDK_MODULE_INFO,
PVP_ENGINE_COMMAND_SET_LOG_APPENDER,
PVP_ENGINE_COMMAND_REMOVE_LOG_APPENDER,
PVP_ENGINE_COMMAND_SET_LOG_LEVEL,
PVP_ENGINE_COMMAND_GET_LOG_LEVEL,
PVP_ENGINE_COMMAND_QUERY_UUID,
PVP_ENGINE_COMMAND_QUERY_INTERFACE,
PVP_ENGINE_COMMAND_CANCEL_COMMAND,
PVP_ENGINE_COMMAND_CANCEL_ALL_COMMANDS,
PVP_ENGINE_COMMAND_GET_PVPLAYER_STATE,
PVP_ENGINE_COMMAND_ADD_DATA_SOURCE,
PVP_ENGINE_COMMAND_INIT,
PVP_ENGINE_COMMAND_GET_METADATA_KEY,
PVP_ENGINE_COMMAND_GET_METADATA_VALUE,
PVP_ENGINE_COMMAND_RELEASE_METADATA_VALUE,
PVP_ENGINE_COMMAND_ADD_DATA_SINK,
PVP_ENGINE_COMMAND_SET_PLAYBACK_RANGE,
PVP_ENGINE_COMMAND_GET_PLAYBACK_RANGE,
PVP_ENGINE_COMMAND_GET_CURRENT_POSITION,
PVP_ENGINE_COMMAND_SET_PLAYBACK_RATE,
PVP_ENGINE_COMMAND_GET_PLAYBACK_RATE,
PVP_ENGINE_COMMAND_GET_PLAYBACK_MINMAX_RATE,
PVP_ENGINE_COMMAND_PREPARE,
PVP_ENGINE_COMMAND_START,
PVP_ENGINE_COMMAND_PAUSE,
PVP_ENGINE_COMMAND_RESUME,
PVP_ENGINE_COMMAND_STOP,
PVP_ENGINE_COMMAND_REMOVE_DATA_SINK,
PVP_ENGINE_COMMAND_RESET,
PVP_ENGINE_COMMAND_REMOVE_DATA_SOURCE,
PVP_ENGINE_COMMAND_CAPCONFIG_SET_PARAMETERS,
PVP_ENGINE_COMMAND_ACQUIRE_LICENSE_WCHAR,
PVP_ENGINE_COMMAND_ACQUIRE_LICENSE_CHAR,
PVP_ENGINE_COMMAND_CANCEL_ACQUIRE_LICENSE,
PVP_ENGINE_COMMAND_GET_PVPLAYER_STATE_OOTSYNC,
PVP_ENGINE_COMMAND_GET_CURRENT_POSITION_OOTSYNC,
PVP_ENGINE_COMMAND_CAPCONFIG_SET_OBSERVER_OOTSYNC,
PVP_ENGINE_COMMAND_CAPCONFIG_SET_PARAMETERS_OOTSYNC,
PVP_ENGINE_COMMAND_GET_LICENSE_STATUS_OOTSYNC,
PVP_ENGINE_COMMAND_CAPCONFIG_GET_PARAMETERS_OOTSYNC,
PVP_ENGINE_COMMAND_CAPCONFIG_RELEASE_PARAMETERS_OOTSYNC,
PVP_ENGINE_COMMAND_CAPCONFIG_VERIFY_PARAMETERS_OOTSYNC,
// Internal engine commands
PVP_ENGINE_COMMAND_PAUSE_DUE_TO_ENDTIME_REACHED,
PVP_ENGINE_COMMAND_PAUSE_DUE_TO_ENDOFCLIP,
PVP_ENGINE_COMMAND_PAUSE_DUE_TO_BUFFER_UNDERFLOW,
PVP_ENGINE_COMMAND_RESUME_DUE_TO_BUFFER_DATAREADY,
// Internal Error Handling Commands
PVP_ENGINE_COMMAND_ERROR_HANDLING_ADD_DATA_SOURCE,
PVP_ENGINE_COMMAND_ERROR_HANDLING_INIT,
PVP_ENGINE_COMMAND_ERROR_HANDLING_PREPARE,
PVP_ENGINE_COMMAND_ERROR_HANDLING_PAUSE,
PVP_ENGINE_COMMAND_ERROR_HANDLING_RESUME,
PVP_ENGINE_COMMAND_ERROR_HANDLING_SET_PLAYBACK_RANGE,
PVP_ENGINE_COMMAND_ERROR_HANDLING_SET_PLAYBACK_RATE,
PVP_ENGINE_COMMAND_ERROR_HANDLING_STOP,
PVP_ENGINE_COMMAND_ERROR_HANDLING_CANCEL_ALL_COMMANDS,
PVP_ENGINE_COMMAND_ERROR_HANDLING_GENERAL
} PVPlayerEngineCommandType;
/**
* PVPlayerEngineCommandCompareLess Class
*
* PVPlayerEngineCommandCompareLess class is a utility class to allow the OSCL priority queue perform command priority comparison.
* The class is meant to be used inside the player engine and not exposed to the interface layer or above.
**/
class PVPlayerEngineCommandCompareLess
{
public:
/**
* The algorithm used in OsclPriorityQueue needs a compare function
* that returns true when A's priority is less than B's
* @return true if A's priority is less than B's, else false
*/
int compare(PVPlayerEngineCommand& a, PVPlayerEngineCommand& b) const
{
int a_pri = PVPlayerEngineCommandCompareLess::GetPriority(a);
int b_pri = PVPlayerEngineCommandCompareLess::GetPriority(b);
if (a_pri < b_pri)
{
// Higher priority
return false;
}
else if (a_pri == b_pri)
{
// Same priority so look at the command ID to maintain FIFO
return (a.GetCmdId() > b.GetCmdId());
}
else
{
// Lower priority
return true;
}
}
/**
* Returns the priority of each command
* @return A 0-based priority number. A lower number indicates higher priority.
*/
static int GetPriority(PVPlayerEngineCommand& aCmd)
{
switch (aCmd.GetCmdType())
{
case PVP_ENGINE_COMMAND_GET_SDK_INFO:
return 5;
case PVP_ENGINE_COMMAND_GET_SDK_MODULE_INFO:
return 5;
case PVP_ENGINE_COMMAND_SET_LOG_APPENDER:
return 5;
case PVP_ENGINE_COMMAND_REMOVE_LOG_APPENDER:
return 5;
case PVP_ENGINE_COMMAND_SET_LOG_LEVEL:
return 5;
case PVP_ENGINE_COMMAND_GET_LOG_LEVEL:
return 5;
case PVP_ENGINE_COMMAND_QUERY_UUID:
return 5;
case PVP_ENGINE_COMMAND_QUERY_INTERFACE:
return 5;
case PVP_ENGINE_COMMAND_CANCEL_COMMAND:
case PVP_ENGINE_COMMAND_CANCEL_ALL_COMMANDS:
return 3;
case PVP_ENGINE_COMMAND_GET_PVPLAYER_STATE:
return 5;
case PVP_ENGINE_COMMAND_ADD_DATA_SOURCE:
return 5;
case PVP_ENGINE_COMMAND_INIT:
return 5;
case PVP_ENGINE_COMMAND_GET_METADATA_KEY:
return 5;
case PVP_ENGINE_COMMAND_GET_METADATA_VALUE:
return 5;
case PVP_ENGINE_COMMAND_ADD_DATA_SINK:
return 5;
case PVP_ENGINE_COMMAND_SET_PLAYBACK_RANGE:
return 5;
case PVP_ENGINE_COMMAND_GET_PLAYBACK_RANGE:
return 5;
case PVP_ENGINE_COMMAND_GET_CURRENT_POSITION:
return 5;
case PVP_ENGINE_COMMAND_SET_PLAYBACK_RATE:
return 5;
case PVP_ENGINE_COMMAND_GET_PLAYBACK_RATE:
return 5;
case PVP_ENGINE_COMMAND_GET_PLAYBACK_MINMAX_RATE:
return 5;
case PVP_ENGINE_COMMAND_PREPARE:
return 5;
case PVP_ENGINE_COMMAND_START:
return 5;
case PVP_ENGINE_COMMAND_PAUSE:
return 5;
case PVP_ENGINE_COMMAND_RESUME:
return 5;
case PVP_ENGINE_COMMAND_STOP:
return 5;
case PVP_ENGINE_COMMAND_REMOVE_DATA_SINK:
return 5;
case PVP_ENGINE_COMMAND_RESET:
return 5;
case PVP_ENGINE_COMMAND_REMOVE_DATA_SOURCE:
return 5;
case PVP_ENGINE_COMMAND_CAPCONFIG_SET_PARAMETERS:
return 5;
case PVP_ENGINE_COMMAND_ACQUIRE_LICENSE_WCHAR:
return 5;
case PVP_ENGINE_COMMAND_ACQUIRE_LICENSE_CHAR:
return 5;
case PVP_ENGINE_COMMAND_CANCEL_ACQUIRE_LICENSE:
return 3;
case PVP_ENGINE_COMMAND_PAUSE_DUE_TO_ENDTIME_REACHED:
return 4;
case PVP_ENGINE_COMMAND_PAUSE_DUE_TO_ENDOFCLIP:
return 4;
case PVP_ENGINE_COMMAND_PAUSE_DUE_TO_BUFFER_UNDERFLOW:
return 5;
case PVP_ENGINE_COMMAND_RESUME_DUE_TO_BUFFER_DATAREADY:
return 5;
case PVP_ENGINE_COMMAND_ERROR_HANDLING_ADD_DATA_SOURCE:
case PVP_ENGINE_COMMAND_ERROR_HANDLING_INIT:
case PVP_ENGINE_COMMAND_ERROR_HANDLING_PREPARE:
case PVP_ENGINE_COMMAND_ERROR_HANDLING_PAUSE:
case PVP_ENGINE_COMMAND_ERROR_HANDLING_RESUME:
case PVP_ENGINE_COMMAND_ERROR_HANDLING_SET_PLAYBACK_RANGE:
case PVP_ENGINE_COMMAND_ERROR_HANDLING_SET_PLAYBACK_RATE:
case PVP_ENGINE_COMMAND_ERROR_HANDLING_STOP:
case PVP_ENGINE_COMMAND_ERROR_HANDLING_CANCEL_ALL_COMMANDS:
return 1;
default:
return 0;
}
}
};
// Structure to hold the key string info for
// player engine's capability-and-config
struct PVPlayerKeyStringData
{
char iString[64];
PvmiKvpType iType;
PvmiKvpValueType iValueType;
};
// The number of characters to allocate for the key string
#define PVPLAYERCONFIG_KEYSTRING_SIZE 128
// Key string info at the base level ("x-pvmf/player/")
#define PVPLAYERCONFIG_BASE_NUMKEYS 13
const PVPlayerKeyStringData PVPlayerConfigBaseKeys[PVPLAYERCONFIG_BASE_NUMKEYS] =
{
{"pbpos_units", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_CHARPTR},
{"pbpos_interval", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_UINT32},
{"endtimecheck_interval", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_UINT32},
{"seektosyncpoint", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_BOOL},
{"skiptorequestedpos", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_BOOL},
{"syncpointseekwindow", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_UINT32},
{"syncmargin_video", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_RANGE_INT32},
{"syncmargin_audio", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_RANGE_INT32},
{"syncmargin_text", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_RANGE_INT32},
{"nodecmd_timeout", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_UINT32},
{"nodedataqueuing_timeout", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_UINT32},
{"productinfo", PVMI_KVPTYPE_AGGREGATE, PVMI_KVPVALTYPE_KSV},
{"pbpos_enable", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_BOOL}
};
enum PlayerConfigBaseKeys_IndexMap
{
PBPOS_UNITS = 0,
PBPOS_INTERVAL,
ENDTIMECHECK_INTERVAL,
SEEKTOSYNCPOINT,
SKIPTOREQUESTEDPOSITION,
SYNCPOINTSEEKWINDOW,
SYNCMARGIN_VIDEO,
SYNCMARGIN_AUDIO,
SYNCMARGIN_TEXT,
NODECMD_TIMEOUT,
NODEDATAQUEIUING_TIMEOUT,
PRODUCTINFO,
PBPOS_ENABLE
};
// Key string info at the productinfo level ("x-pvmf/player/productinfo/")
#define PVPLAYERCONFIG_PRODINFO_NUMKEYS 5
const PVPlayerKeyStringData PVPlayerConfigProdInfoKeys[PVPLAYERCONFIG_PRODINFO_NUMKEYS] =
{
{"productname", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_CHARPTR},
{"partnumber", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_CHARPTR},
{"hardwareplatform", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_CHARPTR},
{"softwareplatform", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_CHARPTR},
{"device", PVMI_KVPTYPE_VALUE, PVMI_KVPVALTYPE_CHARPTR}
};
enum ProductInfoKeys_IndexMap
{
PRODUCTNAME = 0,
PARTNUMBER,
HARDWAREPLATFORM,
SOFTWAREPLATFORM,
DEVICE
};
// Player engine's timebase with rate change capability
class PVPlayerTimebase : public PVMFTimebase_Tickcount
{
public:
PVPlayerTimebase()
{
iRate = 100000;
iRateChangeTCTime = 0;
iRateChangeTC = 0;
}
~PVPlayerTimebase()
{
}
void GetCurrentTick32(uint32& aTimebaseTickCount, bool& aOverflow)
{
// Retrieve the tickcount time
uint32 tickcount = 0;
PVMFTimebase_Tickcount::GetCurrentTick32(tickcount, aOverflow);
if (aOverflow)
{
aTimebaseTickCount = 0;
return;
}
// Calculate the tickcount since last rate change
uint32 ticksSinceChange = 0;
PVTimeComparisonUtils::IsEarlier(iRateChangeTC, tickcount, ticksSinceChange);
if (iRate != 100000)
{
// Adjust according to rate
// Rate change resolution is 0.1
uint32 convnum = (iRate / 10000);
uint32 convden = 10;
aTimebaseTickCount = ((ticksSinceChange * convnum) / convden);
}
else
{
aTimebaseTickCount = ticksSinceChange;
}
// Add the timebase since last rate change
aTimebaseTickCount = aTimebaseTickCount + iRateChangeTCTime;
}
void SetRate(int32 aRate)
{
bool overflow = 0;
// Save the tickcount time when the rate changed
uint32 temp = 0;
GetCurrentTick32(temp, overflow);
iRateChangeTCTime = temp;
uint32 tickcount = 0;
PVMFTimebase_Tickcount::GetCurrentTick32(tickcount, overflow);
iRateChangeTC = tickcount;
// Change the rate
iRate = aRate;
}
int32 GetRate()
{
return iRate;
}
private:
int32 iRate; // In millipercent of "real-time"
uint32 iRateChangeTCTime; // The tickcount's time when rate last changed
uint32 iRateChangeTC;
};
class PVMFNodeInterface;
class PVMFDataSourceInitializationExtensionInterface;
class PVMFTrackSelectionExtensionInterface;
class PvmfDataSourcePlaybackControlInterface;
class PvmfDataSourceDirectionControlInterface;
class PVMFTrackLevelInfoExtensionInterface;
class PvmfNodesSyncControlInterface;
class PvmfFileOutputNodeConfigInterface;
class PVMFErrorInfoMessageInterface;
class PVLogger;
class PVMFCPMPluginLicenseInterface;
class PVMFBasicErrorInfoMessage;
class PVPlayerWatchdogTimer;
typedef enum
{
PVP_NODETYPE_SOURCE,
PVP_NODETYPE_SINK,
PVP_NODETYPE_DECODER,
PVP_NODETYPE_UNKNOWN
} PVPlayerNodeType;
class PVPlayerEngineDatapath
{
public:
PVPlayerEngineDatapath()
{
iTrackInfo = NULL;
iSrcFormat = PVMF_MIME_FORMAT_UNKNOWN;
iDataSink = NULL;
iDatapath = NULL;
iDecNode = NULL;
iDecNodeSessionId = 0;
iDecNodeCapConfigIF = NULL;
iDecNodeMetadataExtIF = NULL;
iDecNodePVInterfaceMetadataExt = NULL;
iSinkNode = NULL;
iSinkNodeSessionId = 0;
iSinkNodeFOConfigIF = NULL;
iSinkNodeSyncCtrlIF = NULL;
iSinkNodeCapConfigIF = NULL;
iSinkNodeMetadataExtIF = NULL;
iSinkFormat = PVMF_MIME_FORMAT_UNKNOWN;
iSinkNodePVInterfaceSyncCtrl = NULL;
iSinkNodePVInterfaceCapConfig = NULL;
iSinkNodePVInterfaceMetadataExt = NULL;
iNumPendingCmd = 0;
iEndOfDataReceived = false;
};
PVPlayerEngineDatapath(const PVPlayerEngineDatapath& aSrc)
{
iTrackInfo = aSrc.iTrackInfo;
iSrcFormat = aSrc.iSrcFormat;
iDataSink = aSrc.iDataSink;
iDatapath = aSrc.iDatapath;
iDecNode = aSrc.iDecNode;
iDecNodeSessionId = aSrc.iDecNodeSessionId;
iDecNodeCapConfigIF = aSrc.iDecNodeCapConfigIF;
iDecNodeMetadataExtIF = aSrc.iDecNodeMetadataExtIF;
iDecNodePVInterfaceMetadataExt = aSrc.iDecNodePVInterfaceMetadataExt;
iSinkNode = aSrc.iSinkNode;
iSinkNodeSessionId = aSrc.iSinkNodeSessionId;
iSinkNodeFOConfigIF = aSrc.iSinkNodeFOConfigIF;
iSinkNodeSyncCtrlIF = aSrc.iSinkNodeSyncCtrlIF;
iSinkNodeCapConfigIF = aSrc.iSinkNodeCapConfigIF;
iSinkNodeMetadataExtIF = aSrc.iSinkNodeMetadataExtIF;
iSinkFormat = aSrc.iSinkFormat;
iSinkNodePVInterfaceSyncCtrl = aSrc.iSinkNodePVInterfaceSyncCtrl;
iSinkNodePVInterfaceCapConfig = aSrc.iSinkNodePVInterfaceCapConfig;
iSinkNodePVInterfaceMetadataExt = aSrc.iSinkNodePVInterfaceMetadataExt;
iNumPendingCmd = aSrc.iNumPendingCmd;
iEndOfDataReceived = aSrc.iEndOfDataReceived;
};
~PVPlayerEngineDatapath()
{
};
PVMFTrackInfo* iTrackInfo;
PVMFFormatType iSrcFormat;
PVPlayerDataSink* iDataSink;
PVPlayerDatapath* iDatapath;
PVMFNodeInterface* iDecNode;
PVMFSessionId iDecNodeSessionId;
PvmiCapabilityAndConfig* iDecNodeCapConfigIF;
PVMFMetadataExtensionInterface* iDecNodeMetadataExtIF;
PVInterface* iDecNodePVInterfaceMetadataExt;
PVMFNodeInterface* iSinkNode;
PVMFSessionId iSinkNodeSessionId;
PvmfFileOutputNodeConfigInterface* iSinkNodeFOConfigIF;
PvmfNodesSyncControlInterface* iSinkNodeSyncCtrlIF;
PvmiCapabilityAndConfig* iSinkNodeCapConfigIF;
PVMFMetadataExtensionInterface* iSinkNodeMetadataExtIF;
PVMFFormatType iSinkFormat;
PVInterface* iSinkNodePVInterfaceSyncCtrl;
PVInterface* iSinkNodePVInterfaceCapConfig;
PVInterface* iSinkNodePVInterfaceMetadataExt;
uint32 iNumPendingCmd;
bool iEndOfDataReceived;
};
struct PVPlayerEngineContext
{
PVPlayerEngineDatapath* iEngineDatapath;
PVMFNodeInterface* iNode;
PVPlayerDatapath* iDatapath;
PVCommandId iCmdId;
OsclAny* iCmdContext;
int32 iCmdType;
};
class PVPlayerEngineTrackSelection
{
public:
PVPlayerEngineTrackSelection()
{
iTsSinkNode = NULL;
iTsSinkNodeSessionId = 0;
iTsSinkNodeCapConfigIF = NULL;
iTsDecNode = NULL;
iTsDecNodeSessionId = 0;
iTsDecNodeCapConfigIF = NULL;
iTsDecNodePVInterfaceCapConfig = NULL;
iTsTrackID = -1;
iTsTrackValidForPlayableList = false;
};
PVPlayerEngineTrackSelection(const PVPlayerEngineTrackSelection& aTrackSelection)
{
iTsSinkNode = aTrackSelection.iTsSinkNode;
iTsSinkNodeSessionId = aTrackSelection.iTsSinkNodeSessionId;
iTsSinkNodeCapConfigIF = aTrackSelection.iTsSinkNodeCapConfigIF;
iTsDecNode = aTrackSelection.iTsDecNode;
iTsDecNodeSessionId = aTrackSelection.iTsDecNodeSessionId;
iTsDecNodeCapConfigIF = aTrackSelection.iTsDecNodeCapConfigIF;
iTsDecNodePVInterfaceCapConfig = aTrackSelection.iTsDecNodePVInterfaceCapConfig;
iTsTrackID = aTrackSelection.iTsTrackID;
iTsTrackValidForPlayableList = aTrackSelection.iTsTrackValidForPlayableList;
};
PVPlayerEngineTrackSelection& operator=(const PVPlayerEngineTrackSelection& aTrackSelection)
{
iTsSinkNode = aTrackSelection.iTsSinkNode;
iTsSinkNodeSessionId = aTrackSelection.iTsSinkNodeSessionId;
iTsSinkNodeCapConfigIF = aTrackSelection.iTsSinkNodeCapConfigIF;
iTsDecNode = aTrackSelection.iTsDecNode;
iTsDecNodeSessionId = aTrackSelection.iTsDecNodeSessionId;
iTsDecNodeCapConfigIF = aTrackSelection.iTsDecNodeCapConfigIF;
iTsDecNodePVInterfaceCapConfig = aTrackSelection.iTsDecNodePVInterfaceCapConfig;
iTsTrackID = aTrackSelection.iTsTrackID;
iTsTrackValidForPlayableList = aTrackSelection.iTsTrackValidForPlayableList;
return *this;
};
~PVPlayerEngineTrackSelection()
{
};
PVMFNodeInterface* iTsSinkNode;
PVMFSessionId iTsSinkNodeSessionId;
PvmiCapabilityAndConfig* iTsSinkNodeCapConfigIF;
PVMFNodeInterface* iTsDecNode;
PVMFSessionId iTsDecNodeSessionId;
PvmiCapabilityAndConfig* iTsDecNodeCapConfigIF;
PVInterface* iTsDecNodePVInterfaceCapConfig;
int32 iTsTrackID;
bool iTsTrackValidForPlayableList;
};
/**
* Observer class for the inactivity timer AO
*/
class PVPlayerWatchdogTimerObserver
{
public:
virtual ~PVPlayerWatchdogTimerObserver() {}
/**
* A timer event, indicating that the inactivity timer has expired.
*/
virtual void PVPlayerWatchdogTimerEvent() = 0;
};
class PVPlayerEngine : public OsclTimerObject,
public PVPlayerInterface,
public PvmiCapabilityAndConfig,
public PVMFNodeCmdStatusObserver,
public PVMFNodeInfoEventObserver,
public PVMFNodeErrorEventObserver,
public PVPlayerDatapathObserver,
public OsclTimerObserver,
public PVPlayerLicenseAcquisitionInterface,
public PVPlayerRecognizerRegistryObserver,
public PVPlayerWatchdogTimerObserver,
public PVPlayerTrackSelectionInterface,
public PVMFMediaClockNotificationsObs,
public ThreadSafeQueueObserver
{
public:
static PVPlayerEngine* New(PVCommandStatusObserver *aCmdObserver,
PVErrorEventObserver *aErrorObserver,
PVInformationalEventObserver *aInfoObserver,
bool aHwAccelerated);
~PVPlayerEngine();
// From PVPlayerInterface
PVCommandId GetSDKInfo(PVSDKInfo &aSDKInfo, const OsclAny* aContextData = NULL);
PVCommandId GetSDKModuleInfo(PVSDKModuleInfo &aSDKModuleInfo, const OsclAny* aContextData = NULL);
PVCommandId SetLogAppender(const char* aTag, OsclSharedPtr<PVLoggerAppender>& aAppender, const OsclAny* aContextData = NULL);
PVCommandId RemoveLogAppender(const char* aTag, OsclSharedPtr<PVLoggerAppender>& aAppender, const OsclAny* aContextData = NULL);
PVCommandId SetLogLevel(const char* aTag, int32 aLevel, bool aSetSubtree = false, const OsclAny* aContextData = NULL);
PVCommandId GetLogLevel(const char* aTag, PVLogLevelInfo& aLogInfo, const OsclAny* aContextData = NULL);
PVCommandId QueryUUID(const PvmfMimeString& aMimeType, Oscl_Vector<PVUuid, OsclMemAllocator>& aUuids, bool aExactUuidsOnly = false, const OsclAny* aContextData = NULL);
PVCommandId QueryInterface(const PVUuid& aUuid, PVInterface*& aInterfacePtr, const OsclAny* aContextData = NULL);
PVCommandId CancelCommand(PVCommandId aCancelCmdId, const OsclAny* aContextData = NULL);
PVCommandId CancelAllCommands(const OsclAny* aContextData = NULL);
PVCommandId GetPVPlayerState(PVPlayerState& aState, const OsclAny* aContextData = NULL);
PVMFStatus GetPVPlayerStateSync(PVPlayerState& aState);
PVCommandId AddDataSource(PVPlayerDataSource& aDataSource, const OsclAny* aContextData = NULL);
PVCommandId Init(const OsclAny* aContextData = NULL);
PVCommandId GetMetadataKeys(PVPMetadataList& aKeyList, int32 aStartingIndex = 0, int32 aMaxEntries = -1, char* aQueryKey = NULL, const OsclAny* aContextData = NULL);
PVCommandId GetMetadataValues(PVPMetadataList& aKeyList, int32 aStartingValueIndex, int32 aMaxValueEntries, int32& aNumAvailableValueEntries, Oscl_Vector<PvmiKvp, OsclMemAllocator>& aValueList, const OsclAny* aContextData = NULL, bool aMetadataValuesCopiedInCallBack = true);
PVCommandId ReleaseMetadataValues(Oscl_Vector<PvmiKvp, OsclMemAllocator>& aValueList, const OsclAny* aContextData = NULL);
PVCommandId AddDataSink(PVPlayerDataSink& aDataSink, const OsclAny* aContextData = NULL);
PVCommandId SetPlaybackRange(PVPPlaybackPosition aBeginPos, PVPPlaybackPosition aEndPos, bool aQueueRange, const OsclAny* aContextData = NULL);
PVCommandId GetPlaybackRange(PVPPlaybackPosition &aBeginPos, PVPPlaybackPosition &aEndPos, bool aQueued, const OsclAny* aContextData = NULL);
PVCommandId GetCurrentPosition(PVPPlaybackPosition &aPos, const OsclAny* aContextData = NULL);
PVMFStatus GetCurrentPositionSync(PVPPlaybackPosition &aPos);
PVCommandId SetPlaybackRate(int32 aRate, PVMFTimebase* aTimebase = NULL, const OsclAny* aContextData = NULL);
PVCommandId GetPlaybackRate(int32& aRate, PVMFTimebase*& aTimebase, const OsclAny* aContextData = NULL);
PVCommandId GetPlaybackMinMaxRate(int32& aMinRate, int32& aMaxRate, const OsclAny* aContextData = NULL);
PVCommandId Prepare(const OsclAny* aContextData = NULL);
PVCommandId Start(const OsclAny* aContextData = NULL);
PVCommandId Pause(const OsclAny* aContextData = NULL);
PVCommandId Resume(const OsclAny* aContextData = NULL);
PVCommandId Stop(const OsclAny* aContextData = NULL);
PVCommandId RemoveDataSink(PVPlayerDataSink& aDataSink, const OsclAny* aContextData = NULL);
PVCommandId Reset(const OsclAny* aContextData = NULL);
PVCommandId RemoveDataSource(PVPlayerDataSource& aDataSource, const OsclAny* aContextData = NULL);
// From PvmiCapabilityAndConfig
void setObserver(PvmiConfigAndCapabilityCmdObserver* aObserver);
PVMFStatus getParametersSync(PvmiMIOSession aSession, PvmiKeyType aIdentifier, PvmiKvp*& aParameters, int& aNumParamElements, PvmiCapabilityContext aContext);
PVMFStatus releaseParameters(PvmiMIOSession aSession, PvmiKvp* aParameters, int aNumElements);
void createContext(PvmiMIOSession aSession, PvmiCapabilityContext& aContext);
void setContextParameters(PvmiMIOSession aSession, PvmiCapabilityContext& aContext, PvmiKvp* aParameters, int aNumParamElements);
void DeleteContext(PvmiMIOSession aSession, PvmiCapabilityContext& aContext);
void setParametersSync(PvmiMIOSession aSession, PvmiKvp* aParameters, int aNumElements, PvmiKvp* &aRetKVP);
PVMFCommandId setParametersAsync(PvmiMIOSession aSession, PvmiKvp* aParameters, int aNumElements, PvmiKvp*& aRetKVP, OsclAny* aContext = NULL);
uint32 getCapabilityMetric(PvmiMIOSession aSession);
PVMFStatus verifyParametersSync(PvmiMIOSession aSession, PvmiKvp* aParameters, int aNumElements);
// From PVPlayerLicenseAcquisitionInterface
PVCommandId AcquireLicense(OsclAny* aLicenseData, uint32 aDataSize, oscl_wchar* aContentName, int32 aTimeoutMsec, const OsclAny* aContextData = NULL);
PVCommandId AcquireLicense(OsclAny* aLicenseData, uint32 aDataSize, char* aContentName, int32 aTimeoutMsec, const OsclAny* aContextData = NULL);
PVCommandId CancelAcquireLicense(PVMFCommandId aCmdId, const OsclAny* aContextData = NULL);
PVMFStatus GetLicenseStatus(PVMFCPMLicenseStatus& aStatus);
//From PVPlayerTrackSelectionInterface
PVMFStatus GetCompleteList(PVMFMediaPresentationInfo& aList);
PVMFStatus ReleaseCompleteList(PVMFMediaPresentationInfo& aList);
PVMFStatus GetPlayableList(PVMFMediaPresentationInfo& aList);
PVMFStatus ReleasePlayableList(PVMFMediaPresentationInfo& aList);
PVMFStatus GetSelectedList(PVMFMediaPresentationInfo& aList);
PVMFStatus ReleaseSelectedList(PVMFMediaPresentationInfo& aList);
PVMFStatus RegisterHelperObject(PVMFTrackSelectionHelper* aObject);
// From PVInterface
void addRef();
void removeRef();
bool queryInterface(const PVUuid& uuid, PVInterface*& iface);
// From PVPlayerWatchdogTimerObserver
void PVPlayerWatchdogTimerEvent();
private:
PVPlayerEngine(bool aHwAccelerated);
void Construct(PVCommandStatusObserver *aCmdObserver,
PVErrorEventObserver *aErrorObserver,
PVInformationalEventObserver *aInfoObserver);
// From OsclTimerObject
void Run();
// Utility function to determine the type of node in the player datapath and of the datapath which it belongs to
bool FindNodeTypeByNode(PVMFNodeInterface* aUnknownNode, PVPlayerNodeType& aNodeType, int32& aDatapathListIndex);
// Utility function to find the track for given datapath based on mime string
bool FindTrackForDatapathUsingMimeString(bool& aVideoTrack, bool& aAudioTrack, bool& aTextTrack, PVPlayerEngineDatapath* aDatapath);
// Utility function to find the datapath list index based on mime string
bool FindDatapathForTrackUsingMimeString(bool aVideoTrack, bool aAudioTrack, bool aTextTrack, int32& aDatapathListIndex);
// From PVMFNodeCmdStatusObserver
void NodeCommandCompleted(const PVMFCmdResp& aResponse);
// From PVMFNodeInfoEventObserver
void HandleNodeInformationalEvent(const PVMFAsyncEvent& aEvent);
// From PVMFNodeErrorEventObserver
void HandleNodeErrorEvent(const PVMFAsyncEvent& aEvent);
// From PVPlayerDatapathObserver
void HandlePlayerDatapathEvent(int32 aDatapathEvent, PVMFStatus aEventStatus, OsclAny* aContext = NULL, PVMFCmdResp* aCmdResp = NULL);
// From OsclTimerObserver
void TimeoutOccurred(int32 timerID, int32 timeoutInfo);
//From PVMFMediaClockNotificationsObs
void ProcessCallBack(uint32 aCallBackID, PVTimeComparisonUtils::MediaTimeStatus aTimerAccuracy, uint32 delta,
const OsclAny* acontextData, PVMFStatus aStatus);
void NotificationsInterfaceDestroyed();
//For sending PVMFInfoPositionStatus
void SendPositionStatusUpdate(void);
// For checking of any pending error handling cmd in the queue
bool CheckForPendingErrorHandlingCmd();
// From PVPlayerRecognizerRegistryObserver
void RecognizeCompleted(PVMFFormatType aSourceFormatType, OsclAny* aContext);
// Command and event queueing related functions
PVCommandId AddCommandToQueue(int32 aCmdType, OsclAny* aContextData = NULL,
Oscl_Vector<PVPlayerEngineCommandParamUnion, OsclMemAllocator>* aParamVector = NULL,
const PVUuid* aUuid = NULL, bool aAPICommand = true, PVCommandId* aId = NULL);
// Thread-safety mechanisms
ThreadSafeQueue iThreadSafeQueue;
void ThreadSafeQueueDataAvailable(ThreadSafeQueue*);
OsclSemaphore iOOTSyncCommandSem;
OsclMutex iCommandIdMut;
PVMFStatus DoOOTSyncCommand(int32 aCmdType,
Oscl_Vector<PVPlayerEngineCommandParamUnion, OsclMemAllocator>* aParamVector,
const PVUuid* aUuid = NULL);
void OOTSyncCommandComplete(PVPlayerEngineCommand& aCmd, PVMFStatus aStatus);
// start the playback clock once skip is completed by one of the tracks
void StartPlaybackClock();
// Functions for engine state handling
void SetEngineState(PVPlayerEngineState aState);
PVPlayerState GetPVPlayerState(void);
// Keeps track of next available command ID
PVCommandId iCommandId;
// Current engine state
PVPlayerEngineState iState;
// Reference to observers
PVCommandStatusObserver *iCmdStatusObserver;
PVErrorEventObserver *iErrorEventObserver;
PVInformationalEventObserver *iInfoEventObserver;
PvmiConfigAndCapabilityCmdObserver *iCfgCapCmdObserver;
// Retrieve current playback clock position
void GetPlaybackClockPosition(PVPPlaybackPosition& aClockPos);
// Utility functions to convert to/from milliseconds to other playback position units
PVMFStatus ConvertToMillisec(PVPPlaybackPosition& aPBPos, uint32& aTimeMS);
PVMFStatus ConvertFromMillisec(uint32 aTimeMS, PVPPlaybackPosition& aPBPos);
// OsclTimer for polling checks
OsclTimer<OsclMemAllocator>* iPollingCheckTimer;
// Command and event callback functions
void EngineCommandCompleted(PVCommandId aId, OsclAny* aContext, PVMFStatus aStatus, PVInterface* aExtInterface = NULL,
OsclAny* aEventData = NULL, int32 aEventDataSize = 0);
void SendInformationalEvent(PVMFEventType aEventType, PVInterface* aExtInterface = NULL,
OsclAny* aEventData = NULL, uint8* aLocalBuffer = NULL, uint32 aLocalBufferSize = 0);
void SendErrorEvent(PVMFEventType aEventType, PVInterface* aExtInterface = NULL,
OsclAny* aEventData = NULL, uint8* aLocalBuffer = NULL, uint32 aLocalBufferSize = 0);
// Queue for engine commands
Oscl_Vector<PVPlayerEngineCommand, OsclMemAllocator> iCurrentCmd; // Vector of size 1 to hold the command being currently processed
Oscl_Vector<PVPlayerEngineCommand, OsclMemAllocator> iCmdToCancel; // Vector of size 1 to hold the command being currently cancelled
Oscl_Vector<PVPlayerEngineCommand, OsclMemAllocator> iCmdToDlaCancel; // Vector of size 1 to hold the command being currently cancelled
OsclPriorityQueue<PVPlayerEngineCommand, OsclMemAllocator, Oscl_Vector<PVPlayerEngineCommand, OsclMemAllocator>, PVPlayerEngineCommandCompareLess> iPendingCmds; // Vector to hold the command that has been requested
// Variables for completing engine commands after error handling
PVMFStatus iCommandCompleteStatusInErrorHandling;
PVMFBasicErrorInfoMessage* iCommandCompleteErrMsgInErrorHandling;
// Command handling functions
void DoCancelCommand(PVPlayerEngineCommand& aCmd);
void DoCancelAllCommands(PVPlayerEngineCommand& aCmd);
void DoCancelCommandBeingProcessed(void);
void DoCancelAcquireLicense(PVPlayerEngineCommand& aCmd);
PVMFStatus DoCancelPendingNodeDatapathCommand(void);
PVMFStatus DoErrorHandling(void);
PVMFStatus DoGetSDKInfo(PVPlayerEngineCommand& aCmd);
PVMFStatus DoSetLogAppender(PVPlayerEngineCommand& aCmd);
PVMFStatus DoRemoveLogAppender(PVPlayerEngineCommand& aCmd);
PVMFStatus DoSetLogLevel(PVPlayerEngineCommand& aCmd);
PVMFStatus DoGetLogLevel(PVPlayerEngineCommand& aCmd);
PVMFStatus DoQueryUUID(PVPlayerEngineCommand& aCmd);
PVMFStatus DoQueryInterface(PVPlayerEngineCommand& aCmd);
PVMFStatus DoGetPVPlayerState(PVPlayerEngineCommand& aCmd, bool aSyncCmd = false);
PVMFStatus DoAddDataSource(PVPlayerEngineCommand& aCmd);
PVMFStatus DoQuerySourceFormatType(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoSetupSourceNode(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus SetupDataSourceForUnknownURLAccess();
PVMFStatus DoSourceNodeQueryTrackSelIF(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoSourceNodeQueryInterfaceOptional(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoGetMetadataKey(PVPlayerEngineCommand& aCmd);
PVMFStatus DoGetMetadataValue(PVPlayerEngineCommand& aCmd);
PVMFStatus DoReleaseMetadataValues(PVPlayerEngineCommand& aCmd);
PVMFStatus AddToMetadataInterfaceList(PVMFMetadataExtensionInterface* aMetadataIF, PVMFSessionId aSessionId, PVPlayerEngineDatapath* aEngineDatapath, PVMFNodeInterface* aNode);
PVMFStatus RemoveFromMetadataInterfaceList(PVMFMetadataExtensionInterface* aMetadataIF, PVMFSessionId aSessionId);
PVMFStatus DoInit(PVPlayerEngineCommand& aCmd);
PVMFStatus DoSourceNodeInit(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoSourceNodeGetDurationValue(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoAcquireLicense(PVPlayerEngineCommand& aCmd);
PVMFStatus DoSourceNodeGetLicense(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoAddDataSink(PVPlayerEngineCommand& aCmd);
PVMFStatus DoSetPlaybackRange(PVPlayerEngineCommand& aCmd);
PVMFStatus UpdateCurrentEndPosition(PVPPlaybackPosition& aEndPos);
PVMFStatus UpdateCurrentBeginPosition(PVPPlaybackPosition& aBeginPos, PVPlayerEngineCommand& aCmd);
PVMFStatus DoChangePlaybackPosition(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoSourceNodeSetDataSourcePositionDuringPlayback(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoSinkNodeSkipMediaDataDuringPlayback(PVCommandId aCmdId,
OsclAny* aCmdContext,
bool aSFR = false);
PVMFStatus DoGetPlaybackRange(PVPlayerEngineCommand& aCmd);
PVMFStatus DoGetCurrentPosition(PVPlayerEngineCommand& aCmd, bool aSyncCmd = false);
PVMFStatus DoSetPlaybackRate(PVPlayerEngineCommand& aCmd);
PVMFStatus DoGetPlaybackRate(PVPlayerEngineCommand& aCmd);
PVMFStatus DoGetPlaybackMinMaxRate(PVPlayerEngineCommand& aCmd);
PVMFStatus DoPrepare(PVPlayerEngineCommand& aCmd);
PVMFStatus DoSinkNodeQueryCapConfigIF(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoSinkNodeInit(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoSinkNodeTrackSelection(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoDecNodeQueryCapConfigIF(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoDecNodeInit(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoSourceNodeTrackSelection(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoTrackSelection(bool oPopulatePlayableListOnly, bool oUsePreferenceList);
PVMFStatus DoVerifyTrackInfo(PVPlayerEngineTrackSelection &aTrackSelection, PVMFTrackInfo* aTrack, PVMFStatus& aCheckcodec);
PVMFStatus DoSinkNodeDecNodeReset(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoSinkDecCleanupSourcePrepare(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoSourceNodePrepare(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoSinkNodeQueryInterfaceOptional(PVPlayerEngineDatapath &aDatapath, PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoDecNodeQueryInterfaceOptional(PVPlayerEngineDatapath &aDatapath, PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoDatapathPrepare(PVPlayerEngineDatapath &aDatapath, PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoSourceNodeQueryDataSourcePosition(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoSourceNodeSetDataSourcePosition(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoSourceNodeSetDataSourceDirection(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoSourceNodeStart(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoDatapathStart(PVPlayerEngineDatapath &aDatapath, PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoSinkNodeSkipMediaData(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoStart(PVPlayerEngineCommand& aCmd);
PVMFStatus DoPause(PVPlayerEngineCommand& aCmd);
PVMFStatus DoDatapathPause(PVPlayerEngineDatapath &aDatapath, PVCommandId aCmdId, OsclAny* aCmdContext, bool aSinkPaused);
PVMFStatus DoSourceNodePause(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoResume(PVPlayerEngineCommand& aCmd);
PVMFStatus DoStop(PVPlayerEngineCommand& aCmd);
PVMFStatus DoDatapathStop(PVPlayerEngineDatapath &aDatapath, PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoSourceNodeStop(PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoDatapathTeardown(PVPlayerEngineDatapath &aDatapath, PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoDatapathReset(PVPlayerEngineDatapath &aDatapath, PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoRemoveDataSink(PVPlayerEngineCommand& aCmd);
PVMFStatus DoReset(PVPlayerEngineCommand& aCmd);
PVMFStatus DoRemoveDataSource(PVPlayerEngineCommand& aCmd);
PVMFStatus RemoveDataSourceSync(PVPlayerDataSource &aSrc);
PVMFStatus DoSourceUnderflowAutoPause(PVPlayerEngineCommand& aCmd);
PVMFStatus DoSourceDataReadyAutoResume(PVPlayerEngineCommand& aCmd);
PVMFStatus DoSinkNodePause(PVPlayerEngineDatapath &aDatapath, PVCommandId aCmdId, OsclAny* aCmdContext);
PVMFStatus DoSinkNodeResume(PVPlayerEngineDatapath &aDatapath, PVCommandId aCmdId, OsclAny* aCmdContext);
void DoRemoveAllSinks(void);
void DoEngineDatapathTeardown(PVPlayerEngineDatapath& aDatapath);
void DoEngineDatapathCleanup(PVPlayerEngineDatapath& aDatapath);
void DoSourceNodeCleanup(void);
PVMFStatus DoSetObserverSync(PVPlayerEngineCommand& aCmd);
PVMFStatus DoGetLicenseStatusSync(PVPlayerEngineCommand& aCmd);
PVMFStatus DoGetParametersSync(PVPlayerEngineCommand& aCmd);
PVMFStatus DoReleaseParametersSync(PVPlayerEngineCommand& aCmd);
PVMFStatus DoVerifyParametersSync(PVPlayerEngineCommand& aCmd);
PVMFStatus DoCapConfigGetParametersSync(PvmiKeyType aIdentifier, PvmiKvp*& aParameters, int& aNumParamElements, PvmiCapabilityContext aContext);
PVMFStatus DoCapConfigReleaseParameters(PvmiKvp* aParameters, int aNumElements);
PVMFStatus DoCapConfigSetParameters(PVPlayerEngineCommand& aCmd, bool aSyncCmd = false);
PVMFStatus DoCapConfigVerifyParameters(PvmiKvp* aParameters, int aNumElements);
PVMFStatus DoGetPlayerParameter(PvmiKvp*& aParameters, int& aNumParamElements, int32 aIndex, PvmiKvpAttr reqattr);
PVMFStatus DoGetPlayerProductInfoParameter(PvmiKvp*& aParameters, int& aNumParamElements, int32 aIndex, PvmiKvpAttr reqattr);
PVMFStatus DoVerifyAndSetPlayerParameter(PvmiKvp& aParameter, bool aSetParam);
PVMFStatus DoVerifyAndSetPlayerProductInfoParameter(PvmiKvp& aParameter, bool aSetParam);
PVMFStatus DoSetConfigSyncMargin(int32 aEarlyMargin, int32 aLateMargin, int32 aMediaType);
bool iHwAccelerated;
int32 iCapConfigContext;
// Engine datapath and related variables
Oscl_Vector<PVPlayerEngineDatapath, OsclMemAllocator> iDatapathList;
uint32 iNumPendingNodeCmd;
int32 iNumPendingSkipCompleteEvent;
PVPlayerWatchdogTimer* iWatchDogTimer;
uint32 iNumPendingDatapathCmd;
int32 iNumPVMFInfoStartOfDataPending;
// Data source, data sink, and nodes
PVPlayerDataSource* iDataSource;
PVMFFormatType iSourceFormatType;
PVMFNodeInterface* iSourceNode;
PVMFSessionId iSourceNodeSessionId;
PVMFDataSourceInitializationExtensionInterface* iSourceNodeInitIF;
PVMFTrackSelectionExtensionInterface* iSourceNodeTrackSelIF;
PvmfDataSourcePlaybackControlInterface* iSourceNodePBCtrlIF;
PvmfDataSourceDirectionControlInterface* iSourceNodeDirCtrlIF;
PVMFTrackLevelInfoExtensionInterface* iSourceNodeTrackLevelInfoIF;
PVMFMetadataExtensionInterface* iSourceNodeMetadataExtIF;
PvmiCapabilityAndConfig* iSourceNodeCapConfigIF;
PVMFDataSourceNodeRegistryInitInterface* iSourceNodeRegInitIF;
PVMFCPMPluginLicenseInterface* iSourceNodeCPMLicenseIF;
PVInterface* iSourceNodePVInterfaceInit;
PVInterface* iSourceNodePVInterfaceTrackSel;
PVInterface* iSourceNodePVInterfacePBCtrl;
PVInterface* iSourceNodePVInterfaceDirCtrl;
PVInterface* iSourceNodePVInterfaceTrackLevelInfo;
PVInterface* iSourceNodePVInterfaceMetadataExt;
PVInterface* iSourceNodePVInterfaceCapConfig;
PVInterface* iSourceNodePVInterfaceRegInit;
PVInterface* iSourceNodePVInterfaceCPMLicense;
// For CPM license acquisition
struct PVPlayerEngineCPMAcquireLicenseParam
{
OsclAny* iLicenseData;
uint32 iLicenseDataSize;
char* iContentNameChar;
oscl_wchar* iContentNameWChar;
int32 iTimeoutMsec;
};
PVPlayerEngineCPMAcquireLicenseParam iCPMAcquireLicenseParam;
OSCL_HeapString<OsclMemAllocator> iCPMContentNameStr;
OSCL_wHeapString<OsclMemAllocator> iCPMContentNameWStr;
PVMFCommandId iCPMGetLicenseCmdId;
// For metadata handling
// Vector to hold a list of metadata interface available from the node
struct PVPlayerEngineMetadataIFInfo
{
PVMFMetadataExtensionInterface* iInterface;
PVMFSessionId iSessionId;
PVPlayerEngineDatapath* iEngineDatapath;
PVMFNodeInterface* iNode;
};
Oscl_Vector<PVPlayerEngineMetadataIFInfo, OsclMemAllocator> iMetadataIFList;
// Structure to hold the parameters for GetMetadataKeys()
struct PVPlayerEngineGetMetadataKeysParam
{
int32 iStartingKeyIndex;
int32 iMaxKeyEntries;
char* iQueryKey;
PVPMetadataList* iKeyList;
uint32 iCurrentInterfaceIndex;
int32 iNumKeyEntriesToFill;
int32 iNumKeyEntriesInList;
};
PVPlayerEngineGetMetadataKeysParam iGetMetadataKeysParam;
// Structure to hold the parameters for GetMetadataValues()
struct PVPlayerEngineGetMetadataValuesParam
{
int32 iStartingValueIndex;
int32 iMaxValueEntries;
int32* iNumAvailableValues;
PVPMetadataList* iKeyList;
Oscl_Vector<PvmiKvp, OsclMemAllocator>* iValueList;
uint32 iCurrentInterfaceIndex;
int32 iNumValueEntriesToFill;
int32 iNumValueEntriesInList;
};
PVPlayerEngineGetMetadataValuesParam iGetMetadataValuesParam;
// Boolean to let engine know if metadata values have been copied by the app
bool iMetadataValuesCopiedInCallBack;
// Boolean to check if Metadata values have been released
bool iReleaseMetadataValuesPending;
// Vector hold a list of metadata interfaces with key/value to release memory
struct PVPlayerEngineMetadataReleaseEntry
{
uint32 iMetadataIFListIndex;
int32 iStartIndex;
int32 iEndIndex;
};
Oscl_Vector<PVPlayerEngineMetadataReleaseEntry, OsclMemAllocator> iMetadataKeyReleaseList;
Oscl_Vector<PVPlayerEngineMetadataReleaseEntry, OsclMemAllocator> iMetadataValueReleaseList;
// Engine context related objects and utility functions
OsclMemPoolFixedChunkAllocator iCurrentContextListMemPool;
Oscl_Vector<PVPlayerEngineContext*, OsclMemAllocator> iCurrentContextList;
PVPlayerEngineContext* AllocateEngineContext(PVPlayerEngineDatapath* aEngineDatapath, PVMFNodeInterface* aNode, PVPlayerDatapath* aDatapath, PVCommandId aCmdId, OsclAny* aCmdContext, int32 aCmdType);
void FreeEngineContext(PVPlayerEngineContext* aContext);
void RemoveDatapathContextFromList();
// Cancel and error handling related variables
uint32 iNumberCancelCmdPending;
enum
{
// Node commands
PVP_CMD_SourceNodeQueryInitIF,
PVP_CMD_SourceNodeQueryTrackSelIF,
PVP_CMD_SourceNodeQueryTrackLevelInfoIF,
PVP_CMD_SourceNodeQueryPBCtrlIF,
PVP_CMD_SourceNodeQueryDirCtrlIF,
PVP_CMD_SourceNodeQueryMetadataIF,
PVP_CMD_SourceNodeQueryCapConfigIF,
PVP_CMD_SourceNodeQueryCPMLicenseIF,
PVP_CMD_SourceNodeQuerySrcNodeRegInitIF,
PVP_CMD_SourceNodeInit,
PVP_CMD_SourceNodeGetDurationValue,
PVP_CMD_SourceNodeSetDataSourceRate,
PVP_CMD_SourceNodePrepare,
PVP_CMD_SourceNodeGetLicense,
PVP_CMD_SourceNodeCancelGetLicense,
PVP_CMD_SinkNodeQuerySyncCtrlIF,
PVP_CMD_SinkNodeQueryMetadataIF,
PVP_CMD_SinkNodeQueryCapConfigIF,
PVP_CMD_DecNodeQueryMetadataIF,
PVP_CMD_DecNodeQueryCapConfigIF,
PVP_CMD_SinkNodeInit,
PVP_CMD_DecNodeInit,
PVP_CMD_SourceNodeQueryDataSourcePosition,
PVP_CMD_SourceNodeSetDataSourcePosition,
PVP_CMD_SourceNodeSetDataSourceDirection,
PVP_CMD_SourceNodeStart,
PVP_CMD_SourceNodeQueryDataSourcePositionDuringPlayback,
PVP_CMD_SourceNodeSetDataSourcePositionDuringPlayback,
PVP_CMD_SinkNodeSkipMediaDataDuringPlayback,
PVP_CMD_SinkNodeSkipMediaData,
PVP_CMD_SinkNodeDecNodeReset,
PVP_CMD_SinkNodeReset,
PVP_CMD_DecNodeReset,
PVP_CMD_GetNodeMetadataValue,
PVP_CMD_GetNodeMetadataKey,
PVP_CMD_SinkNodeAutoPause,
PVP_CMD_SinkNodeAutoResume,
PVP_CMD_SourceNodeStop,
PVP_CMD_SourceNodeReset,
// Datapath commands
PVP_CMD_DPPrepare,
PVP_CMD_DPStart,
PVP_CMD_DPStop,
PVP_CMD_DPTeardown,
PVP_CMD_DPReset,
// Recognizer command
PVP_CMD_QUERYSOURCEFORMATTYPE,
// source roll over
PVP_CMD_SourceNodeRollOver
};
// Node command handling functions
void HandleSourceNodeQueryInitIF(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSourceNodeQueryTrackSelIF(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSourceNodeQueryInterfaceOptional(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSourceNodeInit(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSourceNodeGetDurationValue(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSourceNodeGetLicense(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSourceNodeCancelGetLicense(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSourceNodeSetDataSourceRate(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
PVMFStatus DoSinkNodeChangeClockRate();
PVMFStatus DoSinkPlaybackDirectionChange();
PVMFStatus UpdateCurrentDirection(PVMFCommandId, OsclAny*);
void UpdateTimebaseAndRate();
void UpdateDirection(PVMFTimestamp, PVMFTimestamp, PVPPlaybackPosition&);
void HandleSourceNodePrepare(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSinkNodeQueryInterfaceOptional(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleDecNodeQueryInterfaceOptional(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSourceNodeQueryDataSourcePosition(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSourceNodeSetDataSourcePosition(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSourceNodeSetDataSourceDirection(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSourceNodeStart(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSinkNodeSkipMediaData(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSourceNodeQueryDataSourcePositionDuringPlayback(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSourceNodeSetDataSourcePositionDuringPlayback(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSinkNodeSkipMediaDataDuringPlayback(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSourceNodePause(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSourceNodeResume(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSourceNodeStop(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSourceNodeReset(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSinkNodePause(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSinkNodeResume(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSinkNodeReset(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleDecNodeReset(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSinkNodeQueryCapConfigIF(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSinkNodeInit(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleDecNodeQueryCapConfigIF(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleDecNodeInit(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
void HandleSinkNodeDecNodeReset(PVPlayerEngineContext& aNodeContext, const PVMFCmdResp& aNodeResp);
// Datapath command handling functions
void HandleDatapathPrepare(PVPlayerEngineContext& aDatapathContext, PVMFStatus aDatapathStatus, PVMFCmdResp* aCmdResp);
void HandleDatapathStart(PVPlayerEngineContext& aDatapathContext, PVMFStatus aDatapathStatus, PVMFCmdResp* aCmdResp);
void HandleDatapathPause(PVPlayerEngineContext& aDatapathContext, PVMFStatus aDatapathStatus, PVMFCmdResp* aCmdResp);
void HandleDatapathResume(PVPlayerEngineContext& aDatapathContext, PVMFStatus aDatapathStatus, PVMFCmdResp* aCmdResp);
void HandleDatapathStop(PVPlayerEngineContext& aDatapathContext, PVMFStatus aDatapathStatus, PVMFCmdResp* aCmdResp);
void HandleDatapathTeardown(PVPlayerEngineContext& aDatapathContext, PVMFStatus aDatapathStatus, PVMFCmdResp* aCmdResp);
void HandleDatapathReset(PVPlayerEngineContext& aDatapathContext, PVMFStatus aDatapathStatus, PVMFCmdResp* aCmdResp);
// Node error event handling functions
void HandleSourceNodeErrorEvent(const PVMFAsyncEvent& aEvent);
void HandleDecNodeErrorEvent(const PVMFAsyncEvent& aEvent, int32 aDatapathIndex);
void HandleSinkNodeErrorEvent(const PVMFAsyncEvent& aEvent, int32 aDatapathIndex);
// Node informational event handling functions
void HandleSourceNodeInfoEvent(const PVMFAsyncEvent& aEvent);
void HandleDecNodeInfoEvent(const PVMFAsyncEvent& aEvent, int32 aDatapathIndex);
void HandleSinkNodeInfoEvent(const PVMFAsyncEvent& aEvent, int32 aDatapathIndex);
bool AllDatapathReceivedEndOfData();
// Utility functions to send specific async events
void SendEndOfClipInfoEvent(PVMFStatus aStatus, PVInterface* aExtInterface = NULL);
void SendEndTimeReachedInfoEvent(PVMFStatus aStatus, PVInterface* aExtInterface = NULL);
void SendSourceUnderflowInfoEvent(PVMFStatus aStatus, PVInterface* aExtInterface = NULL);
void SendSourceDataReadyInfoEvent(PVMFStatus aStatus, PVInterface* aExtInterface = NULL);
// Utility to retrieve the PVMFErrorInfoMessageInterface from a PVInterface
PVMFErrorInfoMessageInterface* GetErrorInfoMessageInterface(PVInterface& aInterface);
// Utility functions to start/stop playback status timer
void StartPlaybackStatusTimer(void);
void StopPlaybackStatusTimer(void);
// Utility Fucntion to calculate the nearest sync frame
void CalculateActualPlaybackPosition();
// to save config values in case of protocol rollover
PVMFStatus VerifyAndSaveKVPValues(PvmiKvp *aKvpValue);
void SetRollOverKVPValues();
void DeleteKVPValues();
// to reset reposition related variables.
void ResetReposVariables(bool aResetAll);
PVMFStatus IssueNodeCancelCommand(PVPlayerEngineContext* aCurrentListContext, PVMFSessionId aSessionId, OsclAny* aNumberCancelCmdPending);
PVMFStatus IssueDatapathCancelCommand(PVPlayerEngineContext* aCurrentListContext, OsclAny* aNumberCancelCmdPending);
PVMFStatus IssueRecognizerRegistryCancel(OsclAny* aNumberCancelCmdPending);
PVMFStatus IssueSinkNodeInit(PVPlayerEngineDatapath* aDatapath, OsclAny* aCmdContext, PVMFCommandId &aCmdId);
PVMFStatus IssueSinkNodeReset(PVPlayerEngineDatapath* aDatapath, OsclAny* aCmdContext, PVMFCommandId &aCmdId);
PVMFStatus IssueSinkSkipMediaData(PVPlayerEngineDatapath* aDatapath, bool aSFR, OsclAny* aCmdContext);
PVMFStatus IssueSourceSetDataSourcePosition(bool aIsPosUnitPlayList, OsclAny* aCmdContext);
PVMFStatus IssueDecNodeInit(PVMFNodeInterface* aNode, PVMFSessionId aDecNodeSessionId, OsclAny* aCmdContext, PVMFCommandId &aCmdId);
PVMFStatus IssueDecNodeReset(PVMFNodeInterface* aNode, PVMFSessionId aDecNodeSessionId, OsclAny* aCmdContext, PVMFCommandId &aCmdId);
PVMFStatus IssueQueryInterface(PVMFNodeInterface* aNode, PVMFSessionId aSessionId, const PVUuid aUuid, PVInterface*& aInterfacePtr, OsclAny* aCmdContext, PVMFCommandId& aCmdId);
// Handle to the logger node
PVLogger* iLogger;
PVLogger* iReposLogger;
PVLogger* iPerfLogger;
// The node registry for the player engine
PVPlayerNodeRegistry iPlayerNodeRegistry;
// The recognizer registry for the player engine
PVPlayerRecognizerRegistry iPlayerRecognizerRegistry;
// Objects for playback clock and playback rate control
PVPlayerTimebase iPlaybackTimebase;
PVMFMediaClock iPlaybackClock;
PVMFMediaClockNotificationsInterface* iClockNotificationsInf;
uint32 iPlayStatusCallbackTimerID;
uint32 iPlayStatusCallbackTimerMarginWindow;
uint32 iCurrCallbackTimerLatency;
int32 iPlaybackClockRate;//always >=0
PVMFTimebase* iOutsideTimebase;
int32 iPlaybackClockRate_New;
PVMFTimebase* iOutsideTimebase_New;
PVMFDataSourcePositionParams iDataSourcePosParams;
// Objects for direction control.
int32 iPlaybackDirection;//1=forward, (-1)=backward.
int32 iPlaybackDirection_New;
bool iChangePlaybackDirectionWhenResuming;
PVPPlaybackPosition iChangeDirectionNPT;
// Variables to store data for SetPlaybackRange()
PVPPlaybackPosition iCurrentBeginPosition;
PVPPlaybackPosition iCurrentEndPosition;
bool iEndTimeCheckEnabled;
bool iQueuedRangePresent;
PVPPlaybackPosition iQueuedBeginPosition;
PVPPlaybackPosition iQueuedEndPosition;
bool iChangePlaybackPositionWhenResuming;
PVMFTimestamp iActualNPT;
PVMFTimestamp iTargetNPT;
PVMFTimestamp iActualMediaDataTS;
PVMFTimestamp iSkipMediaDataTS;
PVMFTimestamp iStartNPT;
PVMFTimestamp iStartMediaDataTS;
uint32 iWatchDogTimerInterval;
PVMFTimestamp iSeekPointBeforeTargetNPT;
PVMFTimestamp iSeekPointAfterTargetNPT;
// forward and reverse flags, a single flag can also serve, but kept for MP4 parser alignment.
bool iForwardReposFlag;
bool iBackwardReposFlag;
// Flag to keep track of whether play status event is enabled or not
bool iPlayStatusTimerEnabled;
// Flags to keep track of source auto-pause/resume
bool iDataReadySent;
bool removeCmdFromQ(OsclPriorityQueue<PVPlayerEngineCommand, OsclMemAllocator, Oscl_Vector<PVPlayerEngineCommand, OsclMemAllocator>, PVPlayerEngineCommandCompareLess> &aVec, const PVPlayerEngineCommandType aCmdType, bool aRemove);
bool removeCmdFromQ(Oscl_Vector<PVPlayerEngineCommand, OsclMemAllocator> &aVec, const PVPlayerEngineCommandType aCmdType, bool aRemove);
// Flag to keep track of whether playback has ended with end of clip
bool iPlaybackPausedDueToEndOfClip;
// Variables to store the source data duration
bool iSourceDurationAvailable;
uint32 iSourceDurationInMS;
PVMFMetadataList iSourceDurationKeyList;
Oscl_Vector<PvmiKvp, OsclMemAllocator> iSourceDurationValueList;
// Variables to store the source data duration
PVMFMetadataList iDlaDataKeyList;
Oscl_Vector<PvmiKvp, OsclMemAllocator> iDlaDataValueList;
// Player engine configuration
bool iPBPosEnable;
PVPPlaybackPositionUnit iPBPosStatusUnit;
uint32 iPBPosStatusInterval;
uint32 iEndTimeCheckInterval;
bool iSeekToSyncPoint;
bool iSkipToRequestedPosition;
bool iBackwardRepos; /* To avoid backward looping :: Flag to remember if this is a case of backward repositioning */
uint32 iSyncPointSeekWindow;
range_int32 iSyncMarginVideo;
range_int32 iSyncMarginAudio;
range_int32 iSyncMarginText;
uint32 iNodeCmdTimeout;
uint32 iNodeDataQueuingTimeout;
OSCL_HeapString<OsclMemAllocator> iProdInfoProdName;
OSCL_HeapString<OsclMemAllocator> iProdInfoPartNum;
OSCL_HeapString<OsclMemAllocator> iProdInfoHWPlatform;
OSCL_HeapString<OsclMemAllocator> iProdInfoSWPlatform;
OSCL_HeapString<OsclMemAllocator> iProdInfoDevice;
// stream ID for media streams
uint32 iStreamID;
//source roll over related
PVMFStatus DoSourceNodeRollOver(PVCommandId aCmdId, OsclAny* aCmdContext);
uint32 iAlternateSrcFormatIndex;
bool CheckForSourceRollOver();
enum RollOverState
{
RollOverStateIdle,
RollOverStateStart,
RollOverStateInProgress
};
RollOverState iRollOverState;
//To save CapnCapability in case of Protocol Rollover
Oscl_Vector<PvmiKvp *, OsclMemAllocator> iPvmiKvpCapNConfig;
struct PVPlayerEngineUuidNodeMapping
{
PVUuid iUuid;
PVMFNodeInterface* iNode;
PVPlayerEngineUuidNodeMapping(PVUuid aUuid, PVMFNodeInterface* aNode):
iUuid(aUuid), iNode(aNode) {}
};
//Vector to store the Uuids for the nodes created throughout the playback
Oscl_Vector<PVPlayerEngineUuidNodeMapping, OsclMemAllocator> iNodeUuids;
// For Track Selection during Prepare
Oscl_Vector<PVPlayerEngineTrackSelection, OsclMemAllocator> iTrackSelectionList;
PVMFMediaPresentationInfo iSourcePresInfoList;
PVMFMediaPresentationInfo iPlayableList;
PVMFMediaPresentationInfo iPreferenceList;
PVMFTrackSelectionHelper* iTrackSelectionHelper;
PVPPlaybackPositionMode iPlaybackPositionMode;
bool iOverflowFlag;
};
/**
* Inactivity timer object to Jitter Buffer node. This object generates event
* on remote inactivity (no UDP traffic from server for a certain time)
*/
#define DEFAULT_WATCHDOG_TIMERDURATION 10
#define PVPLAYERENGINE_DEFAULT_WATCHDOGTIMER_INTERVAL 1000
class PVPlayerWatchdogTimer : public OsclTimerObject
{
public:
PVPlayerWatchdogTimer(PVPlayerWatchdogTimerObserver* aTimerObserver):
OsclTimerObject(OsclActiveObject::EPriorityNominal, "PVPlayerWatchDogTimer"),
iTimerDuration(DEFAULT_WATCHDOG_TIMERDURATION),
iObserver(aTimerObserver),
iStarted(false)
{
AddToScheduler();
}
virtual ~PVPlayerWatchdogTimer()
{
Stop();
}
/** Start Timer */
PVMFStatus Start()
{
if (iTimerDuration != 0)
{
RunIfNotReady(iTimerDuration * 1000);
iStarted = true;
return PVMFSuccess;
}
else
{
return PVMFFailure;
}
}
void setTimerDuration(uint32 aTimerDuration)
{
Cancel();
iTimerDuration = (PVPLAYERENGINE_DEFAULT_WATCHDOGTIMER_INTERVAL < aTimerDuration) ? aTimerDuration : PVPLAYERENGINE_DEFAULT_WATCHDOGTIMER_INTERVAL;
}
uint32 getTimerDurationInMS()
{
return iTimerDuration;
}
/** Stop Timer events */
PVMFStatus Stop()
{
Cancel();
iStarted = false;
return PVMFSuccess;
}
bool IsTimerStarted()
{
return iStarted;
}
private:
void Run()
{
if (!iStarted)
return;
if (!iObserver)
{
// Error, No observer set
return;
}
iObserver->PVPlayerWatchdogTimerEvent();
/*
* Do not reschudule the AO here. Observer would reschedule this AO
* once it is done processing the timer event.
*/
}
uint32 iTimerDuration;
PVPlayerWatchdogTimerObserver* iObserver;
PVLogger* iLogger;
bool iStarted;
};
#endif