blob: f22ccf1c26eceab5ce5541bd5d40a73b762a99c0 [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 PVAE_NODE_UTILITY_H_INCLUDED
#define PVAE_NODE_UTILTIY_H_INCLUDED
#ifndef OSCL_BASE_H_INCLUDED
#include "oscl_base.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 PVLOGGER_H_INCLUDED
#include "pvlogger.h"
#endif
#ifndef PV_ENGINE_TYPES_H_INCLUDED
#include "pv_engine_types.h"
#endif
#ifndef PVMF_NODE_INTERFACE_H_INCLUDED
#include "pvmf_node_interface.h"
#endif
#define LOG_STACK_TRACE(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE, m)
#define LOG_DEBUG(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_DEBUG, m)
#define LOG_ERR(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,iLogger,PVLOGMSG_ERR,m)
/** Structure to contain a node and all ports and extensions associated to it */
class PVAENodeContainer
{
public:
PVAENodeContainer()
{
iNode = NULL;
iSessionId = 0;
iNodeCapConfigIF = NULL;
};
PVMFNodeInterface* iNode;
PVMFSessionId iSessionId;
PVUuid iUuid;
Oscl_Vector<PVMFPortInterface*, OsclMemAllocator> iInputPorts;
Oscl_Vector<PVMFPortInterface*, OsclMemAllocator> iOutputPorts;
Oscl_Vector<PVInterface*, OsclMemAllocator> iExtensions;
Oscl_Vector<PVUuid, OsclMemAllocator> iExtensionUuids;
PVInterface* iNodeCapConfigIF;
};
/** A vector of node container structures */
typedef Oscl_Vector<PVAENodeContainer*, OsclMemAllocator> PVAENodeContainerVector;
/** Enumerated list of node commands */
typedef enum
{
PVAENU_CMD_NONE,
PVAENU_CMD_CONNECT,
PVAENU_CMD_DISCONNECT,
PVAENU_CMD_QUERY_UUID,
PVAENU_CMD_QUERY_INTERFACE,
PVAENU_CMD_INIT,
PVAENU_CMD_PREPARE,
PVAENU_CMD_START,
PVAENU_CMD_STOP,
PVAENU_CMD_FLUSH,
PVAENU_CMD_PAUSE,
PVAENU_CMD_RESET,
} PVAENodeUtilCmdType;
/** Node utility command class */
class PVAENodeUtilCmd
{
public:
PVAENodeUtilCmd() : iType(PVAENU_CMD_NONE), iParam1(NULL), iParam2(NULL), iContext(NULL) {}
PVAENodeUtilCmd(const PVAENodeUtilCmd& aCmd)
{
Copy(aCmd);
}
PVAENodeUtilCmd& operator=(const PVAENodeUtilCmd& aCmd)
{
Copy(aCmd);
return (*this);
}
// For most commands
PVMFStatus Construct(PVAENodeUtilCmdType aType, const PVAENodeContainerVector& aNodes, OsclAny* aContext)
{
iType = aType;
iNodes = aNodes;
iContext = aContext;
return PVMFSuccess;
}
// For Connect
PVMFStatus ConstructConnect(PVAENodeContainer* aMasterNode, int32 aTag1,
PVAENodeContainer* aSlaveNode, int32 aTag2,
const PvmfMimeString& aMimeType, OsclAny* aContext)
{
iType = PVAENU_CMD_CONNECT;
iContext = aContext;
iParam1 = (OsclAny*)aTag1;
iParam2 = (OsclAny*)aTag2;
int32 err = 0;
OSCL_TRY(err,
iNodes.push_back(aMasterNode);
iNodes.push_back(aSlaveNode);
iMimeType = aMimeType;
);
OSCL_FIRST_CATCH_ANY(err, return PVMFErrNoMemory;);
return PVMFSuccess;
}
PVMFStatus ParseConnect(int32& aTag1, int32& aTag2, PvmfMimeString& aMimeType)
{
if (iType != PVAENU_CMD_CONNECT)
return PVMFFailure;
aTag1 = (int32)iParam1;
aTag2 = (int32)iParam2;
aMimeType = iMimeType;
return PVMFSuccess;
}
PVMFStatus ConstructDisconnect(PVAENodeContainer* aNodeContainer, OsclAny* aContext)
{
iType = PVAENU_CMD_DISCONNECT;
iContext = aContext;
int32 err = 0;
OSCL_TRY(err,
iNodes.push_back(aNodeContainer);
);
OSCL_FIRST_CATCH_ANY(err, return PVMFErrNoMemory;);
return PVMFSuccess;
}
PVMFStatus ConstructQueryUUID(PVAENodeContainer* aNodeContainer, const PvmfMimeString& aMimeType,
Oscl_Vector<PVUuid, OsclMemAllocator>& aUuids,
bool aExactUuidsOnly, OsclAny* aContext)
{
iType = PVAENU_CMD_QUERY_UUID;
iContext = aContext;
iParam1 = (OsclAny*) & aUuids;
iParam2 = (OsclAny*)aExactUuidsOnly;
int32 err = 0;
OSCL_TRY(err,
iNodes.push_back(aNodeContainer);
iMimeType = aMimeType;
);
OSCL_FIRST_CATCH_ANY(err, return PVMFErrNoMemory;);
return PVMFSuccess;
}
PVMFStatus ParseQueryUUID(Oscl_Vector<PVUuid, OsclMemAllocator>* aUuids, bool& aExactUuidsOnly)
{
if (iType != PVAENU_CMD_QUERY_UUID)
return PVMFFailure;
aUuids = (Oscl_Vector<PVUuid, OsclMemAllocator>*)iParam1;
aExactUuidsOnly = (iParam2 != NULL); // iParam2 is a bool
return PVMFSuccess;
}
PVMFStatus ConstructQueryInterface(PVAENodeContainer* aNodeContainer,
const PVUuid& aUuid,
PVInterface*& aInterfacePtr,
OsclAny* aContext)
{
iType = PVAENU_CMD_QUERY_INTERFACE;
iContext = aContext;
iParam1 = (OsclAny*) & aInterfacePtr;
iUuid = aUuid;
int32 err = 0;
OSCL_TRY(err,
iNodes.push_back(aNodeContainer);
);
OSCL_FIRST_CATCH_ANY(err, return PVMFErrNoMemory;);
return PVMFSuccess;
}
PVMFStatus ParseQueryInterface(PVInterface**& aInterfacePtr)
{
if (iType != PVAENU_CMD_QUERY_INTERFACE)
return PVMFFailure;
aInterfacePtr = (PVInterface**)iParam1;
return PVMFSuccess;
}
PVMFStatus ConstructInit(PVAENodeContainer* aNodeContainer, OsclAny* aContext)
{
iType = PVAENU_CMD_INIT;
iContext = aContext;
int32 err = 0;
OSCL_TRY(err,
iNodes.push_back(aNodeContainer);
);
OSCL_FIRST_CATCH_ANY(err, return PVMFErrNoMemory;);
return PVMFSuccess;
}
PVAENodeUtilCmdType iType;
PVAENodeContainerVector iNodes;
OSCL_HeapString<OsclMemAllocator> iMimeType;
PVUuid iUuid; // For QueryInterface
OsclAny* iParam1;
OsclAny* iParam2;
OsclAny* iContext;
private:
void Copy(const PVAENodeUtilCmd& aCmd)
{
iType = aCmd.iType;
iNodes = aCmd.iNodes;
iMimeType = aCmd.iMimeType;
iUuid = aCmd.iUuid;
iParam1 = aCmd.iParam1;
iParam2 = aCmd.iParam2;
iContext = aCmd.iContext;
}
};
/** Observer class to listen for utility command completion events */
class PVAENodeUtilObserver
{
public:
virtual void NodeUtilCommandCompleted(const PVMFCmdResp& aResponse) = 0;
virtual void NodeUtilErrorEvent(const PVMFAsyncEvent& aEvent) = 0;
virtual ~PVAENodeUtilObserver() {}
};
/**
* Utility class to connect two nodes and handle node commands to multiple
* nodes. Users of this utility must provide PVMFNodeCmdStatusObserver,
* PVMFNodeErrorEventObserver and PVMFNodeInfoEventObserver in order to
* receive callbacks for results of command issued to this utility.
*
* While this utility is processing a command, it will change the nodes'
* observers to this utility. Therefore there must be no pending commands
* in the node before this method is called. Other users of the node must not
* change the observers until this command is completed. Also, no additional commands
* should be made to these nodes until the command is completed. When the
* command is complete, the observers of the node will be set to the observers
* of this utility.
*/
class PVAuthorEngineNodeUtility : public OsclTimerObject,
public PVMFNodeCmdStatusObserver
{
public:
PVAuthorEngineNodeUtility();
virtual ~PVAuthorEngineNodeUtility();
/**
* Sets command status observer. After a utility
* command is completed, the command status observer for the nodes
* will be sent to the observer set here.
*
* @param aObserver Command status observer
*/
void SetObserver(const PVAENodeUtilObserver& aObserver)
{
iObserver = (PVAENodeUtilObserver*) & aObserver;
}
/**
* Connect two nodes. An output port will be requested from the specified
* input node, and an input port will be requested from the specified output
* node. The two ports will then be connected to establish a connection
* between the two nodes. This utility will callback to report status of
* the command after the connection is complete and will return the newly
* requested and connected ports will be added to the iInPorts or iOutPorts
* vector in the PVAENodeContainer objects passed in.
*
* @param aInputNode Container of input node of the connection. The newly requested
* port will be added to the iOutPorts vector of the node container.
* @param aOutputNode Container of output node of the connection. The newly requested
* port will be added to the iInPorts vector of the node container.
* @param aContext Optional opaque data to be passed back to user with the command response
* @returns Completion status
*/
PVMFStatus Connect(PVAENodeContainer* aMasterNode, int32 aTag1,
PVAENodeContainer* aSlaveNode, int32 aTag2,
const PvmfMimeString& aMimeType,
OsclAny* aContext = NULL);
/**
* Disconnect and release all ports of a node.
*
* @param aNodeContainer Container for node which ports will be disonnected and released
* @param aContext Optional opaque data to be passed back to user with the command response
* @returns Completion status
*/
PVMFStatus Disconnect(PVAENodeContainer* aNodeContainer, OsclAny* aContext = NULL);
/**
* Query UUIDs supported by the specified node.
*
* @param aNodeContainer Container for node to which this query is made
* @param aMimeType The MIME type of the desired interfaces
* @param aUuids A vector to hold the discovered UUIDs
* @param aExactUuidsOnly Turns on/off the retrival of UUIDs with aMimeType as a base type
* @param aContext Optional opaque data to be passed back to user with the command response
* @returns Completion status
*/
PVMFStatus QueryUUID(PVAENodeContainer* aNodeContainer,
const PvmfMimeString& aMimeType,
Oscl_Vector<PVUuid, OsclMemAllocator>& aUuids,
bool aExactUuidsOnly = false,
OsclAny* aContext = NULL);
/**
* Query for interface of specified Uuid from the specified node. The queried interface
* object will be added to the iExtensions vector and stored in the interface pointer
* provided by user. Also, Uuid of the queried interface will be added to the
* iExtensionsUuid vector.
*
* @param aNodeContainer Container for node to which this query is made
* @param aUuid The UUID of the desired interface
* @param aInterfacePtr Optional interface pointer to store the requested interface
* @param aContext Optional opaque data to be passed back to user with the command response
* @returns Completion status
*/
PVMFStatus QueryInterface(PVAENodeContainer* aNodeContainer,
const PVUuid& aUuid,
PVInterface*& aInterfacePtr,
OsclAny* aContext = NULL);
/**
* Initialize a node
*
* @param aNode Node container containing the node to be initialized.
* @param aContext Optional opaque data to be passed back to user with the command response
* @returns Completion status
*/
PVMFStatus Init(const PVAENodeContainer* aNode, OsclAny* aContext = NULL);
/**
* Initialize all nodes in the vector.
*
* @param aNodes Vector of nodes to be initialized
* @param aContext Optional opaque data to be passed back to user with the command response
* @returns Completion status
*/
PVMFStatus Init(const PVAENodeContainerVector& aNodes, OsclAny* aContext = NULL);
/**
* Prepare all nodes in the vector.
*
* @param aNodes Vector of nodes to be prepared
* @param aContext Optional opaque data to be passed back to user with the command response
* @returns Completion status
*/
PVMFStatus Prepare(const PVAENodeContainerVector& aNodes, OsclAny* aContext = NULL);
/**
* Start all ports of all nodes in the vector.
*
* @param aNodes Vector of nodes to be started
* @param aContext Optional opaque data to be passed back to user with the command response
* @returns Completion status
*/
PVMFStatus Start(const PVAENodeContainerVector& aNodes, OsclAny* aContext = NULL);
/**
* Pause all ports of all nodes in the vector.
*
* @param aNodes Vector of nodes to be paused
* @param aContext Optional opaque data to be passed back to user with the command response
* @returns Completion status
*/
PVMFStatus Pause(const PVAENodeContainerVector& aNodes, OsclAny* aContext = NULL);
/**
* Stop all ports of all nodes in the vector.
*
* @param aNodes Vector of nodes to be stopped
* @param aContext Optional opaque data to be passed back to user with the command response
* @returns Completion status
*/
PVMFStatus Stop(const PVAENodeContainerVector& aNodes, OsclAny* aContext = NULL);
/**
* Flush all ports of all nodes in the vector.
*
* @param aNodes Vector of nodes to be flushed
* @param aContext Optional opaque data to be passed back to user with the command response
* @returns Completion status
*/
PVMFStatus Flush(const PVAENodeContainerVector& aNodes, OsclAny* aContext = NULL);
/**
* Start all ports of all nodes in the vector.
*
* @param aNodes Vector of nodes to be reset
* @param aContext Optional opaque data to be passed back to user with the command response
* @returns Completion status
*/
PVMFStatus Reset(const PVAENodeContainerVector& aNodes, OsclAny* aContext = NULL);
/**
* Provides the size of command queue
*
* @returns Number of pending commands in command queue
*/
uint32 GetCommandQueueSize();
// Implement pure virtual method of PVMFNodeCmdStatusObserver
void NodeCommandCompleted(const PVMFCmdResp& aResponse);
private:
void Run();
// Command queue routines
PVMFStatus AddCmdToQueue(PVAENodeUtilCmd& aCmd);
void CompleteUtilityCmd(const PVAENodeUtilCmd& aCmd, PVMFStatus aStatus);
// Command processing routines
PVMFStatus DoConnect(const PVAENodeUtilCmd& aCmd);
PVMFStatus CompleteConnect(const PVAENodeUtilCmd& aCmd, const PVMFCmdResp& aResponse);
PVMFStatus DoDisconnect(const PVAENodeUtilCmd& aCmd);
PVMFStatus DoQueryUuid(const PVAENodeUtilCmd& aCmd);
PVMFStatus DoQueryInterface(const PVAENodeUtilCmd& aCmd);
PVMFStatus CompleteQueryInterface(const PVAENodeUtilCmd& aCmd);
PVMFStatus DoInit(const PVAENodeUtilCmd& aCmd);
PVMFStatus DoPrepare(const PVAENodeUtilCmd& aCmd);
PVMFStatus DoStart(const PVAENodeUtilCmd& aCmd);
PVMFStatus DoPause(const PVAENodeUtilCmd& aCmd);
PVMFStatus DoStop(const PVAENodeUtilCmd& aCmd);
PVMFStatus DoFlush(const PVAENodeUtilCmd& aCmd);
PVMFStatus DoReset(const PVAENodeUtilCmd& aCmd);
PVMFStatus CompleteStateTransition(const PVAENodeUtilCmd& aCmd, TPVMFNodeInterfaceState aState);
PVMFStatus ReleasePort(PVAENodeContainer*&, PVMFPortInterface*&);
// Observer
PVAENodeUtilObserver* iObserver;
// Command queue
Oscl_Vector<PVAENodeUtilCmd, OsclMemAllocator> iCmdQueue;
PVLogger* iLogger;
};
#endif // PVAE_NODE_UTILTIY_H_INCLUDED