blob: 8ed887b0d29516a8599ec32bf5f82bfabbea0709 [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_2WAY_DATAPATH_H_INCLUDED
#define PV_2WAY_DATAPATH_H_INCLUDED
#ifndef OSCL_ERROR_H_INCLUDED
#include "oscl_error.h"
#endif
#ifndef OSCL_VECTOR_H_INCLUDED
#include "oscl_vector.h"
#endif
#ifndef PV_2WAY_ENGINE_H_INCLUDED
#include "pv_2way_engine.h"
#endif
#ifndef PVMF_NODE_INTERFACE_H_INCLUDED
#include "pvmf_node_interface.h"
#endif
#ifndef PVMF_PORT_INTERFACE_H_INCLUDED
#include "pvmf_port_interface.h"
#endif
#define MAX_DATAPATH_NODES 10
#define MAX_PARENT_PATHS 2
#define MAX_DEPENDENT_PATHS 2
/**
* TPVNodeConfigTimeType enum
*
* An enumeration of when to configure the node
**/
typedef enum
{
EConfigBeforeInit = 0, //Configure node before initialization
EConfigBeforeReqInPort, //Configure node before requesting input port
EConfigBeforeReqOutPort, //Configure node before requesting output port
EConfigBeforePrepare, //Configure node before preparing
EConfigBeforeStart, //Configure node before starting
EMaxConfigTimeTypes
} TPVNodeConfigTimeType;
/**
* TPV2WayDatapathType enum
*
* An enumeration of types of data paths
**/
typedef enum
{
EUnknownDatapath = 0,
EEncodeDatapath,
EDecodeDatapath,
EMuxDatapath,
ERecDatapath,
EPreviewDatapath,
EMaxDatapathType
} TPV2WayDatapathType;
/**
* TPV2WayDatapathState enum
*
* An enumeration of broad external states of the data path
**/
typedef enum
{
EClosed = 0,
EOpening,
EOpened,
EPausing,
EPaused,
EUnpausing,
EClosing,
EMaxDataPathStates
} TPV2WayDatapathState;
/**
* TPVPortFormatSetType enum
*
* An enumeration of how the format type of the port is determined
**/
typedef enum
{
EUserDefined = 0, //User defines format type for port
EConnectedPortFormat, //Format is set to the connecting port's format
EUseOtherNodePortFormat, //Format is set to whatever the other node port is set to (nodes in a datapath have only 2 ports)
EAppDefined, //Format is pre-set during RequestPort. Does not need to be set
EMaxFormatSetTypes
} TPVPortFormatSetType;
/**
* CPV2WayPortPair Class
*
* Specifies a pair of node ports that describe a data connection and the status of the ports.
**/
class CPV2WayPortPair
{
public:
CPV2WayPortPair() : iIsConnected(false) {};
~CPV2WayPortPair() {};
bool Connect();
bool Disconnect();
CPV2WayPort iSrcPort;
CPV2WayPort iDestPort;
bool iIsConnected;
};
/**
* CPVDatapathPort Class
*
* Describes how to use a port in a datatpath.
**/
class CPVDatapathPort
{
public:
CPVDatapathPort() : iPortTag(0),
iRequestPortState(EPVMFNodeInitialized),
iCanCancelPort(false),
iPortSetType(EUserDefined),
iFormatType(PVMF_MIME_FORMAT_UNKNOWN),
iDefaultFormatType(PVMF_MIME_FORMAT_UNKNOWN),
iPortPair(NULL)
{
};
CPVDatapathPort(const CPVDatapathPort &aPort) : iPortTag(aPort.iPortTag),
iRequestPortState(aPort.iRequestPortState),
iRequestPortAnytime(aPort.iRequestPortAnytime),
iCanCancelPort(aPort.iCanCancelPort),
iPortSetType(aPort.iPortSetType),
iFormatType(aPort.iFormatType),
iDefaultFormatType(aPort.iDefaultFormatType),
iPortPair(aPort.iPortPair)
{
};
~CPVDatapathPort() {};
CPVDatapathPort& operator=(const CPVDatapathPort& a);
int32 iPortTag; // The port tag
TPVMFNodeInterfaceState iRequestPortState; //State of node to request/release port
bool iRequestPortAnytime; //Can port be requested in any node state
bool iCanCancelPort; // Can the request port command be cancelled for the port
TPVPortFormatSetType iPortSetType; // How to determine format type for the port
PVMFFormatType iFormatType; // Sets format type for the port
PVMFFormatType iDefaultFormatType; // In the case the CapConfig interface is stupid
CPV2WayPortPair *iPortPair; // The out port will be the iSrcPort of the port pair
// The in port will be the iDestPort of the port pair
};
/**
* CPVDatapathNode Class
*
* Describes how a node is used in a datatpath.
**/
class CPVDatapathNode
{
public:
CPVDatapathNode() : iConfigure(NULL),
iConfigTime(EConfigBeforeInit),
iCanNodePause(false),
iLoggoffOnReset(false),
iOriginalState(EPVMFNodeIdle),
iDatapathCloseState(EPVMFNodeLastState),
iCommandIssued(false)
{};
CPVDatapathNode(const CPVDatapathNode &aNode) : iNode(aNode.iNode),
iConfigure(aNode.iConfigure),
iConfigTime(aNode.iConfigTime),
iCanNodePause(aNode.iCanNodePause),
iLoggoffOnReset(aNode.iLoggoffOnReset),
iIgnoreNodeState(aNode.iIgnoreNodeState),
iOriginalState(aNode.iOriginalState),
iDatapathCloseState(aNode.iDatapathCloseState),
iInputPort(aNode.iInputPort),
iOutputPort(aNode.iOutputPort),
iCommandIssued(aNode.iCommandIssued)
{};
~CPVDatapathNode() {};
CPVDatapathNode& operator=(const CPVDatapathNode& a);
bool CloseableState()
{
PVMFNodeInterface * nodeIFace = (PVMFNodeInterface *)iNode;
if (iDatapathCloseState != EPVMFNodeLastState &&
nodeIFace->GetState() == iDatapathCloseState)
return true;
if (iDatapathCloseState == EPVMFNodeLastState &&
nodeIFace->GetState() == iOriginalState)
return true;
return false;
}
TPV2WayNode iNode; // Actual node
CPV2WayNodeConfigurationObserver *iConfigure; // Node configuration observer, called when config time is reached
TPVNodeConfigTimeType iConfigTime; // When to configure node
bool iCanNodePause; // Is the node capable of pausing
bool iLoggoffOnReset; // Does node need to logoff after datapath is reset
bool iIgnoreNodeState; // Flag for that specifies whether the datapath changes the state of the node
TPVMFNodeInterfaceState iOriginalState; // The state of the node when it is added to the datapath
TPVMFNodeInterfaceState iDatapathCloseState; // The state in which the node should be in before the
// datapath closes
CPVDatapathPort iInputPort;
CPVDatapathPort iOutputPort;
bool iCommandIssued;
};
class CPV2WayDatapath : public HeapBase, public CPV2WayNodeCommandObserver
{
private:
TPV2WayNode* iNode;
public:
CPV2WayDatapath(PVLogger *aLogger,
TPV2WayDatapathType aType,
PVMFFormatType aFormat,
CPV324m2Way *a2Way) : iType(aType),
iState(EClosed),
iStateBeforeClose(EClosed),
iFormat(aFormat),
iSourceSinkFormat(PVMF_MIME_FORMAT_UNKNOWN),
i2Way(a2Way),
iLogger(aLogger),
iAllPortsConnected(false)
{};
virtual ~CPV2WayDatapath() {};
bool IsPortInDatapath(PVMFPortInterface *aPort);
bool IsNodeInDatapath(PVMFNodeInterface *aNode);
bool ResetDatapath();
bool AddNode(const CPVDatapathNode &aNode);
bool Open();
bool Close();
bool Pause();
bool Resume();
bool AddParentDatapath(CPV2WayDatapath &aDatapath);
bool AddDependentDatapath(CPV2WayDatapath &aDatapath);
TPV2WayDatapathState GetState()
{
return iState;
}
void SetFormat(PVMFFormatType aFormatType)
{
iFormat = aFormatType;
}
PVMFFormatType GetFormat()
{
return iFormat;
}
void CommandHandler(PV2WayNodeCmdType aType, const PVMFCmdResp& aResponse);
void CheckPath();
void SetFormatSpecificInfo(uint8* fsi, uint16 fsi_len);
uint8* GetFormatSpecificInfo(uint32* len);
void SetSourceSinkFormat(PVMFFormatType aFormatType);
PVMFFormatType GetSourceSinkFormat() const;
protected:
void ConstructL();
bool SendNodeCmd(PV2WayNodeCmdType cmd, int i);
int SetParametersSync(PvmiCapabilityAndConfig * configPtr,
PvmiKvp* portParams,
PvmiKvp*& portParamsReturn);
bool CheckNodePorts(bool& aCheckPort, int i);
void SetPort(CPV2WayPort &aDatapathPort, PVMFPortInterface *aPort)
{
aDatapathPort.SetPort(aPort);
}
void SetState(TPV2WayDatapathState aState);
bool IsDatapathNodeClosed(CPVDatapathNode &aNode);
bool CheckNodePortsL(CPVDatapathNode &aNode);
PVMFStatus PortStatusChange(PVMFNodeInterface *aNode, PVMFCommandId aId, PVMFPortInterface *aPort);
CPV2WayPort *RetrievePort(PVMFNodeInterface *aNode, PVMFCommandId aId);
PVMFStatus ReleaseNodePorts(CPVDatapathNode &aNode);
void CloseNodePorts(CPVDatapathNode &aNode);
PVMFCommandId SendNodeCmdL(PV2WayNodeCmdType aCmd,
CPVDatapathNode &aNode,
void *aParam = NULL);
PVMFStatus CheckConfig(TPVNodeConfigTimeType aConfigTime, CPVDatapathNode &aNode);
//Can be overriden in derived datapaths
virtual void CheckOpen();
virtual void CheckPause();
virtual void CheckResume();
virtual void CheckClosed();
virtual void OpenComplete() = 0;
virtual void PauseComplete() = 0;
virtual void ResumeComplete() = 0;
virtual void CloseComplete() = 0;
virtual void DatapathError() = 0;
virtual bool CheckPathSpecificOpen()
{
return true;
}
virtual bool PathSpecificClose()
{
return true;
}
virtual bool CheckPathSpecificStart()
{
return true;
}
virtual void DependentPathClosed(CPV2WayDatapath *aDependentPath);
bool HaveAllDependentPathsClosed();
bool IsParentClosing();
void NotifyParentPaths();
virtual bool ParentIsClosing();
virtual bool SingleNodeOpen()
{
return false;
}
PVMFStatus GetKvp(PVMFPortInterface &aPort, bool aInput,
PvmiKvp*& aKvp, int& aNumKvpElem, OsclAny*& aconfigPtr);
PVMFFormatType GetPortFormatType(PVMFPortInterface& aPort,
bool aInput, PVMFPortInterface* aOtherPort);
TPV2WayDatapathType iType;
TPV2WayDatapathState iState;
TPV2WayDatapathState iStateBeforeClose;
// The codec type associated with this datapath
PVMFFormatType iFormat;
// The format type of the terminating source/sink
PVMFFormatType iSourceSinkFormat;
CPV324m2Way *i2Way;
PVLogger *iLogger;
bool iAllPortsConnected;
Oscl_Vector<CPVDatapathNode, BasicAlloc> iNodeList;
Oscl_Vector<CPV2WayPortPair, BasicAlloc> iPortPairList;
//List of datapaths this datapath depends on
Oscl_Vector<CPV2WayDatapath *, BasicAlloc> iParentPathList;
//List of datapaths that depend on this datapath
Oscl_Vector<CPV2WayDatapath *, BasicAlloc> iDependentPathList;
// Format specific info associated with this datapath
uint8* iFsi;
uint32 iFsiLen;
};
#endif //PV_2WAY_DATAPATH_H_INCLUDED