blob: a7a05119d6a9f80aae164288ca8b7497c4cba9ce [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.
* -------------------------------------------------------------------
*/
#include "oscl_base.h"
#include "oscl_mem.h"
#include "osclconfig_compiler_warnings.h"
#include "tscmain.h"
#include "h223types.h"
#include "h223_api.h"
#include "h223.h"
#include "cpvh223multiplex.h"
#include "layer.h"
#include "tsc_eventreceive.h"
#include "tsc_h324m_config.h"
#include "tsc_statemanager.h"
#include "tsc_lc.h"
#include "tsc_blc.h"
#include "tsc_clc.h"
#include "tsc_constants.h"
#include "tsc_mt.h"
#include "tsc_component.h"
#include "tsc_capability.h"
#include "tsc_channelcontrol.h"
#ifdef MEM_TRACK
#include "oscl_mem.h"
#include "oscl_mem_audit.h"
#endif
#define PV_2WAY_TSC_TIMER_ID "PV_2WAY_TSC_TIMER"
#define PV_2WAY_TSC_TIMER_INTERVAL 1 /* 1 second */
#define PV_2WAY_TSC_NUM_CMD_Q_ELEMENTS 10
#define PV_2WAY_TSC_NUM_PENDING_CMD_Q_ELEMENTS 10
#define TSC_MAX_CONTROL_CHANNEL_BITRATE_BPS 64000
#define TSC_BIG_UINT32 0XFFFFFFFF
#define TSC_H223_LEVEL_DEFAULT H223_LEVEL2
#define DEFAULT_TCS_RECEIVE_TIMEOUT_SECONDS 20
#define DEFAULT_TCS_LEVEL_SETUP_TIMEOUT_SECONDS 6
#define DEFAULT_RTD_TIMER_SECONDS 7
// Default command queue reserve size
#define PVMF_CMD_QUEUE_RESERVE 10
// Starting value for command IDs
#define PVMF_CMD_ID_START 10000
// the assumed minimum T401 timer interval for sizing memory pools
#define PV2WAY_TSC_MIN_T401_INCOMING 100
OSCL_EXPORT_REF TSC_324m::TSC_324m(TPVLoopbackMode aLoopbackMode)
: TSC(),
OsclActiveObject(OsclActiveObject::EPriorityHigh, "TSC"),
Msd(NULL),
Ce(NULL),
iSrp(NULL),
iH245(NULL),
iH223(NULL),
iVendor(NULL),
iProductNumber(NULL),
iVersionNumber(NULL),
iVendorR(NULL),
iProductNumberR(NULL),
iVersionNumberR(NULL),
iTransmitCaps(NULL),
iSuppInfo(NULL),
iSuppInfoLen(0),
iLoopbackMode(aLoopbackMode),
iTimer(NULL),
iOutgoingSrpPort(NULL),
iIncomingSrpPort(NULL),
iTscSrpBuffer(NULL),
iLogger(NULL),
iTSC_324mObserver(NULL),
iTSCcomponent(NULL),
iTSCblc(iTSCstatemanager),
iTSClc(iTSCstatemanager),
iTSCcapability(iTSCstatemanager),
iComponentRegistry(iTSCstatemanager,
iTSCcapability,
iTSClc,
iTSCblc,
iTSCclc,
iTSCmt)
{
iLogger = PVLogger::GetLoggerObject("3g324m.h245user");
iTSCcomponent = NULL;
AddToScheduler();
SetDispatchTable();
iDisconnectInitiator = EPVT_NONE;
iConnectFailReason = EPVT_Failed;
iOutgoingSrpPort = NULL;
iIncomingSrpPort = NULL;
iTscSrpBuffer = NULL;
iCurrentCmdId = 1;
iInitialized = false;
iInitializedComponent = false;
iEnableWnsrp = true;
iCmdQueue.Construct(PVMF_CMD_ID_START, PVMF_CMD_QUEUE_RESERVE);
iPendingCmdQueue.Construct(PVMF_CMD_ID_START, PVMF_CMD_QUEUE_RESERVE);
}
TSC_324m::~TSC_324m()
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::~TSC_324m"));
ResetTsc();
}
void TSC_324m::SetInitialValues()
{
initVarsLocal();
initVarsSession();
iInitialized = true;
}
void TSC_324m::initVarsLocal()
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::initVarsLocal"));
if (iTransmitCaps)
{
OSCL_DEFAULT_FREE(iTransmitCaps);
iTransmitCaps = NULL;
}
iSendRme = false;
iCsupSeq = 0;
iRequestMaxMuxPduSize = H223_MAX_DEMUX_PDU_SIZE;
iPendingCmdQueue.Construct(1, 5);
iOutgoingPduType = H223_PDU_COMBINED;
iEndSessionTimeout = DEFAULT_END_SESSION_TIMEOUT;
iTimerValues.iT101 = iTimerValues.iT103 = iTimerValues.iT104 =
iTimerValues.iT105 = iTimerValues.iT106 = iTimerValues.iT107 =
iTimerValues.iT108 = iTimerValues.iT109 = TSC_SE_TIMEOUT_DEFAULT;
iT401 = T401_DEFAULT; /* SRP */
iN100 = N100_DEFAULT; /* H245 */
iN401 = N401_DEFAULT; /* SRP */
iCeRetries = iN100; /* Num CE retries left */
iEnableWnsrp = true;
iMultiplexingDelayMs = 0;
iInLogicalChannelBufferingMs = 0;
iOutLogicalChannelBufferingMs = 0;
iTSCstatemanager.InitVarsLocal();
iTSCcapability.InitVarsLocal();
if (iTSCcomponent)
{
iTSCcomponent->InitVarsLocal();
}
}
void TSC_324m::initVarsSession()
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::initVarsSession"));
iTerminalStatus = Phase0_Idle; /* Terminal Status */
iDisconnectInitiator = EPVT_NONE;
iConnectFailReason = EPVT_Failed;
iMaxMuxPduCapabilityR = false;
/* Terminal ID for vendor identification */
/* Local terminal id */
if (iVendorR)
{
OSCL_DELETE(iVendorR);
}
if (iProductNumberR)
{
OSCL_DEFAULT_FREE(iProductNumberR);
}
if (iVersionNumberR)
{
OSCL_DEFAULT_FREE(iVersionNumberR);
}
iVendorR = NULL;
iProductNumberR = NULL;
iProductNumberLenR = 0;
iVersionNumberR = NULL;
iVersionNumberLenR = 0;
iH223Level = TSC_H223_LEVEL_DEFAULT;
iMuxTableUpdateRequired = false;
if (iSuppInfo)
{
OSCL_DEFAULT_FREE(iSuppInfo);
iSuppInfo = NULL;
iSuppInfoLen = 0;
}
iCeRetries = iN100; /* Num CE retries left */
/* Initialized RTD values */
iNumRtdRequests = 0;
iRtdMin = TSC_BIG_UINT32;
iRtdMax = 0;
iRtdAve = 0;
iTSCstatemanager.InitVarsSession();
iTSCmt.InitVarsSession();
iTSCcapability.InitVarsSession();
if (iTSCcomponent)
{
iTSCcomponent->InitVarsSession();
}
}
void TSC_324m::IgnoreH245Callbacks()
{
if (!iH245)
{
return;
}
iH245->SetObserver(NULL);
Msd->SetObserver(NULL);
Ce->SetObserver(NULL);
}
void TSC_324m::InitComponent()
{
#ifdef MEM_TRACK
printf("\nMemory Stats before TSC Component Init\n");
MemStats();
#endif
if (!iTSCcomponent)
{
PVInterface *componentInterface;
// QueryInterface sets iTSCcomponent
QueryInterface(0, PVUuidH324ComponentInterface, (PVInterface*&)componentInterface);
if (!iTSCcomponent)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_324m::InitComponent- unable to create component"));
OSCL_LEAVE(PVMFFailure);
}
iTSCcomponent->InitVarsLocal();
iTSCcomponent->InitVarsSession();
}
if (iTSCcomponent &&
!iInitializedComponent &&
iH245 &&
iH223)
{
iTSCcomponent->SetMembers(iH245, iH223, iObserver);
iTSCcomponent->InitTsc();
iInitializedComponent = true;
}
#ifdef MEM_TRACK
printf("\nMemory Stats after TSC Component Init\n");
MemStats();
#endif
}
TPVStatusCode TSC_324m::InitTsc()
{
#ifdef MEM_TRACK
printf("\nMemory Stats before TSC Init\n");
MemStats();
#endif
int error;
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC: InitTsc"));
if (!iInitialized)
{
SetInitialValues();
}
// Allocate stack elements.
iH245 = OSCL_NEW(H245, ());
iH245->SetObserver(this);
iSrp = OSCL_NEW(SRP, ());
iSrp->SetObserver(this);
iH223 = OSCL_NEW(CPVH223Multiplex, (iLoopbackMode));
iH223->SetObserver(this);
iTSClc.SetH245(iH245);
iTSCblc.SetH245(iH245);
iTSCclc.SetH245(iH245);
InitComponent();
iTSCcapability.SetMembers(iTSCcomponent);
iTSCmt.SetMembers(iH245, iH223, iTSCcomponent);
iH223->SetClock(iClock);
iH223->Open();
// set direct connection to MSD SE
Msd = iH245->GetMSD();
Msd->SetObserver(this);
// set direct connection to CE SE
Ce = iH245->GetCE();
Ce->SetObserver(this);
OSCL_TRY(error, iTscSrpBuffer = TscSrpBuffer::NewL());
if (error)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR,
(0, "TSC: InitTsc, tscsrpbuffer allocation failed", error));
}
iTimer = OSCL_NEW(OsclTimer<OsclMemAllocator>,
(PV_2WAY_TSC_TIMER_ID, PV_2WAY_TSC_TIMER_INTERVAL));
//OSCL_TRAP_NEW(iTimer, OsclTimer<OsclMemAllocator>, (PV_2WAY_TSC_TIMER_ID, PV_2WAY_TSC_TIMER_INTERVAL) );
iTimer->SetObserver(this);
#ifdef MEM_TRACK
printf("\nMemory Stats after TSC Init\n");
MemStats();
#endif
return EPVT_Success;
}
TPVStatusCode TSC_324m::ResetTsc()
{
TPVStatusCode ret = EPVT_Success;
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC: Reset request."));
if (iTSCcomponent)
{
iTSCcomponent->ResetTsc();
iTSCstatemanager.WriteState(TSC_CE_RECEIVE, NOT_STARTED);
iTSCstatemanager.WriteState(TSC_CE_SEND, NOT_STARTED);
iInitializedComponent = false; // TSC Component
}
if (iSrp)
{
if (iSrp->RequestULPort(SRP_INPUT_PORT_TAG))
iSrp->RequestULPort(SRP_INPUT_PORT_TAG)->Disconnect();
if (iSrp->RequestULPort(SRP_OUTPUT_PORT_TAG))
iSrp->RequestULPort(SRP_OUTPUT_PORT_TAG)->Disconnect();
}
if (iTscSrpBuffer)
{
iTscSrpBuffer->GetLLPort(TSCSRPBUFFER_INPUT_PORT_TAG)->Disconnect();
iTscSrpBuffer->GetLLPort(TSCSRPBUFFER_OUTPUT_PORT_TAG)->Disconnect();
}
if (iH245)
{
iH245->UnBind();
}
if (iIncomingSrpPort)
{
iIncomingSrpPort->Disconnect();
iIncomingSrpPort = NULL;
}
if (iOutgoingSrpPort)
{
iOutgoingSrpPort->Disconnect();
iOutgoingSrpPort = NULL;
}
if (iH223)
{
H223IncomingChannelPtr incoming_control_channel;
PVMFStatus aStatus = iH223->GetIncomingChannel((TPVChannelId)0,
incoming_control_channel);
if (aStatus == PVMFSuccess)
{
incoming_control_channel->Disconnect();
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_324m::ResetTsc Error - Failed to lookup incoming logical channel %d", 0));
}
H223OutgoingChannelPtr outgoing_control_channel;
aStatus = iH223->GetOutgoingChannel((TPVChannelId)0, outgoing_control_channel);
if (aStatus == PVMFSuccess)
{
outgoing_control_channel->Disconnect();
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_324m::ResetTsc Error - Failed to lookup outgoing logical channel %d", 0));
}
}
//Shutdown stack elements.
if (iTransmitCaps)
{
OSCL_DEFAULT_FREE(iTransmitCaps);
iTransmitCaps = NULL;
}
if (iVendor)
{
delete iVendor;
iVendor = NULL;
}
if (iVendorR)
{
delete iVendorR;
iVendorR = NULL;
}
if (iProductNumber)
{
OSCL_DEFAULT_FREE(iProductNumber);
iProductNumber = NULL;
}
if (iProductNumberR)
{
OSCL_DEFAULT_FREE(iProductNumberR);
iProductNumberR = NULL;
}
if (iVersionNumber)
{
OSCL_DEFAULT_FREE(iVersionNumber);
iVersionNumber = NULL;
}
if (iVersionNumberR)
{
OSCL_DEFAULT_FREE(iVersionNumberR);
iVersionNumberR = NULL;
}
if (iTimer)
{
iTimer->Clear();
OSCL_DELETE(iTimer);
iTimer = NULL;
}
if (iTSCcomponent)
{
OSCL_DELETE(iTSCcomponent);
iTSCcomponent = NULL;
}
if (iH223)
{
iH223->Close();
DeallocateH223Mux(iH223);
iH223 = NULL;
}
if (iTscSrpBuffer)
{
OSCL_DELETE(iTscSrpBuffer);
iTscSrpBuffer = NULL;
}
if (iSrp)
{
iSrp->SrpReset();
OSCL_DELETE(iSrp);
iSrp = NULL;
}
if (iH245)
{
OSCL_DELETE(iH245);
iH245 = NULL;
}
iInitialized = false; //TSC node
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC: Reset request - done"));
#ifdef MEM_TRACK
printf("\nMemory Stats after TSC Reset\n");
MemStats();
#endif
return ret;
}
TPVStatusCode TSC_324m::SetOutgoingBitrate(int32 bitrate)
{
iH223->SetBitrate(bitrate);
return EPVT_Success;
}
TPVStatusCode TSC_324m::SetTimerRes(uint32 timer_res)
{
return iH223->SetTimerRes(timer_res);
}
TPVStatusCode TSC_324m::SetTerminalParam(CPVTerminalParam* params)
{
CPVH324MParam* h324params = (CPVH324MParam*)params;
iSendRme = h324params->iSendRme;
iRequestMaxMuxPduSize = h324params->iRequestMaxMuxPduSize;
iTSCcomponent->SetTerminalParam(*h324params);
iTSCstatemanager.SetTerminalParam(params);
return EPVT_Success;
}
CPVTerminalParam* TSC_324m::GetTerminalParam()
{
CPVH223MuxParam h223Param;
CPVH324MParam* h324param = new CPVH324MParam();
iTSCcomponent->GetTerminalParam(*h324param);
h324param->iMasterSlave = (TPVMasterSlave)iTSCstatemanager.ReadState(TSC_MSD_DECISION);
h324param->SetH223Param(&h223Param);
return h324param;
}
TPVStatusCode
TSC_324m::Connect(uint16 info_len, uint8* info_buf)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF, iLogger, PVLOGMSG_NOTICE,
(0, "TSC_324m::Connect"));
TPVStatusCode ret = EPVT_Pending;
iMuxTableUpdateRequired = false;
iStopCmd = NULL;
iTerminalStatus = Phase0_Idle;
iTSCmt.ClearVars();
// moved stuff to component
if (!iTSCcomponent->Connect1LevelKnown())
{
iH223Level = H223_LEVEL_UNKNOWN;
}
ResetStats();
iH245->Reset();
iH245->SetTimers(iTimerValues);
// set direct connection to MSD SE
Msd = iH245->GetMSD();
Msd->SetObserver(this);
// set direct connection to CE SE
Ce = iH245->GetCE();
Ce->SetObserver(this);
if (iSuppInfo)
{
OSCL_DEFAULT_FREE(iSuppInfo);
iSuppInfo = NULL;
iSuppInfoLen = 0;
}
if (info_len)
{
iSuppInfo = (uint8*)OSCL_DEFAULT_MALLOC(info_len);
iSuppInfoLen = info_len;
oscl_memcpy(iSuppInfo, info_buf, info_len);
}
iTimer->Clear();
CPVH223MuxParam level_set;
// Initialize the mux and wait for completion. Performs level setup
if (iH223Level != H223_LEVEL_UNKNOWN)
{
iH223->SetMultiplexLevel(iH223Level);
}
iH223->SetMultiplexingDelayMs((uint16)iMultiplexingDelayMs);
iH223->SetLogicalChannelBufferingMs(iInLogicalChannelBufferingMs,
iOutLogicalChannelBufferingMs);
iH223->SetClock(iClock);
S_H223LogicalChannelParameters lcnParams;
lcnParams.segmentableFlag = true;
lcnParams.adaptationLayerType.index = 1;
H223ChannelParam in_channel_params(0,
&lcnParams,
TSC_MAX_CONTROL_CHANNEL_BITRATE_BPS,
PV2WAY_TSC_MIN_T401_INCOMING);
H223ChannelParam out_channel_params(0,
&lcnParams,
TSC_MAX_CONTROL_CHANNEL_BITRATE_BPS,
iT401*100);
iH223->OpenChannel(OUTGOING, 0, &out_channel_params);
iH223->OpenChannel(INCOMING, 0, &in_channel_params);
ConfigureSrp(iH223Level);
// Reset global states (RAN-MS)
iTSCstatemanager.StateInitialize(); // Reset call-setup states
iTerminalStatus = PhaseD_CSUP;
iTSCcomponent->Connect2();
return ret;
}
void TSC_324m::SetClock(PVMFMediaClock* aClock)
{
iClock = aClock;
}
void TSC_324m::DataReceptionStart()
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::DataReceptionStart"));
/* Start timer for Level Setup countdown */
int32 levelSetupTimeoutInfo = 0;
if (iTSCcomponent->IsEnabled())
{
levelSetupTimeoutInfo = 1; // Level setup can commence again if it fails the first time
}
iTimer->Request(PV_TSC_LEVEL_SETUP_TIMER_ID, levelSetupTimeoutInfo,
DEFAULT_TCS_LEVEL_SETUP_TIMEOUT_SECONDS, this);
}
void TSC_324m::MuxSetupComplete(PVMFStatus status, TPVH223Level level)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::MuxSetupComplete status=%d, level=%d",
status, level));
iTimer->Cancel(PV_TSC_LEVEL_SETUP_TIMER_ID);
/* Reconfigure SRP if multiplex level 0 is negotiated starting from a higher level */
if (level == H223_LEVEL0 && level != iH223Level)
{
ConfigureSrp(level);
}
iH223Level = level;
if (status == PVMFPending)
{
return;
}
if (status != PVMFSuccess)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::MuxSetupComplete Mux setup failed."));
SignalCsupComplete(status);
return;
}
iTSCcomponent->MuxSetupComplete(status, level);
OpenSession();
iTimer->Request(PV_TSC_RTD_TIMER_ID, PV_TSC_RTD_TIMER_ID, DEFAULT_RTD_TIMER_SECONDS, this, false);
/* Start timer for TCS countdown */
if (iTSCstatemanager.ReadState(TSC_CE_RECEIVE) != COMPLETE)
{
iTimer->Request(PV_TSC_TCS_RECEIVE_TIMER_ID, PV_TSC_TCS_RECEIVE_TIMER_ID,
DEFAULT_TCS_RECEIVE_TIMEOUT_SECONDS, this);
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::MuxSetupComplete TCS received before MuxSetupComplete."));
}
}
void TSC_324m::MuxCloseComplete()
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m: Mux close complete - status(%d).", iTerminalStatus));
/* All logical channels closed */
iTerminalStatus = PhaseF_End;
iH245->Reset();
// set direct connection to MSD SE
Msd = iH245->GetMSD();
Msd->SetObserver(this);
// set direct connection to CE SE
Ce = iH245->GetCE();
Ce->SetObserver(this);
iH223->CloseChannel(OUTGOING, 0);
iH223->CloseChannel(INCOMING, 0);
}
void TSC_324m::MuxErrorOccurred(TPVDirection direction,
TPVMuxComponent component,
PVMFStatus error,
uint8* info,
uint info_len)
{
OSCL_UNUSED_ARG(info_len);
OSCL_UNUSED_ARG(info);
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::MuxErrorOccurred - direction(%d), component(%d), error(%d)",
direction, component, error));
TPVChannelId id = CHANNEL_ID_UNKNOWN;
if (info && component == PV_MUX_COMPONENT_LOGICAL_CHANNEL)
{
id = *((TPVChannelId*)info);
if (!iTSCcomponent->HasOlc(direction, id))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::MuxErrorOccurred - Failed to lookup channel info, lcn=%d",
id));
return;
}
if (direction == INCOMING)
{
H223IncomingChannelPtr incoming_lcn;
PVMFStatus aStatus = iH223->GetIncomingChannel(id, incoming_lcn);
if (aStatus == PVMFSuccess)
{
if (!incoming_lcn->IsConnected())
{
RequestFrameUpdate(incoming_lcn);
}
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::MuxErrorOccurred - Failed to lookup incoming channel, lcn=%d",
id));
return;
}
}
}
PVMFAsyncEvent aEvent(PVMFInfoEvent, error, this, NULL);
uint8* buf = aEvent.GetLocalBuffer();
buf[0] = (uint8)PV_H324COMPONENT_H223;
buf[1] = (uint8)component;
buf[2] = (uint8)direction;
if (component == PV_MUX_COMPONENT_LOGICAL_CHANNEL)
{
*((TPVChannelId*)(buf + 4)) = id;
}
//iInfoObserver->HandleNodeInformationalEvent(aEvent);
}
void TSC_324m::SkewDetected(TPVChannelId lcn1, TPVChannelId lcn2, uint32 skew)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SkewDetected - lcn1=%d, lcn2=%d, skew=%d",
lcn1, lcn2, skew));
Tsc_IdcSkew(lcn1, lcn2, (uint16)skew);
}
void TSC_324m::LcnDataDetected(TPVChannelId lcn)
{
iTSCcomponent->LcnDataDetected(lcn);
}
void TSC_324m::ReceivedFormatSpecificInfo(TPVChannelId channel_id,
uint8* fsi,
uint32 fsi_len)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::ReceivedFormatSpecificInfo lcn=%d, len=%d",
channel_id, fsi_len));
iTSCcomponent->ReceivedFormatSpecificInfo(channel_id, fsi, fsi_len);
}
TPVStatusCode TSC_324m::Disconnect()
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC: Disconnect request."));
//LogStats(OUTGOING);
//LogStats(INCOMING);
TPVStatusCode ret = EPVT_Success;
iDisconnectInitiator |= EPVT_LOCAL;
iTimer->Clear();
StopSrp();
iH223->Stop();
MuxCloseComplete();
while (iIncomingChannels.size())
{
H223ChannelParam* param = iIncomingChannels.back();
iIncomingChannels.pop_back();
delete param;
}
initVarsSession();
return ret;
}
TPVStatusCode TSC_324m::Abort()
{
// iMutex->Lock();
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC: Abort."));
//LogStats(OUTGOING);
//LogStats(INCOMING);
TPVStatusCode ret = EPVT_Success;
iDisconnectInitiator |= EPVT_LOCAL;
if (iSuppInfo)
{
OSCL_DEFAULT_FREE(iSuppInfo);
iSuppInfo = NULL;
iSuppInfoLen = 0;
iTimer->Clear();
}
SessionClose_Comm();
iSrp->SrpStop();
/* All logical channels closed */
iTerminalStatus = PhaseF_End;
iH245->Reset();
// set direct connection to MSD SE
Msd = iH245->GetMSD();
Msd->SetObserver(this);
// set direct connection to CE SE
Ce = iH245->GetCE();
Ce->SetObserver(this);
initVarsSession();
// iMutex->Unlock();
return ret;
}
/* Handle control events depending on state */
/*
Phase0_Idle = 1 ,
PhaseA ,
PhaseB ,
PhaseC ,
PhaseD_CSUP , // Call Setup
PhaseE_Comm , // Ongoing Communication
PhaseF_Clc , // Closing all outgoing LCNs
PhaseF_End , // End of Session
PhaseG_Dis
*/
void TSC_324m::Handle(PS_ControlMsgHeader msg)
{
uint32 EventNo; /* EventNo */
uint32 Cnt; /* Counter */
DISPATCH_PTR func_ptr = NULL;
bool handled = false;
// iMutex->Lock();
/* Event Receive; a non blocking call */
EventNo = Tsc_EventReceive(msg);
for (Cnt = 0; iDispatchTable[Cnt].Module != NULL; Cnt++)
{
if (iDispatchTable[Cnt].Status == iTerminalStatus && iDispatchTable[Cnt].Event == EventNo)
{
func_ptr = iDispatchTable[Cnt].Module;
handled = true;
(this->*func_ptr)(msg);
break;
}
}
if (!handled)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m: Failed to handle control message - state(%d), event no(%d).",
iTerminalStatus, EventNo));
}
return;
}
TPVStatusCode TSC_324m::RequestFrameUpdate(PVMFPortInterface* port)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::RequestFrameUpdate"));
if (iTSCstatemanager.ReadState(TSC_CE_SEND) == NOT_STARTED)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::RequestFrameUpdate ERROR - TCS not yet requested, tcs state=NOT_STARTED"));
return EPVT_ErrorInvalidState;
}
H223IncomingChannel *channel = OSCL_STATIC_CAST(H223IncomingChannel *, port);
if (channel == NULL)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC: RequestFrameUpdate - Null port"));
return EPVT_Failed;
}
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::RequestFrameUpdate lcn=%d", channel->GetLogicalChannelNumber()));
OlcParam* param = iTSCcomponent->FindOlcGivenChannel(INCOMING, channel->GetLogicalChannelNumber());
if (param == NULL)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m: RequestFrameUpdate - Failed to lookup channel param"));
return EPVT_Failed;
}
if (param->GetState() != OLC_ESTABLISHED)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m: RequestFrameUpdate - Channel not in established state. Not sending request."));
return EPVT_Failed;
}
CmdMisc(EVideoFastUpdatePicture, channel->GetLogicalChannelNumber());
return EPVT_Success;
}
TPVStatusCode TSC_324m::RequestMaxMuxPduSize(unsigned aPduSize)
{
if ((iTerminalStatus != PhaseD_CSUP) && (iTerminalStatus != PhaseE_Comm))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m: ERROR - RequestMaxMuxPduSize - invalid state(%d)",
iTerminalStatus));
return EPVT_ErrorInvalidState;
}
CmdMisc(EMaxH223MUXPDUsize, CHANNEL_ID_UNKNOWN&0xFFFF, aPduSize);
return EPVT_Success;
}
OSCL_EXPORT_REF TPVStatusCode TSC_324m::SetTerminalType(uint8 aTType)
{
if (Msd)
{
Msd->SetTerminalType(aTType);
return EPVT_Success;
}
else
{
return EPVT_Failed;
}
}
OSCL_EXPORT_REF void TSC_324m::SetEndSessionTimeout(uint32 timeout)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetEndSessionTimeout timeout(%d)", timeout));
iEndSessionTimeout = timeout;
if (iStopCmd != 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_324m::SetEndSessionTimeout Already disconnectiing",
timeout));
}
}
OSCL_EXPORT_REF void TSC_324m::SetTimerCounter(TPVH324TimerCounter aTimerCounter,
uint8 aSeries, uint32 aSeriesOffset, uint32 aValue)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetTimerCounter timer/counter(%d), series(%d), offset(%d), value(%d)",
aTimerCounter, aSeries, aSeriesOffset, aValue));
if (aTimerCounter == EH324Timer)
{
switch (aSeries)
{
case 1:
{
switch (aSeriesOffset)
{
case 1:
iTimerValues.iT101 = aValue;
break;
case 3:
iTimerValues.iT103 = aValue;
break;
case 4:
iTimerValues.iT104 = aValue;
break;
case 5:
iTimerValues.iT105 = aValue;
break;
case 6:
iTimerValues.iT106 = aValue;
break;
case 7:
iTimerValues.iT107 = aValue;
break;
case 8:
iTimerValues.iT108 = aValue;
break;
case 9:
iTimerValues.iT109 = aValue;
break;
default:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetTimerCounter Error - Offset not supported for series"));
}
}
break;
case 4:
{
switch (aSeriesOffset)
{
case 1:
iT401 = aValue;
break;
default:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetTimerCounter Error - Offset not supported for series"));
}
}
break;
default:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetTimerCounter Error - Series not supported"));
}
}
else if (aTimerCounter == EH324Counter)
{
switch (aSeries)
{
case 1:
{
switch (aSeriesOffset)
{
case 0:
iN100 = aValue;
iTSCstatemanager.SetN100(iN100);
break;
default:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetTimerCounter Error - Offset not supported for series"));
}
}
break;
case 4:
{
switch (aSeriesOffset)
{
case 1:
iN401 = aValue;
break;
default:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetTimerCounter Error - Offset not supported for series"));
}
}
break;
default:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetTimerCounter Error - Series not supported"));
}
}
}
OSCL_EXPORT_REF void TSC_324m::SetVideoResolutions(TPVDirection dir,
Oscl_Vector<PVMFVideoResolutionRange, OsclMemAllocator>& resolutions)
{
iTSCcapability.SetVideoResolutions(dir, resolutions);
}
void TSC_324m::SetDispatchTable()
{
const uint16 sizeofDispatchTable = 56;
S_DispatchTable aDispatchTable[sizeofDispatchTable] =
{
/* ----------------------------------------- */
/* ---------- CALL SETUP EVENTS ------------ */
/* ----------------------------------------- */
{ OSCL_FUNCTION_PTR(TSC_324m::Status04Event22) , PhaseD_CSUP , 22 }, //E_PtvId_Mt_Trf_Idc
{ OSCL_FUNCTION_PTR(TSC_324m::Status04Event23) , PhaseD_CSUP , 23 }, //E_PtvId_Mt_Trf_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::Status04Event24) , PhaseD_CSUP , 24 }, //E_PtvId_Mt_Rjt_Idc
{ OSCL_FUNCTION_PTR(TSC_324m::ModeRequestIndication) , PhaseD_CSUP , 28 }, //E_PtvId_Mr_Trf_Idc
{ OSCL_FUNCTION_PTR(TSC_324m::EndSessionRecv) , PhaseD_CSUP , 37 }, //E_PtvId_Cmd_Es_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::VendorIdRecv) , PhaseD_CSUP, 56},
{ OSCL_FUNCTION_PTR(TSC_324m::UserInputIndicationRecv), PhaseD_CSUP, 57}, //E_PtvId_Idc_Ui_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::LcEtbIdc) , PhaseD_CSUP , 9 }, //E_PtvId_Lc_Etb_Idc
{ OSCL_FUNCTION_PTR(TSC_324m::LcRlsIdc) , PhaseD_CSUP , 11 }, //E_PtvId_Lc_Rls_Idc
{ OSCL_FUNCTION_PTR(TSC_324m::BlcEtbIdc) , PhaseD_CSUP , 14 }, //E_PtvId_Lc_Etb_Idc
{ OSCL_FUNCTION_PTR(TSC_324m::BlcRlsIdc) , PhaseD_CSUP , 16 }, //E_PtvId_Lc_Rls_Idc
{ OSCL_FUNCTION_PTR(TSC_324m::FunctionNotSupportedIndicationReceived) , PhaseD_CSUP , 49}, //E_PtvId_Idc_Fns_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::FlowControlCommandReceived) , PhaseD_CSUP , 53 }, //E_PtvId_Cmd_Fc
{ OSCL_FUNCTION_PTR(TSC_324m::SendTerminalCapabilitySet) , PhaseD_CSUP , 52 }, //E_PtvId_Cmd_Stcs_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::MiscCmdRecv) , PhaseD_CSUP , 54 }, //E_PtvId_Cmd_Mscl_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::MiscIndicationRecv), PhaseD_CSUP, 58}, //E_PtvId_Idc_Mscl_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::SkewIndicationRecv), PhaseD_CSUP, 59}, //E_PtvId_Idc_H223skw_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::FlowControlIndicationReceived) , PhaseD_CSUP , 60 }, //E_PtvId_Cmd_Fc
// { InternalError_CSUP, PhaseD_CSUP , 38 }, //H245_INTERNAL_ERROR
/* ----------------------------------------- */
/* --------- ONGOING COMM EVENTS ----------- */
/* ----------------------------------------- */
{ OSCL_FUNCTION_PTR(TSC_324m::LcEtbIdc) , PhaseE_Comm , 9 }, //E_PtvId_Lc_Etb_Idc
{ OSCL_FUNCTION_PTR(TSC_324m::LcRlsIdc) , PhaseE_Comm , 11 }, //E_PtvId_Lc_Rls_Idc
{ OSCL_FUNCTION_PTR(TSC_324m::LcEtbCfm) , PhaseE_Comm , 10 }, //E_PtvId_Lc_Etb_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::LcRlsCfm) , PhaseE_Comm , 12 }, //E_PtvId_Lc_Rls_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::LcErrIdc) , PhaseE_Comm , 13 }, //E_PtvId_Lc_Err_Idc
{ OSCL_FUNCTION_PTR(TSC_324m::BlcEtbIdc) , PhaseE_Comm , 14 }, //E_PtvId_Blc_Etb_Idc
{ OSCL_FUNCTION_PTR(TSC_324m::BlcEtbCfm) , PhaseE_Comm , 15 }, //E_PtvId_Blc_Etb_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::BlcEtbCfm2) , PhaseE_Comm , 50 }, //E_PtvId_Blc_Etb_Cfm2
{ OSCL_FUNCTION_PTR(TSC_324m::BlcErrIdc) , PhaseE_Comm , 18 }, //E_PtvId_Blc_Err_Idc
{ OSCL_FUNCTION_PTR(TSC_324m::BlcRlsIdc) , PhaseE_Comm , 16 }, //E_PtvId_Blc_Rls_Idc
{ OSCL_FUNCTION_PTR(TSC_324m::BlcRlsCfm) , PhaseE_Comm , 17 }, //E_PtvId_Blc_Rls_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::Status08Event19) , PhaseE_Comm , 19 }, //E_PtvId_Clc_Cls_Idc
{ OSCL_FUNCTION_PTR(TSC_324m::Status08Event20) , PhaseE_Comm , 20 }, //E_PtvId_Clc_Cls_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::Status08Event21) , PhaseE_Comm , 21 }, //E_PtvId_Clc_Rjt_Idc
{ OSCL_FUNCTION_PTR(TSC_324m::Status04Event22) , PhaseE_Comm , 22 }, //E_PtvId_Mt_Trf_Idc
{ OSCL_FUNCTION_PTR(TSC_324m::Status04Event23) , PhaseE_Comm , 23 }, //E_PtvId_Mt_Trf_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::Status04Event24) , PhaseE_Comm , 24 }, //E_PtvId_Mt_Rjt_Idc
{ OSCL_FUNCTION_PTR(TSC_324m::Status08Event25) , PhaseE_Comm , 25 }, //E_PtvId_Rme_Send_Idc
{ OSCL_FUNCTION_PTR(TSC_324m::Status08Event26) , PhaseE_Comm , 26 }, //E_PtvId_Rme_Send_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::Status08Event27) , PhaseE_Comm , 27 }, //E_PtvId_Rme_Rjt_Idc
{ OSCL_FUNCTION_PTR(TSC_324m::ModeRequestIndication) , PhaseE_Comm , 28 }, //E_PtvId_Mr_Trf_Idc
{ OSCL_FUNCTION_PTR(TSC_324m::Status08Event29) , PhaseE_Comm , 29 }, //E_PtvId_Mr_Trf_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::Status08Event30) , PhaseE_Comm , 30 }, //E_PtvId_Mr_Rjt_Idc
{ OSCL_FUNCTION_PTR(TSC_324m::Status08Event31) , PhaseE_Comm , 31 }, //E_PtvId_Rtd_Trf_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::Status08Event32) , PhaseE_Comm , 32 }, //E_PtvId_Rtd_Exp_Idc
{ OSCL_FUNCTION_PTR(TSC_324m::FunctionNotSupportedIndicationReceived) , PhaseE_Comm , 49}, //E_PtvId_Idc_Fns_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::SendTerminalCapabilitySet) , PhaseE_Comm , 52 }, //E_PtvId_Cmd_Stcs_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::FlowControlCommandReceived) , PhaseE_Comm , 53 }, //E_PtvId_Cmd_Fc_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::MiscCmdRecv) , PhaseE_Comm , 54 }, //E_PtvId_Cmd_Mscl_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::Status08Event55) , PhaseE_Comm , 55 }, //E_PtvId_Cmd_Hmr_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::EndSessionRecv) , PhaseE_Comm , 37 }, //E_PtvId_Cmd_Es_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::VendorIdRecv) , PhaseE_Comm , 56},
{ OSCL_FUNCTION_PTR(TSC_324m::UserInputIndicationRecv), PhaseE_Comm, 57}, //E_PtvId_Idc_Ui_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::MiscIndicationRecv), PhaseE_Comm, 58}, //E_PtvId_Idc_Mscl_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::SkewIndicationRecv), PhaseE_Comm, 59}, //E_PtvId_Idc_H223skw_Cfm
{ OSCL_FUNCTION_PTR(TSC_324m::FlowControlIndicationReceived) , PhaseE_Comm, 60 }, //E_PtvId_Cmd_Fc
/* ----------------------------------------- */
/* --------- CLOSE and END EVENTS ---------- */
/* ----------------------------------------- */
{ OSCL_FUNCTION_PTR(TSC_324m::EndSessionRecv) , PhaseF_End , 37 }, //E_PtvId_Cmd_Es_Cfm
{ NULL , 0 , 0 }
};
for (int n = 0; n < sizeofDispatchTable; n++)
{
iDispatchTable[n] = aDispatchTable[n];
}
}
OSCL_EXPORT_REF TPVStatusCode TSC_324m::SetVendorIdInfo(TPVH245Vendor* vendor,
const uint8* pn,
uint16 pn_len,
const uint8* vn,
uint16 vn_len)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetVendorIdInfo vendor(%x), pn_len(%d), vn_len(%d)", vendor, pn_len, vn_len));
if (pn && pn_len && (pn[pn_len-1] == '\0'))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetVendorIdInfo pn(%s)", pn));
}
if (vn && vn_len && (vn[vn_len-1] == '\0'))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetVendorIdInfo vn(%s)", vn));
}
if (iVendor)
{
OSCL_DELETE(iVendor);
iVendor = NULL;
}
if (iProductNumber)
{
OSCL_DEFAULT_FREE(iProductNumber);
iProductNumber = NULL;
}
if (iVersionNumber)
{
OSCL_DEFAULT_FREE(iVersionNumber);
iVersionNumber = NULL;
}
iProductNumberLen = pn_len;
iVersionNumberLen = vn_len;
if (vendor)
{
iVendor = vendor->Copy();
}
if (iProductNumberLen)
{
iProductNumber = (uint8*)OSCL_DEFAULT_MALLOC(iProductNumberLen);
oscl_memcpy(iProductNumber, pn, iProductNumberLen);
}
if (iVersionNumberLen)
{
iVersionNumber = (uint8*)OSCL_DEFAULT_MALLOC(iVersionNumberLen);
oscl_memcpy(iVersionNumber, vn, iVersionNumberLen);
}
return EPVT_Success;
}
OSCL_EXPORT_REF TSC* Allocate324mTSC(TPVLoopbackMode aLoopbackMode)
{
return OSCL_NEW(TSC_324m, (aLoopbackMode));
}
OSCL_EXPORT_REF void Deallocate324mTSC(TSC* tsc)
{
TSC_324m* tsc_324m = (TSC_324m*)tsc;
OSCL_DELETE(tsc_324m);
}
void TSC_324m::TimeoutOccurred(int32 timerID, int32 timeoutInfo)
{
OSCL_UNUSED_ARG(timeoutInfo);
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::TimeoutOccurred"));
if (timerID == PV_TSC_RTD_TIMER_ID)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::TimeoutOccurred - Sending RTD"));
iTscSrpBuffer->EnableBuffering(false);
RtdTrfReq();
}
else if (timerID == PV_TSC_LEVEL_SETUP_TIMER_ID)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::TimeoutOccurred Level setup timeout out, timeoutInfo=%d",
timeoutInfo));
if (!timeoutInfo)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::TimeoutOccurred Level Setup Failed."));
SignalCsupComplete(PVMFErrTimeout);
}
else
{
/* We timed out waiting for TCS. */
iTSCcomponent->Timeout();
/* Start timer to receive TCS */
iTimer->Request(PV_TSC_TCS_RECEIVE_TIMER_ID, PV_TSC_TCS_RECEIVE_TIMER_ID,
DEFAULT_TCS_RECEIVE_TIMEOUT_SECONDS, this);
iH223->EnableStuffing(true);
iH223->SetInterleavingMultiplexFlags(0, NULL);
iH223->SetMuxLevel(TSC_H223_LEVEL_DEFAULT);
/* Start timer to receive TCS */
iTimer->Request(PV_TSC_LEVEL_SETUP_TIMER_ID, 0,
DEFAULT_TCS_LEVEL_SETUP_TIMEOUT_SECONDS, this);
}
}
else if (timerID == PV_TSC_TCS_RECEIVE_TIMER_ID)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::TimeoutOccurred Timed out on TCS receive. Connect failed."));
SignalCsupComplete(PVMFErrTimeout);
}
else
{
iTSCcomponent->TimeoutOccurred(timerID, timeoutInfo);
}
}
void TSC_324m::ResetStats()
{
iH223->ResetStats();
}
void TSC_324m::LogStats(TPVDirection dir)
{
if (iH223)
iH223->LogStats(dir);
}
// Node virtuals
// Node virtuals
// Sync requests that will NOT trigger callback events
OSCL_EXPORT_REF PVMFStatus TSC_324m::GetCapability(PVMFNodeCapability& aNodeCapability)
{
aNodeCapability.iCanSupportMultipleInputPorts = true;
aNodeCapability.iCanSupportMultipleOutputPorts = true;
aNodeCapability.iHasMaxNumberOfPorts = true;
aNodeCapability.iMaxNumberOfPorts = 5;
aNodeCapability.iInputFormatCapability.push_back(PVMF_MIME_H223);
aNodeCapability.iInputFormatCapability.push_back(PVMF_MIME_M4V);
aNodeCapability.iInputFormatCapability.push_back(PVMF_MIME_H2631998);
aNodeCapability.iInputFormatCapability.push_back(PVMF_MIME_H2632000);
aNodeCapability.iOutputFormatCapability.push_back(PVMF_MIME_H223);
aNodeCapability.iOutputFormatCapability.push_back(PVMF_MIME_M4V);
aNodeCapability.iOutputFormatCapability.push_back(PVMF_MIME_H2631998);
aNodeCapability.iOutputFormatCapability.push_back(PVMF_MIME_H2632000);
return PVMFSuccess;
}
OSCL_EXPORT_REF PVMFCommandId TSC_324m::Init(PVMFSessionId aSession, const OsclAny* aContext)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::Init(%x)", aContext));
if (iInterfaceState != EPVMFNodeIdle)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_324m::Init Invalid state(%d)", iInterfaceState));
OSCL_LEAVE(PVMFErrInvalidState);
}
// Add command to queue
Tsc324mNodeCommand cmd;
cmd.Construct(aSession, PVMF_GENERIC_NODE_INIT, aContext);
return QueueCommandL(cmd);
}
// Async requests that will trigger callback events
/**
This should establish the comm server session. Thread specific initialization happens here */
void TSC_324m::DoInit(Tsc324mNodeCommand& cmd)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_324m::DoInit(%x)", cmd.iId));
PVMFStatus pvmfStatus = PVMFSuccess;
// Initialize TSC
int leave_status = 0;
OSCL_TRY(leave_status, InitTsc());
OSCL_FIRST_CATCH_ANY(leave_status, void());
if (leave_status == 0)
{
iInterfaceState = EPVMFNodeInitialized;
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_324m::Init - failed to initialize"));
pvmfStatus = PVMFFailure;
iInterfaceState = EPVMFNodeError;
}
CommandComplete(iCmdQueue, cmd, pvmfStatus, NULL);
}
PVMFCommandId TSC_324m::Prepare(PVMFSessionId aSession
, const OsclAny* aContext)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::Prepare aSession=%x, aContext=%x",
aSession, aContext));
if (iInterfaceState != EPVMFNodeInitialized)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_324m::Prepare Invalid state(%d)", iInterfaceState));
OSCL_LEAVE(PVMFErrInvalidState);
}
// Add command to queue
Tsc324mNodeCommand cmd;
cmd.Construct(aSession, PVMF_GENERIC_NODE_PREPARE, aContext);
return QueueCommandL(cmd);
}
void TSC_324m::DoPrepare(Tsc324mNodeCommand& cmd)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::DoPrepare"));
iInterfaceState = EPVMFNodePrepared;
CommandComplete(iCmdQueue, cmd, PVMFSuccess);
}
OSCL_EXPORT_REF PVMFCommandId TSC_324m::Start(PVMFSessionId aSession, const OsclAny* aContext)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::Start aSession=%x, aContext=%x", aSession, aContext));
iTSCcomponent->Start();
if (iInterfaceState != EPVMFNodePrepared || iTerminalStatus != Phase0_Idle)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_324m::Start Init Invalid state iInterfaceState=%d, iTerminalStatus=%d",
iInterfaceState, iTerminalStatus));
OSCL_LEAVE(PVMFErrInvalidState);
}
// Add command to queue
Tsc324mNodeCommand cmd;
cmd.Construct(aSession, PVMF_GENERIC_NODE_START, aContext);
return QueueCommandL(cmd);
}
void TSC_324m::DoStart(Tsc324mNodeCommand& cmd)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::DoStart"));
TPVStatusCode stat = EPVT_Failed;
int leave_status = 0;
PVMFStatus pvmfStatus = PVMFFailure;
OSCL_TRY(leave_status, stat = Connect());
OSCL_FIRST_CATCH_ANY(leave_status, Disconnect());
if (stat == EPVT_Success || stat == EPVT_Pending)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::DoStart Connect complete"));
pvmfStatus = PVMFSuccess;
iInterfaceState = EPVMFNodeStarted;
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::DoStart Connect failed leave_status=%d",
leave_status));
iInterfaceState = EPVMFNodePrepared;
}
CommandComplete(iCmdQueue, cmd, pvmfStatus);
return;
}
/**
* Causes the node to stop servicing one or all disconnected ports.
* TBD: Should we add an API or modify this to take an arbitrary subset of ports ?
* @exception port_connected leaves if any of the ports are not disconnected.
**/
OSCL_EXPORT_REF PVMFCommandId TSC_324m::Stop(PVMFSessionId aSession,
const OsclAny* aContext)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::Stop aSession=%x, aContext=%x",
aSession, aContext));
switch (iInterfaceState)
{
case EPVMFNodeInitialized:
case EPVMFNodePrepared:
case EPVMFNodeStarted:
case EPVMFNodePaused:
// ok to call stop
break;
default:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_324m::Stop Invalid state(%d)", iInterfaceState));
OSCL_LEAVE(PVMFErrInvalidState);
}
while (!iCmdQueue.empty())
{
CommandComplete(iCmdQueue, iCmdQueue.front(), PVMFErrCancelled);
iCmdQueue.Erase(&iCmdQueue.front());
}
iPendingCmdQueue.clear();
// Add command to queue
Tsc324mNodeCommand cmd;
cmd.Construct(aSession, PVMF_GENERIC_NODE_STOP, aContext);
return QueueCommandL(cmd);
}
void TSC_324m::DoStop(Tsc324mNodeCommand& cmd)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::DoStop"));
switch (iInterfaceState)
{
case EPVMFNodeInitialized:
case EPVMFNodePrepared:
case EPVMFNodeStarted:
case EPVMFNodePaused:
break;
default:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::DoStop Ignoring stop due to invalid state(%d)",
iInterfaceState));
CommandComplete(iCmdQueue, cmd, PVMFErrInvalidState);
return;
}
if (iTSCcomponent)
{
iTSCcomponent->StartDisconnect(true);
}
iTerminalStatus = PhaseF_Clc;
Disconnect();
if (iNumRtdRequests)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::DoStop iNumRtdRequests=%d, iRtdMin=%d, iRtdmax=%d, iRtdAve=%d",
iNumRtdRequests, iRtdMin, iRtdMax, iRtdAve / iNumRtdRequests));
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::DoStop No RTD requests issued"));
}
iInterfaceState = EPVMFNodePrepared;
CommandComplete(iCmdQueue, cmd, PVMFSuccess);
}
/**
* Causes the node to pause servicing one or all connected and started ports.
* Ports are to be resumed using the Start command ?
* TBD: Should we add an API or modify this to take an arbitrary subset of ports ?
* @exception port_disconnected leaves if any of the ports are not connected.
**/
OSCL_EXPORT_REF PVMFCommandId TSC_324m::Pause(PVMFSessionId aSession,
const OsclAny* aContext)
{
OSCL_UNUSED_ARG(aSession);
OSCL_UNUSED_ARG(aContext);
OSCL_LEAVE(PVMFErrNotSupported);
return -1;
}
/**
* Resets the node. The node should relinquish all resources that is has acquired as part of the
* initialization process and should be ready to be deleted when this completes.
* @exception port_disconnected leaves if any of the ports are not connected.
**/
OSCL_EXPORT_REF PVMFCommandId TSC_324m::Reset(PVMFSessionId aSession,
const OsclAny* aContext)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::Reset(%d)", iInterfaceState));
switch (iInterfaceState)
{
case EPVMFNodeInitialized:
case EPVMFNodePrepared:
case EPVMFNodeError:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::Reset Ok to reset"));
break;
default:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::Reset Invalid state for Reset"));
OSCL_LEAVE(PVMFErrInvalidState);
break;
}
while (!iCmdQueue.empty())
{
CommandComplete(iCmdQueue, iCmdQueue.front(), PVMFErrCancelled);
iCmdQueue.Erase(&iCmdQueue.front());
}
iPendingCmdQueue.clear();
// Add command to queue
Tsc324mNodeCommand cmd;
cmd.Construct(aSession, PVMF_GENERIC_NODE_RESET, aContext);
return QueueCommandL(cmd);
}
void TSC_324m::DoReset(Tsc324mNodeCommand& cmd)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::DoReset"));
iInterfaceState = EPVMFNodeIdle;
ResetTsc();
CommandComplete(iCmdQueue, cmd, PVMFSuccess);
}
OSCL_EXPORT_REF PVMFCommandId TSC_324m::RequestPort(PVMFSessionId aSession
, int32 aPortTag
, const PvmfMimeString* aPortConfig
, const OsclAny* aContext)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::RequestPort"));
// Add command to queue
Tsc324mNodeCommand cmd;
cmd.Construct(aSession, PVMF_GENERIC_NODE_REQUESTPORT, aPortTag,
aPortConfig, aContext);
return QueueCommandL(cmd);
}
PVMFPortInterface* TSC_324m::FindOutgoingPort(TPVMediaType_t mediaType)
{
PVMFPortInterface* port = NULL;
OlcParam* param = iTSCcomponent->FindOlc(OUTGOING,
mediaType, OLC_ESTABLISHED | OLC_PENDING);
if (param)
{
uint32 channelID = param->GetChannelId();
H223OutgoingChannelPtr outgoing_lcn;
PVMFStatus pvmfStatus = iH223->GetOutgoingChannel(channelID,
outgoing_lcn);
if (pvmfStatus == PVMFSuccess)
{
port = outgoing_lcn;
iRequestedOutgoingChannels[port] = outgoing_lcn;
}
}
return port;
}
void TSC_324m::DoRequestPort(Tsc324mNodeCommand& cmd)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::DoRequestPort"));
PVMFStatus pvmfStatus = PVMFSuccess;
int32 aPortTag = (int32)cmd.iParam1;
PvmfMimeString* aPortConfig = (PvmfMimeString*)cmd.iParam2;
PVMFPortInterface* port = NULL;
if (aPortConfig)
{
PVMFFormatType formatType(aPortConfig->get_str());
if (formatType.isFile())
{
// Multiplexed PV_MULTIPLEXED
// x-pvmf/multiplexed: to identify the lowerlayer port
// Is the port already requested ?
if (iH223->GetLowerLayer()->IsConnected())
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::RequestPort - Port is in use"));
pvmfStatus = PVMFErrBusy;
}
else
{
port = iH223->GetLowerLayer();
}
}
else if (*aPortConfig == PVMF_AUDIO_OUTGOING_MIMETYPE)
{
// Audio x-pvmf/audio;dir=outgoing to identify the outgoing audio channel
port = FindOutgoingPort(PV_AUDIO);
if (port == NULL)
{
pvmfStatus = PVMFFailure;
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_324m::DoRequestPort Error - Failed to lookup outgoing channel %d",
aPortTag));
}
}
else if (*aPortConfig == PVMF_VIDEO_OUTGOING_MIMETYPE)
{
// Video x-pvmf/video;dir=outgoing to identify the outgoing video channel
port = FindOutgoingPort(PV_VIDEO);
if (port == NULL)
{
pvmfStatus = PVMFFailure;
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_324m::DoRequestPort Error - Failed to lookup outgoing channel %d",
aPortTag));
}
}
else if (*aPortConfig == PVMF_INCOMING_MIMETYPE || (aPortTag < 0))
{
if (aPortTag < 0)
{
aPortTag = -aPortTag;
}
// just use the channel id
//x-pvmf/dir=incoming
// Incoming
H223IncomingChannelPtr incoming_lcn;
pvmfStatus = iH223->GetIncomingChannel(aPortTag, incoming_lcn);
if (pvmfStatus == PVMFSuccess)
{
port = incoming_lcn;
iRequestedIncomingChannels[port] = incoming_lcn;
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_324m::DoRequestPort Error - Failed to lookup incoming channel %d",
aPortTag));
}
}
else //if (*aPortConfig == PVMF_OUTGOING_MIMETYPE || aPortTag >=0)
{
//x-pvmf/dir=outgoing
// Outgoing
H223OutgoingChannelPtr outgoing_lcn;
pvmfStatus = iH223->GetOutgoingChannel(aPortTag, outgoing_lcn);
if (pvmfStatus == PVMFSuccess)
{
port = outgoing_lcn;
iRequestedOutgoingChannels[port] = outgoing_lcn;
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_324m::DoRequestPort Error - Failed to lookup outgoing channel %d",
aPortTag));
}
}
}
if (pvmfStatus != PVMFPending)
{
CommandComplete(iCmdQueue, cmd, pvmfStatus, port);
return;
}
// queue up the command in the pending queue
iPendingCmdQueue.StoreL(cmd);
iCmdQueue.Erase(&cmd);
}
OSCL_EXPORT_REF PVMFCommandId TSC_324m::ReleasePort(PVMFSessionId aSession,
PVMFPortInterface& aPort,
const OsclAny* aContext)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::ReleasePort"));
// Add command to queue
Tsc324mNodeCommand cmd;
cmd.Construct(aSession, PVMF_GENERIC_NODE_RELEASEPORT, aPort, aContext);
return QueueCommandL(cmd);
}
void TSC_324m::DoReleasePort(Tsc324mNodeCommand& cmd)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::DoReleasePort"));
PVMFPortInterface* port = (PVMFPortInterface*)cmd.iParam1;
if (port->GetPortTag() == PV_MULTIPLEXED)
{
CommandComplete(iCmdQueue, cmd, PVMFSuccess, port);
return;
}
H223LogicalChannel* lcn = OSCL_STATIC_CAST(H223LogicalChannel*, port);
if (lcn)
{
TPVDirection aDirection = port->GetPortTag() < 0 ? INCOMING : OUTGOING;
if (aDirection == INCOMING)
{
Oscl_Map<PVMFPortInterface*, H223IncomingChannelPtr, OsclMemAllocator>::iterator iter;
iter = iRequestedIncomingChannels.find(port);
if (iter != iRequestedIncomingChannels.end())
{
iRequestedIncomingChannels[port]->Flush();
iH223->CloseChannel(INCOMING,
iRequestedIncomingChannels[port]->GetLogicalChannelNumber());
iRequestedIncomingChannels.erase(iter);
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::DoReleasePort - Incoming channel not requested"));
}
}
else
{
Oscl_Map<PVMFPortInterface*, H223OutgoingChannelPtr, OsclMemAllocator>::iterator iter;
iter = iRequestedOutgoingChannels.find(port);
if (iter != iRequestedOutgoingChannels.end())
{
iH223->FlushChannel(OUTGOING,
iRequestedOutgoingChannels[port]->GetLogicalChannelNumber());
iH223->CloseChannel(OUTGOING,
iRequestedOutgoingChannels[port]->GetLogicalChannelNumber());
iRequestedOutgoingChannels.erase(iter);
}
}
}
CommandComplete(iCmdQueue, cmd, PVMFSuccess, port);
return;
}
/**
* Returns a list of ports currently available in the node that meet the filter criteria
* We can add fancier iterators and filters as needed. For now we return all the ports.
**/
OSCL_EXPORT_REF PVMFPortIter* TSC_324m::GetPorts(const PVMFPortFilter* aFilter)
{
OSCL_UNUSED_ARG(aFilter);
return NULL;
}
void TSC_324m::DoCancel()
{
}
void TSC_324m::Run()
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, " TSC_324m::Run()"));
if (!iCmdQueue.empty())
{
ProcessCommand(iCmdQueue.front());
}
if (!iCmdQueue.empty())
{
// Run again if there are more things to process
RunIfNotReady();
}
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, " TSC_324m::Run() - done"));
}
bool TSC_324m::ProcessCommand(Tsc324mNodeCommand& aCmd)
{
switch (aCmd.iCmd)
{
case PVMF_GENERIC_NODE_QUERYUUID:
DoQueryUuid(aCmd);
break;
case PVMF_GENERIC_NODE_QUERYINTERFACE:
DoQueryInterface(aCmd);
break;
case PVMF_GENERIC_NODE_REQUESTPORT:
DoRequestPort(aCmd);
break;
case PVMF_GENERIC_NODE_RELEASEPORT:
DoReleasePort(aCmd);
break;
case PVMF_GENERIC_NODE_INIT:
DoInit(aCmd);
break;
case PVMF_GENERIC_NODE_PREPARE:
DoPrepare(aCmd);
break;
case PVMF_GENERIC_NODE_START:
DoStart(aCmd);
break;
case PVMF_GENERIC_NODE_STOP:
DoStop(aCmd);
break;
case PVMF_GENERIC_NODE_FLUSH:
DoFlush(aCmd);
break;
case PVMF_GENERIC_NODE_PAUSE:
DoPause(aCmd);
break;
case PVMF_GENERIC_NODE_RESET:
DoReset(aCmd);
break;
case PVMF_GENERIC_NODE_CANCELALLCOMMANDS:
DoCancelAllCommands(aCmd);
break;
case PVMF_GENERIC_NODE_CANCELCOMMAND:
DoCancelCommand(aCmd);
break;
default://unknown command type
if (iTSCcomponent->ProcessCommand(aCmd))
{
CommandComplete(iCmdQueue, aCmd, PVMFSuccess);
}
else
{
CommandComplete(iCmdQueue, aCmd, PVMFFailure);
}
break;
}
return true;
}
int32 TSC_324m::FindPendingPortCmd(TPVMFGenericNodeCommand aCmdType,
int32 aPortTag,
Tsc324mNodeCommand& cmd)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::FindPendingRequestPortCmd aCmdType=%d, aPortTag=%d",
aCmdType, aPortTag));
int32 cmdIndex = -1;
for (uint32 i = 0; i < iPendingCmdQueue.size(); i++)
{
if ((TPVMFGenericNodeCommand)iPendingCmdQueue[i].iCmd == aCmdType)
{
if (aPortTag == (int32)iPendingCmdQueue[i].iParam1)
{
cmd = iPendingCmdQueue[i];
cmdIndex = i;
break;
}
}
}
if (cmdIndex < 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::FindPendingPortCmd Error - command not found"));
return 0;
}
// Destroy command object
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::FindPendingPortCmd : Deleting cmd from iPendingQueue. cmdIndex=%d",
cmdIndex));
iPendingCmdQueue.Erase(&iPendingCmdQueue[cmdIndex]);
return cmdIndex;
}
OSCL_EXPORT_REF void TSC_324m::SetMultiplexLevel(TPVH223Level muxLevel)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetMultiplexLevel level(%d)\n", muxLevel));
iH223Level = muxLevel;
if (iH223)
{
iH223->SetMultiplexLevel(muxLevel);
}
}
OSCL_EXPORT_REF void TSC_324m::SetSduSize(TPVDirection direction,
uint16 size,
TPVAdaptationLayer al)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetSduSize direction(%d), size(%d), al(%d)\n",
direction, size, al));
if (iH223)
{
iH223->SetSduSize(direction, size, EplForAdaptationLayer(al));
}
}
OSCL_EXPORT_REF void TSC_324m::SetAl2Sn(int width)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetAl2Sn on/off(%d)\n", width));
iTSCcomponent->SetAl2Sn(width);
}
OSCL_EXPORT_REF void TSC_324m::SetAl3ControlFieldOctets(unsigned cfo)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetAl3ControlFieldOctets cfo(%d)\n", cfo));
iTSCcomponent->SetAl3ControlFieldOctets(cfo);
}
OSCL_EXPORT_REF void TSC_324m::SetMaxOutgoingPduSize(uint16 size)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetMaxOutgoingPduSize size(%d)\n", size));
if (iH223)
{
iH223->SetMaxOutgoingPduSize(size);
}
}
OSCL_EXPORT_REF void TSC_324m::SetMaxMuxPduSize(uint16 size)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetMaxMuxPduSize size(%d)\n", size));
iRequestMaxMuxPduSize = size;
}
OSCL_EXPORT_REF void TSC_324m::SetMaxCcsrlSduSize(int size)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetMaxCcsrlSduSize size(%d)\n", size));
if (iSrp)
{
iSrp->SetCCSRLSduSize(size);
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetMaxCcsrlSduSize - Invalid state: SRP == NULL"));
}
}
OSCL_EXPORT_REF void TSC_324m::SetOutgoingMuxPduType(TPVH223MuxPduType outgoingPduType)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetOutgoingMuxPduType type(%d)\n",
outgoingPduType));
iOutgoingPduType = outgoingPduType;
}
OSCL_EXPORT_REF void TSC_324m::SetOutgoingChannelConfig(
Oscl_Vector<H324ChannelParameters, PVMFTscAlloc>& out_channel_config)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetOutgoingChannelConfig size(%d)\n",
out_channel_config.size()));
if (iInterfaceState != EPVMFNodeInitialized)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetOutgoingChannelConfig Error: Invalid state."));
OSCL_LEAVE(PVMFErrInvalidState);
}
iTSCcomponent->SetOutgoingChannelConfig(out_channel_config);
}
OSCL_EXPORT_REF void TSC_324m::SetIncomingChannelConfig(
Oscl_Vector<H324ChannelParameters, PVMFTscAlloc>& in_channel_config)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetIncomingChannelConfig size(%d)\n",
in_channel_config.size()));
iTSCcomponent->SetIncomingChannelConfig(in_channel_config);
}
OSCL_EXPORT_REF void TSC_324m::SetAlConfig(PV2WayMediaType media_type,
TPVAdaptationLayer layer,
bool allow)
{
iTSCcomponent->SetAlConfig(media_type, layer, allow);
}
PVMFCommandId TSC_324m::QueryUUID(PVMFSessionId aSession,
const PvmfMimeString& aMimeType,
Oscl_Vector<PVUuid, OsclMemAllocator>& aUuids,
bool aExactUuidsOnly,
const OsclAny* aContext)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::QueryUUID"));
// create message to be completed later - depending on what it is...
Tsc324mNodeCommand cmd;
cmd.Construct(aSession, PVMF_GENERIC_NODE_QUERYUUID, aMimeType,
aUuids, aExactUuidsOnly, aContext);
iComponentRegistry.QueryRegistry(cmd);
//return QueueCommandL(cmd);
return 0;
}
PVMFCommandId TSC_324m::QueryInterface(PVMFSessionId aSession,
const PVUuid& aUuid,
PVInterface*& aInterfacePtr,
const OsclAny* aContext)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::QueryInterface()"));
if (aUuid == PVH324MConfigUuid)
{
aInterfacePtr = OSCL_NEW(H324MConfig, (this, true));
}
else if (aUuid == PVUidProxiedInterface)
{
H324MProxiedInterface* proxied_interface_ptr = NULL;
proxied_interface_ptr = OSCL_NEW(H324MProxiedInterface, ());
proxied_interface_ptr->SetH324M(this);
aInterfacePtr = proxied_interface_ptr;
}
else
{
TSC_component* backup = iTSCcomponent;
// send onto TSCComponentRegistry::Create to let it finish
iTSCcomponent = iComponentRegistry.Create(aSession, aUuid,
aInterfacePtr, aContext);
if (iTSCcomponent)
{
InitComponent();
if (backup)
{
OSCL_DELETE(backup);
}
}
}
// Add command to queue
/*Tsc324mNodeCommand cmd;
cmd.Construct(aSession, PVMF_GENERIC_NODE_QUERYINTERFACE, aUuid, aInterfacePtr, aContext) ;
return QueueCommandL(cmd);
*/
return 0;
}
void TSC_324m::DoQueryInterface(Tsc324mNodeCommand& cmd)
{
OSCL_UNUSED_ARG(cmd);
//CommandComplete(iCmdQueue, cmd, PVMFSuccess);
}
void TSC_324m::DoQueryUuid(Tsc324mNodeCommand& cmd)
{
OSCL_UNUSED_ARG(cmd);
//CommandComplete(iCmdQueue, cmd, PVMFSuccess);
}
PVMFCommandId TSC_324m::CancelAllCommands(PVMFSessionId aSession,
const OsclAny* aContext)
{
OSCL_UNUSED_ARG(aSession);
OSCL_UNUSED_ARG(aContext);
OSCL_LEAVE(PVMFErrNotSupported);
return -1;
}
OSCL_EXPORT_REF PVMFCommandId TSC_324m::CancelCommand(PVMFSessionId aSession,
PVMFCommandId aCommandId,
const OsclAny* aContext)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::CancelCommand id(%d)", aCommandId));
// Add command to queue
Tsc324mNodeCommand cmd;
cmd.Construct(aSession, PVMF_GENERIC_NODE_CANCELCOMMAND, aCommandId, aContext);
return QueueCommandL(cmd);
}
void TSC_324m::DoCancelCommand(Tsc324mNodeCommand& cmd)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::DoCancelCommand cmd(%x)", &cmd));
PVMFStatus status = PVMFSuccess;
int cmdIndex = FindPendingCmd((PVMFCommandId)cmd.iParam1);
if (cmdIndex < 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::DoCancelCommand Failed to lookup command(%d)",
(PVMFCommandId)cmd.iParam1));
Tsc324mNodeCommand* found_cmd = iCmdQueue.FindById((PVMFCommandId)cmd.iParam1);
if (found_cmd)
{
iCmdQueue.Erase(found_cmd);
}
else
status = PVMFErrArgument;
}
else
{
// Destroy command object
Tsc324mNodeCommand to_be_deleted_cmd = iPendingCmdQueue[cmdIndex];
iPendingCmdQueue.Erase(&iPendingCmdQueue[cmdIndex]);
}
CommandComplete(iCmdQueue, cmd, status);
}
int TSC_324m::FindPendingCmd(PVMFCommandId aCommandId)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::FindPendingCmd id(%d)", aCommandId));
int32 cmdIndex = -1;
for (uint32 i = 0; i < iPendingCmdQueue.size(); i++)
{
if (iPendingCmdQueue[i].iId == aCommandId)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::FindPendingCmd - command found in iPendingCmdQueue"));
cmdIndex = i;
break;
}
}
return cmdIndex;
}
const uint8* TSC_324m::GetFormatSpecificInfo(PVMFPortInterface* port,
uint32* len)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::GetFormatSpecificInfo port(%x)", port));
return ((H223LogicalChannel*)port)->GetFormatSpecificInfo(len);
}
LogicalChannelInfo* TSC_324m::GetLogicalChannelInfo(PVMFPortInterface& port)
{
return iTSCcomponent->GetLogicalChannelInfo(port);
}
bool TSC_324m::IsEstablishedLogicalChannel(TPVDirection aDir,
TPVChannelId aChannelId)
{
return iTSCcomponent->IsEstablishedLogicalChannel(aDir, aChannelId);
}
void TSC_324m::SetSkewReference(PVMFPortInterface* aPort,
PVMFPortInterface* aReferencePort)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetSkewReference"));
H223OutgoingChannel* lcn2 = OSCL_STATIC_CAST(H223OutgoingChannel*,
aPort);
H223OutgoingChannel* lcn1 = OSCL_STATIC_CAST(H223OutgoingChannel*,
aReferencePort);
lcn2->SetSkewReference(lcn1);
}
void TSC_324m::SendVideoTemporalSpatialTradeoffCommand(TPVChannelId aLogicalChannel,
uint8 aTradeoff)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SendVideoTemporalSpatialTradeoffCommand aLogicalChannel=%d, aTradeoff=%d", aLogicalChannel, aTradeoff));
if (iTerminalStatus != PhaseE_Comm)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SendVideoTemporalSpatialTradeoffCommand Ignoring due to invalid state."));
return;
}
CmdMisc(EVideoTemporalSpatialTradeOff, aLogicalChannel, aTradeoff);
}
void TSC_324m::SendVideoTemporalSpatialTradeoffIndication(TPVChannelId aLogicalChannel,
uint8 aTradeoff)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SendVideoTemporalSpatialTradeoffIndication aLogicalChannel=%d, aTradeoff=%d", aLogicalChannel, aTradeoff));
if (iTerminalStatus != PhaseE_Comm)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SendVideoTemporalSpatialTradeoffIndication Ignoring due to invalid state."));
return;
}
IndicationMisc(EVideoTemporalSpatialTradeOffIdc, aLogicalChannel,
aTradeoff);
}
void TSC_324m::SetDatapathLatency(TPVDirection aDir, PVMFPortInterface* aPort,
uint32 aLatency)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetDatapathLatency aDir=%d, aPort=%x, aLatency=%d", aDir, aPort, aLatency));
OSCL_UNUSED_ARG(aDir);
H223LogicalChannel* lcn = OSCL_STATIC_CAST(H223LogicalChannel* , aPort);
if (lcn == NULL)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_324m::SetDatapathLatency WARNING lcn==NULL"));
return;
}
lcn->SetDatapathLatency(aLatency);
}
void TSC_324m::SendSkewIndication(TPVChannelId aLogicalChannel1,
TPVChannelId aLogicalChannel2,
uint16 aSkew)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SendSkewIndication aLogicalChannel1=%d, aLogicalChannel2=%d, aSkew=%d",
aLogicalChannel1, aLogicalChannel2, aSkew));
if (iTerminalStatus != PhaseE_Comm)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SendSkewIndication Ignoring due to invalid state."));
return;
}
Tsc_IdcSkew(aLogicalChannel1, aLogicalChannel2, aSkew);
}
OSCL_EXPORT_REF void TSC_324m::SetMultiplexingDelayMs(uint16 aDelay)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetMultiplexingDelayMs,aDelay=%d", aDelay));
iMultiplexingDelayMs = aDelay;
if (iH223)
iH223->SetMultiplexingDelayMs((uint16)iMultiplexingDelayMs);
}
void TSC_324m::ConfigureSrp(TPVH223Level aLevel)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::ConfigureSrp aLevel=%d", aLevel));
iTscSrpBuffer->Stop();
iSrp->SrpStop();
iSrp->SrpReset();
iSrp->SrpInitL();
iSrp->SetSRPTimeoutValue(iT401);
iSrp->SetNumSRPRetries(iN401);
/* We will enable NSRP for level 0 if the remote terminal signals capability */
if (aLevel == H223_LEVEL0)
{
iSrp->SetCCSRLSduSize(0);
iSrp->UseNSRP(false);
}
else
{
iSrp->UseNSRP(true);
}
if (!iEnableWnsrp || aLevel == H223_LEVEL0)
{
iSrp->DisableWNSRPSupport();
}
H223IncomingChannelPtr incoming_control_channel;
PVMFStatus aStatus = iH223->GetIncomingChannel((TPVChannelId)0,
incoming_control_channel);
if (aStatus == PVMFSuccess)
{
incoming_control_channel->Disconnect();
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_324m::ConfigureSrp Error - Failed to lookup incoming logical channel %d", 0));
return;
}
H223OutgoingChannelPtr outgoing_control_channel;
aStatus = iH223->GetOutgoingChannel((TPVChannelId)0,
outgoing_control_channel);
if (aStatus == PVMFSuccess)
{
outgoing_control_channel->Disconnect();
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_324m::ConfigureSrp Error - Failed to lookup outgoing logical channel %d", 0));
return;
}
PVMFPortInterface *port;
port = iSrp->RequestULPort(SRP_INPUT_PORT_TAG);
iTscSrpBuffer->GetLLPort(TSCSRPBUFFER_OUTPUT_PORT_TAG)->Connect(port);
port = iSrp->RequestULPort(SRP_OUTPUT_PORT_TAG);
port->Connect(iTscSrpBuffer->GetLLPort(TSCSRPBUFFER_INPUT_PORT_TAG));
iTscSrpBuffer->GetUpperLayer()->Bind(iH245);
iOutgoingSrpPort = iSrp->RequestLLPort(SRP_INPUT_PORT_TAG);
iIncomingSrpPort = iSrp->RequestLLPort(SRP_OUTPUT_PORT_TAG);
iOutgoingSrpPort->Connect(incoming_control_channel);
// incoming_control_channel->Connect(iOutgoingSrpPort);
iIncomingSrpPort->Connect(outgoing_control_channel);
// outgoing_control_channel->Connect(iIncomingSrpPort);
iTscSrpBuffer->Start();
iSrp->SrpStart();
}
void TSC_324m::StopSrp()
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::StopSrp "));
iSrp->SrpStop();
iTscSrpBuffer->Stop();
H223IncomingChannelPtr incoming_control_channel;
PVMFStatus aStatus = iH223->GetIncomingChannel((TPVChannelId)0,
incoming_control_channel);
if (aStatus == PVMFSuccess)
{
incoming_control_channel->Disconnect();
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_324m::ConfigureSrp Error - Failed to lookup incoming logical channel %d", 0));
}
H223OutgoingChannelPtr outgoing_control_channel;
aStatus = iH223->GetOutgoingChannel((TPVChannelId)0,
outgoing_control_channel);
if (aStatus == PVMFSuccess)
{
outgoing_control_channel->Disconnect();
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_324m::ConfigureSrp Error - Failed to lookup outgoing logical channel %d", 0));
}
PVMFPortInterface *port = NULL;
port = iSrp->RequestULPort(SRP_INPUT_PORT_TAG);
if (port)
port->Disconnect();
port = iTscSrpBuffer->GetLLPort(TSCSRPBUFFER_OUTPUT_PORT_TAG);
if (port)
port->Disconnect();
port = iSrp->RequestULPort(SRP_OUTPUT_PORT_TAG);
if (port)
port->Disconnect();
port = iTscSrpBuffer->GetLLPort(TSCSRPBUFFER_INPUT_PORT_TAG);
if (port)
port->Disconnect();
iTscSrpBuffer->GetUpperLayer()->UnBind();
if (iOutgoingSrpPort)
iOutgoingSrpPort->Disconnect();
if (iIncomingSrpPort)
iIncomingSrpPort->Disconnect();
}
OSCL_EXPORT_REF void TSC_324m::GetChannelFormatAndCapabilities(TPVDirection dir,
Oscl_Vector<FormatCapabilityInfo, OsclMemAllocator>& formats)
{
iTSCcomponent->GetChannelFormatAndCapabilities(dir, formats);
}
OSCL_EXPORT_REF void TSC_324m::SetLogicalChannelBufferingMs(uint32 aInBufferingMs,
uint32 aOutBufferingMs)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::SetLogicalChannelBufferingMs aInBufferingMs=%d, aOutBufferingMs=%d",
aInBufferingMs, aOutBufferingMs));
iInLogicalChannelBufferingMs = aInBufferingMs;
iOutLogicalChannelBufferingMs = aOutBufferingMs;
}
void TSC_324m::UseWNSRP(bool aUse)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::UseWNSRP %d", aUse));
SetWnsrp(aUse);
PS_MultiplexEntryDescriptor desc = iH223->GetIncomingMuxDescriptor(TSC_WNSRP_MUX_ENTRY_NUMBER);
if (desc &&
desc->size_of_elementList &&
desc->elementList->muxType.index == 0 &&
desc->elementList->muxType.logicalChannelNumber == 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m::UseWNSRP Deleting incoming descriptor for WNSRP"));
iH223->RemoveIncomingMuxDescriptor(TSC_WNSRP_MUX_ENTRY_NUMBER);
}
}
void TSC_324m::SetTSC_324mObserver(TSC_324mObserver* aObserver)
{
if (aObserver == NULL)
return;
iTSC_324mObserver = aObserver;
}
PVMFCommandId TSC_324m::QueueCommandL(Tsc324mNodeCommand& aCmd)
{
PVMFCommandId id;
id = iCmdQueue.AddL(aCmd);
//wakeup the AO
RunIfNotReady();
return id;
}
void TSC_324m::CommandComplete(Tsc324mNodeCmdQ& aCmdQ, Tsc324mNodeCommand& aCmd,
PVMFStatus aStatus, OsclAny* aEventData)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_324m:CommandComplete Id %d Cmd %d Status %d Context %d Data %d",
aCmd.iId, aCmd.iCmd, aStatus, aCmd.iContext, aEventData));
//create response
PVMFCmdResp resp(aCmd.iId, aCmd.iContext, aStatus, aEventData);
PVMFSessionId session = aCmd.iSession;
//Erase the command from the queue.
aCmdQ.Erase(&aCmd);
//Report completion to the session observer.
ReportCmdCompleteEvent(session, resp);
}
int32 TSC_324m::GetPortTagForLcn(TPVDirection aDir, TPVChannelId aId,
PVCodecType_t aCodecType)
{
if (aDir == INCOMING)
return -aId;
return GetMediaType(aCodecType);
}
PVMFStatus TSC_324m::ThreadLogon()
{
AddToScheduler();
SetState(EPVMFNodeIdle);
return PVMFSuccess;
}
PVMFStatus TSC_324m::ThreadLogoff()
{
SetState(EPVMFNodeCreated);
RemoveFromScheduler();
return PVMFSuccess;
}
void TSC_324m::HandlePortActivity(const PVMFPortActivity& aActivity)
{
OSCL_UNUSED_ARG(aActivity);
}
PVMFCommandId TSC_324m::Flush(PVMFSessionId aSession,
const OsclAny* aContext)
{
OSCL_UNUSED_ARG(aSession);
OSCL_UNUSED_ARG(aContext);
OSCL_LEAVE(PVMFErrNotSupported);
return 0;
}
void TSC_324m::SetMioLatency(int32 aLatency, bool aAudio)
{
iH223->SetMioLatency(aLatency, aAudio);
}
#ifdef MEM_TRACK
void TSC_324m::MemStats()
{
#if !(OSCL_BYPASS_MEMMGT)
OsclAuditCB auditCB;
OsclMemInit(auditCB);
if (auditCB.pAudit)
{
MM_Stats_t* stats = auditCB.pAudit->MM_GetStats("");
if (stats)
{
printf("\n###################Memory Stats Start#################\n");
printf(" numBytes %d\n", stats->numBytes);
printf(" peakNumBytes %d\n", stats->peakNumBytes);
printf(" numAllocs %d\n", stats->numAllocs);
printf(" peakNumAllocs %d\n", stats->peakNumAllocs);
printf(" numAllocFails %d\n", stats->numAllocFails);
printf(" totalNumAllocs %d\n", stats->totalNumAllocs);
printf(" totalNumBytes %d\n", stats->totalNumBytes);
printf("\n###################Memory Stats End###################\n");
}
}
#endif
}
#endif