blob: ded0cd59762acfbc9a4b323ded9f837986093e35 [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 "pv_2way_enc_data_channel_datapath.h"
CPV2WayEncDataChannelDatapath *CPV2WayEncDataChannelDatapath::NewL(PVLogger *aLogger,
PVMFFormatType aFormat,
CPV324m2Way *a2Way)
{
CPV2WayEncDataChannelDatapath *self = OSCL_NEW(CPV2WayEncDataChannelDatapath, (aLogger, aFormat, a2Way));
OsclError::LeaveIfNull(self);
if (self)
{
OSCL_TRAPSTACK_PUSH(self);
self->ConstructL();
}
OSCL_TRAPSTACK_POP();
return self;
}
void CPV2WayEncDataChannelDatapath::TSCPortClosed()
{
if (iState != EClosed)
{
iPortPairList.back().Disconnect();
iPortPairList.back().iDestPort.SetPort(NULL);
SetCmd(NULL);
}
}
PVMFPortInterface *CPV2WayEncDataChannelDatapath::GetTSCPort()
{
return iPortPairList.empty() ? NULL : iPortPairList.back().iDestPort.GetPort();
}
PVMFPortInterface *CPV2WayEncDataChannelDatapath::GetSrcPort()
{
return iPortPairList.empty() ? NULL : iPortPairList.front().iSrcPort.GetPort();
}
void CPV2WayEncDataChannelDatapath::SetSourceInputPort(PVMFPortInterface *aPort)
{
iSourceInputPort.SetPort(aPort);
}
void CPV2WayEncDataChannelDatapath::UseFilePlayPort(bool aUseFilePlayPort)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "CPV2WayEncDataChannelDatapath::CheckPathSpecificOpen state %d, format %s, use play port %d, file play port %x\n", iState, iFormat.getMIMEStrPtr(), aUseFilePlayPort, iFilePlayPort));
if ((iState != EOpened) || (iFilePlayPort == NULL)) return;
//If audio use mixing port (audio source node input port)
if (iFormat.isVideo())
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "CPV2WayEncDataChannelDatapath::CheckPathSpecificOpen audio source port status %d\n", iSourceInputPort.GetStatus()));
if (iSourceInputPort.GetStatus() == EHasPort)
{
if (aUseFilePlayPort)
{
iSourceInputPort.GetPort()->Connect(iFilePlayPort);
iFilePlayPort->Connect(iSourceInputPort.GetPort());
}
else
{
iFilePlayPort->Disconnect();
iSourceInputPort.GetPort()->Disconnect();
}
}
}
//Else video, use splitter port
else
{
if (aUseFilePlayPort)
{
iPortPairList.front().Disconnect();
iPortPairList.front().iDestPort.GetPort()->Connect(iFilePlayPort);
iFilePlayPort->Connect(iPortPairList.front().iDestPort.GetPort());
}
else
{
iFilePlayPort->Disconnect();
iPortPairList.front().iDestPort.GetPort()->Disconnect();
iPortPairList.front().Connect();
}
}
}
void CPV2WayEncDataChannelDatapath::OpenComplete()
{
CommandComplete(PVMFSuccess);
}
bool CPV2WayEncDataChannelDatapath::CheckPathSpecificOpen()
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "CPV2WayEncDataChannelDatapath::CheckPathSpecificOpen\n"));
{
return true;
}
}
bool CPV2WayEncDataChannelDatapath::PathSpecificClose()
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "CPV2WayEncDataChannelDatapath::PathSpecificClose file port %x, input src port %d\n", iFilePlayPort, iSourceInputPort.GetStatus()));
if (iFilePlayPort)
{
iFilePlayPort->Disconnect();
}
switch (iSourceInputPort.GetStatus())
{
case EHasPort:
iSourceInputPort.GetPort()->Disconnect();
//i2Way->CheckAudioSourceMixingPort();
return false;
case ENoPort:
//No mixing port, continue closing this datapath
return true;
default:
break;
}
return false;
}
bool CPV2WayEncDataChannelDatapath::CheckPathSpecificStart()
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "CPV2WayEncDataChannelDatapath::CheckPathSpecificStart engine state=%d\n", i2Way->iState));
if (i2Way->iState == EConnecting || i2Way->iState == EConnected)
{
return true;
}
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_ERR, (0, "CPV2WayEncDataChannelDatapath::CheckPathSpecificStart engine not connecting yet."));
return false;
}