blob: e171acd92d3ef424f7e9bafdaca7b0341b0a9836 [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.
* -------------------------------------------------------------------
*/
/**
*
* @file pvmf_loopback_node.h
* @brief Simple loopback node. Incoming data is immediately routed to outport if it exists
*
*/
#ifndef PVMF_LOOPBACK_NODE_H_INCLUDED
#define PVMF_LOOPBACK_NODE_H_INCLUDED
#ifndef OSCL_BASE_H_INCLUDED
#include "oscl_base.h"
#endif
#ifndef OSCLCONFIG_IO_H_INCLUDED
#include "osclconfig_io.h"
#endif
#ifndef OSCL_FILE_IO_H_INCLUDED
#include "oscl_file_io.h"
#endif
#ifndef OSCL_PRIQUEUE_H_INCLUDED
#include "oscl_priqueue.h"
#endif
#ifndef OSCL_SCHEDULER_AO_H_INCLUDED
#include "oscl_scheduler_ao.h"
#endif
#ifndef PVMF_FORMAT_TYPE_H_INCLUDED
#include "pvmf_format_type.h"
#endif
#ifndef PVMF_SIMPLE_MEDIA_BUFFER_H_INCLUDED
#include "pvmf_simple_media_buffer.h"
#endif
#ifndef PVMF_MEDIA_DATA_H_INCLUDED
#include "pvmf_media_data.h"
#endif
#ifndef PVMF_NODE_INTERFACE_H_INCLUDED
#include "pvmf_node_interface.h"
#endif
#ifndef PVMF_NODE_UTIL_H_INCLUDED
#include "pvmf_node_utils.h"
#endif
#ifndef PVMF_LOOPBACK_IOPORT_H_INCLUDED
#include "pvmf_loopback_ioport.h"
#endif
#ifndef OSCL_MEM_MEMPOOL_H_INCLUDED
#include "oscl_mem_mempool.h"
#endif
#ifndef PVMF_MEDIA_DATA_H_INCLUDED
#include "pvmf_media_data.h"
#endif
#ifndef PVMF_SIMPLE_MEDIA_BUFFER_H_INCLUDED
#include "pvmf_simple_media_buffer.h"
#endif
////////////////////////////////////////////////////////////////////////////
//Default vector reserve size
#define PVMF_LOOPBACK_NODE_COMMAND_VECTOR_RESERVE 10
//Starting value for command IDs
#define PVMF_LOOPBACK_NODE_COMMAND_ID_START 6000
typedef enum
{
PVMF_LOOPBACKNODE_PORT_TYPE_LOOPBACK = 3
} PVMFLoopbackNodePortType;
//memory allocator type for this node.
typedef OsclMemAllocator PVMFLoopbackNodeAllocator;
///////////////////////////////////////////////////////////////////////////
class PVMFLoopbackAlloc : public Oscl_DefAlloc
{
public:
void* allocate(const uint32 size)
{
void* tmp = (void*)oscl_malloc(size);
return tmp;
}
void deallocate(void* p)
{
oscl_free(p);
}
};
typedef PVMFGenericNodeCommand<PVMFLoopbackNodeAllocator> PVMFLoopbackNodeCommandBase;
class PVMFLoopbackNodeCmd: public PVMFGenericNodeCommand<PVMFLoopbackNodeAllocator>
{
public:
//constructor for Custom2 command
void Construct(PVMFSessionId s, int32 cmd, int32 arg1, int32 arg2, int32& arg3, const OsclAny*aContext)
{
PVMFLoopbackNodeCommandBase::Construct(s, cmd, aContext);
iParam1 = (OsclAny*)arg1;
iParam2 = (OsclAny*)arg2;
iParam3 = (OsclAny*) & arg3;
}
void Parse(int32&arg1, int32&arg2, int32*&arg3)
{
arg1 = (int32)iParam1;
arg2 = (int32)iParam2;
arg3 = (int32*)iParam3;
}
};
enum PVMFLoopbackNodeCmdType
{
PVMFLOOPBACK_NODE_CMD_INIT,
PVMFLOOPBACK_NODE_CMD_REQUESTPORT,
PVMFLOOPBACK_NODE_CMD_START,
PVMFLOOPBACK_NODE_CMD_PAUSE,
PVMFLOOPBACK_NODE_CMD_STOP,
PVMFLOOPBACK_NODE_CMD_RELEASEPORT,
PVMFLOOPBACK_NODE_CMD_RESET,
PVMFLOOPBACK_NODE_CMD_PREPARE,
PVMFLOOPBACK_NODE_CMD_FLUSH,
PVMFLOOPBACK_NODE_CMD_CANCELCMD,
PVMFLOOPBACK_NODE_CMD_CANCELALL,
PVMFLOOPBACK_NODE_CMD_INVALID
};
typedef PVMFNodeCommandQueue<PVMFLoopbackNodeCmd, PVMFLoopbackNodeAllocator> PVMFLoopbackNodeCmdQ;
// Forward declaration
class PVMFLoopbackIOPort;
////////////////////////////////////////////////////////////////////////////
class PVMFLoopbackNode : public PVMFNodeInterface
, public OsclActiveObject
{
public:
OSCL_IMPORT_REF static PVMFNodeInterface* Create();
OSCL_IMPORT_REF ~PVMFLoopbackNode();
// Virtual functions of PVMFNodeInterface
//from PVMFNodeInterface
OSCL_IMPORT_REF PVMFStatus ThreadLogon();
OSCL_IMPORT_REF PVMFStatus ThreadLogoff();
OSCL_IMPORT_REF PVMFStatus GetCapability(PVMFNodeCapability& aNodeCapability);
OSCL_IMPORT_REF PVMFPortIter* GetPorts(const PVMFPortFilter* aFilter = NULL)
{
OSCL_UNUSED_ARG(aFilter);
return &iPortVector;
}
OSCL_IMPORT_REF PVMFCommandId QueryUUID(PVMFSessionId, const PvmfMimeString& aMimeType,
Oscl_Vector<PVUuid, PVMFLoopbackNodeAllocator>& aUuids,
bool aExactUuidsOnly = false,
const OsclAny* aContext = NULL);
OSCL_IMPORT_REF PVMFCommandId QueryInterface(PVMFSessionId, const PVUuid& aUuid,
PVInterface*& aInterfacePtr,
const OsclAny* aContext = NULL);
OSCL_IMPORT_REF PVMFCommandId RequestPort(PVMFSessionId
, int32 aPortTag, const PvmfMimeString* aPortConfig = NULL, const OsclAny* aContext = NULL);
OSCL_IMPORT_REF PVMFCommandId ReleasePort(PVMFSessionId, PVMFPortInterface& aPort, const OsclAny* aContext = NULL);
OSCL_IMPORT_REF PVMFCommandId Init(PVMFSessionId, const OsclAny* aContext = NULL);
OSCL_IMPORT_REF PVMFCommandId Prepare(PVMFSessionId, const OsclAny* aContext = NULL);
OSCL_IMPORT_REF PVMFCommandId Start(PVMFSessionId, const OsclAny* aContext = NULL);
OSCL_IMPORT_REF PVMFCommandId Stop(PVMFSessionId, const OsclAny* aContext = NULL);
OSCL_IMPORT_REF PVMFCommandId Flush(PVMFSessionId, const OsclAny* aContext = NULL);
OSCL_IMPORT_REF PVMFCommandId Pause(PVMFSessionId, const OsclAny* aContext = NULL);
OSCL_IMPORT_REF PVMFCommandId Reset(PVMFSessionId, const OsclAny* aContext = NULL);
OSCL_IMPORT_REF PVMFCommandId CancelAllCommands(PVMFSessionId, const OsclAny* aContextData = NULL);
OSCL_IMPORT_REF PVMFCommandId CancelCommand(PVMFSessionId, PVMFCommandId aCmdId, const OsclAny* aContextData = NULL);
// For input port to access private function / data
friend class PVMFLoopbackIOPort;
//from PVMFPortActivityHandler.
void HandlePortActivity(const PVMFPortActivity& aActivity)
{
OSCL_UNUSED_ARG(aActivity);
};
PVMFPortVector<PVMFLoopbackIOPort, PVMFLoopbackNodeAllocator> iPortVector;
private:
PVMFLoopbackNode(int32 aPriority);
void DoCancel();
void Run();
//Command processing
PVMFCommandId QueueCommandL(PVMFLoopbackNodeCmd&);
bool ProcessCommand(PVMFLoopbackNodeCmd&);
void CommandComplete(PVMFLoopbackNodeCmdQ&, PVMFLoopbackNodeCmd&, PVMFStatus, OsclAny* aData = NULL);
bool FlushPending();
PVMFLoopbackNodeCmdQ iInputCommands;
PVMFLoopbackNodeCmdQ iCurrentCommand;
//Command handlers.
void DoReset(PVMFLoopbackNodeCmd&);
void DoRequestPort(PVMFLoopbackNodeCmd&);
void DoReleasePort(PVMFLoopbackNodeCmd&);
void DoInit(PVMFLoopbackNodeCmd&);
void DoPrepare(PVMFLoopbackNodeCmd&);
void DoStart(PVMFLoopbackNodeCmd&);
void DoStop(PVMFLoopbackNodeCmd&);
void DoFlush(PVMFLoopbackNodeCmd&);
void DoPause(PVMFLoopbackNodeCmd&);
// Event reporting
void ReportErrorEvent(PVMFEventType aEventType, OsclAny* aEventData = NULL);
void ReportInfoEvent(PVMFEventType aEventType, OsclAny* aEventData = NULL);
void SetState(TPVMFNodeInterfaceState);
PVMFCommandId iCmdIdCounter;
// Input port
PVMFLoopbackIOPort* iIOPort;
PVMFNodeCapability iCapability;
PVLogger *iLogger;
PVMFNodeCmdStatusObserver *iObserver;
};
#endif // PVMF_LOOPBACK_NODE_H_INCLUDED