blob: 1b4286705a3aec833659c64cb5f37a85a29c6dee [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 "tsc_capability.h"
#include "tsc_statemanager.h"
#include "tsc_component.h"
void TSC_capability::InitVarsSession()
{
iTcsIn_H263_sqcifMPI = 0; // Units 1/30 second
iTcsIn_H263_qcifMPI = 2; // Units 1/30 second
iTcsIn_H263_cifMPI = 0; // Units 1/30 second
iTcsIn_H263_4cifMPI = 0; // Units 1/30 second
iTcsIn_H263_16cifMPI = 0; // Units 1/30 second
}
void TSC_capability::InitVarsLocal()
{
/* Initialize video resolutions */
PVMFVideoResolutionRange qcif_range(PVMF_RESOLUTION_QCIF, PVMF_RESOLUTION_QCIF);
iResolutionsRx.push_back(qcif_range);
iResolutionsTx.push_back(qcif_range);
}
void TSC_capability::ResetCapability()
{
if (iRemoteCapability)
{
delete iRemoteCapability;
iRemoteCapability = NULL;
}
}
TSC_capability::~TSC_capability()
{
ResetCapability();
}
Oscl_Vector<PVMFVideoResolutionRange, OsclMemAllocator>
TSC_capability::GetResolutions(TPVDirection dir)
{
if (dir == OUTGOING)
{
return iResolutionsTx;
}
return iResolutionsRx;
}
void TSC_capability::SetVideoResolutions(TPVDirection dir,
Oscl_Vector<PVMFVideoResolutionRange, OsclMemAllocator>& resolutions)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability::SetVideoResolutions dir(%d), size(%d)", dir, resolutions.size()));
if (dir == OUTGOING)
{
iResolutionsTx = resolutions;
}
else if (dir == INCOMING)
{
iResolutionsRx = resolutions;
}
}
uint32 TSC_capability::GetRemoteBitrate(PVCodecType_t codec_type)
{
/* lookup the bitrate from remote capabilities */
for (uint16 i = 0; i < iRemoteCapability->GetNumCapabilityItems(); i++)
{
if (iRemoteCapability->GetCapabilityItem(i)->GetFormatType() == PVCodecTypeToPVMFFormatType(codec_type))
{
uint32 br = iRemoteCapability->GetCapabilityItem(i)->GetBitrate();
return br;
}
}
return 0;
}
void TSC_capability::ExtractTcsParameters(PS_VideoCapability pVideo, CPvtH263Capability *aMedia_capability)
{
int frame_rate = GetMaxFrameRate_H263(pVideo->h263VideoCapability);
if (pVideo->h263VideoCapability->option_of_sqcifMPI)
{
iTcsIn_H263_sqcifMPI = pVideo->h263VideoCapability->sqcifMPI;
aMedia_capability->SetMaxResolution(128, 96, frame_rate);
}
if (pVideo->h263VideoCapability->option_of_qcifMPI)
{
iTcsIn_H263_qcifMPI = pVideo->h263VideoCapability->qcifMPI;
aMedia_capability->SetMaxResolution(176, 144, frame_rate);
}
if (pVideo->h263VideoCapability->option_of_cifMPI)
{
iTcsIn_H263_cifMPI = pVideo->h263VideoCapability->cifMPI;
aMedia_capability->SetMaxResolution(352, 288, frame_rate);
}
if (pVideo->h263VideoCapability->option_of_cif4MPI)
{
iTcsIn_H263_4cifMPI = pVideo->h263VideoCapability->cif4MPI;
aMedia_capability->SetMaxResolution(704, 576, frame_rate);
}
if (pVideo->h263VideoCapability->option_of_cif16MPI)
{
iTcsIn_H263_16cifMPI = pVideo->h263VideoCapability->cif16MPI;
aMedia_capability->SetMaxResolution(1408, 1192, frame_rate);
}
}
void TSC_capability::ExtractTcsParameters(PS_VideoCapability pVideo, CPvtMpeg4Capability *aMedia_capability)
{
int frame_rate = GetMaxFrameRate_M4V(pVideo->genericVideoCapability);
aMedia_capability->SetMaxResolution(176, 144, frame_rate);
}
////////////////////////////////////////////////////////////////////////////
// ParseTcsCapabilities()
//
// This routine takes the incoming TerminalCapability
// and parsed all capabilities - Audio, Video, UserInput.
//
////////////////////////////////////////////////////////////////////////////
void TSC_capability::ParseTcsCapabilities(S_Capability &aCapability, Oscl_Vector<CPvtMediaCapability*, OsclMemAllocator> &aMedia_capability, uint32 aUserInputCapabilities, S_UserInputCapability *aUserInputCapability)
{
CodecCapabilityInfo codec_info;
PS_VideoCapability pVideo = NULL;
PS_AudioCapability pAudio = NULL;
PVMFFormatType format_type = PVMF_MIME_FORMAT_UNKNOWN;
pVideo = NULL;
pAudio = NULL;
switch (aCapability.index)
{
case 1: // ReceiveVideo
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability: Remote video caps ReceiveVideo\n"));
pVideo = aCapability.receiveVideoCapability;
break;
case 3: // ReceiveAndTransmitVideo
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability: Remote video caps ReceiveAndTransmitVideo\n"));
pVideo = aCapability.receiveAndTransmitVideoCapability;
break;
case 4:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability: Remote video caps ReceiveAudio\n"));
pAudio = aCapability.receiveAudioCapability;
break;
case 6:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability: Remote video caps ReceiveAndTransmitAudio\n"));
pAudio = aCapability.receiveAndTransmitAudioCapability;
break;
case 15:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability: Remote caps receiveUserInputCapability"));
aUserInputCapability = aCapability.receiveUserInputCapability;
break;
case 17:
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability: Remote caps receiveAndTransmitUserInputCapability"));
aUserInputCapability = aCapability.receiveAndTransmitUserInputCapability;
break;
default:
return;
}
GetCodecInfo(&aCapability, codec_info);
if (codec_info.codec == PV_CODEC_TYPE_NONE)
return;
format_type = PVCodecTypeToPVMFFormatType(codec_info.codec);
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability::ParseTcsCapabilities CapabilityTable codec=%d,format=%s",
codec_info.codec, format_type.getMIMEStrPtr()));
CPvtMediaCapability* media_capability = NULL;
if (pVideo)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability::ParseTcsCapabilities Remote video caps Video index(%d)\n",
pVideo->index));
if (format_type == PVMF_MIME_H2632000) // H263VideoCapability
{
pVideo->index = 3;
media_capability = new CPvtH263Capability();
media_capability->iBitrate = pVideo->h263VideoCapability->maxBitRate;
// Extract H263 Parameters
ExtractTcsParameters(pVideo, (CPvtH263Capability*)media_capability);
((CPvtH263Capability *)media_capability)->iH263VideoCapability = pVideo->h263VideoCapability;
aMedia_capability.push_back(media_capability);
}
else if (format_type == PVMF_MIME_M4V)
{
media_capability = new CPvtMpeg4Capability();
media_capability->iBitrate = pVideo->genericVideoCapability->maxBitRate;
ExtractTcsParameters(pVideo, (CPvtMpeg4Capability*)media_capability);
((CPvtMpeg4Capability*)media_capability)->iGenericCapability = pVideo->genericVideoCapability;
aMedia_capability.push_back(media_capability);
}
}
else if (pAudio)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability: Remote caps Audio index(%d)\n", pAudio->index));
if (pAudio->index == 8)
{
media_capability = new CPvtAudioCapability(format_type);
aMedia_capability.push_back(media_capability);
media_capability->iBitrate = 64;
}
else if (pAudio->index == 20)
{
media_capability = new CPvtAudioCapability(format_type);
aMedia_capability.push_back(media_capability);
media_capability->iBitrate = pAudio->genericAudioCapability->maxBitRate;
}
}
else if (aUserInputCapability)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability: Remote caps UI index(%d)\n",
aUserInputCapability->index));
aUserInputCapabilities |= (1 << aUserInputCapability->index);
}
}
PS_DataType TSC_capability::GetOutgoingDataType(PVCodecType_t codecType,
uint32 bitrate,
uint16 csi_len,
uint8* csi)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability::GetOutgoingDataType - codecType(%d), bitrate(%d)", codecType, bitrate));
PS_DataType pDataType = (PS_DataType) OSCL_DEFAULT_MALLOC(sizeof(S_DataType));
oscl_memset(pDataType, 0, sizeof(S_DataType));
PS_GenericCapability genericCap = NULL;
uint16 index = 0;
/* lookup the bitrate from remote capabilities */
for (index = 0; index < iRemoteCapability->GetNumCapabilityItems(); index++)
{
if (iRemoteCapability->GetCapabilityItem(index)->GetFormatType() ==
PVCodecTypeToPVMFFormatType(codecType))
{
bitrate = iRemoteCapability->GetCapabilityItem(index)->GetBitrate();
break;
}
}
switch (codecType)
{
case PV_AUD_TYPE_G723: /* WWURM: change H324_AUDIO_RECV to H324_AUDIO_SEND */
/* (LCN=2): G723 Audio */
PS_G7231 g723Cap;
pDataType->index = 3;
/* NEW245: allocate memory for audioData*/
pDataType->audioData = (PS_AudioCapability) OSCL_DEFAULT_MALLOC(sizeof(S_AudioCapability));
pDataType->audioData->index = 8;
/* NEW245: allocate memory for g7231 */
pDataType->audioData->g7231 =
g723Cap =
(PS_G7231) OSCL_DEFAULT_MALLOC(sizeof(S_G7231));
g723Cap->maxAl_sduAudioFrames = 1;
g723Cap->silenceSuppression = false;
break;
case PV_AUD_TYPE_GSM:
/* (LCN=2): Amr Audio */
pDataType->index = 3;
/* NEW245: allocate memory for audioData */
pDataType->audioData = (PS_AudioCapability) OSCL_DEFAULT_MALLOC(sizeof(S_AudioCapability));
pDataType->audioData->index = 20;
/* NEW245: allocate memory for genericAudioCapability */
pDataType->audioData->genericAudioCapability =
genericCap =
(PS_GenericCapability) OSCL_DEFAULT_MALLOC(sizeof(S_GenericCapability));
genericCap->capabilityIdentifier.index = 0;
/* NEW245: allocate memory for standard */
genericCap->capabilityIdentifier.standard = (PS_OBJECTIDENT) OSCL_DEFAULT_MALLOC(sizeof(S_OBJECTIDENT));
genericCap->capabilityIdentifier.standard->size = 7;
genericCap->capabilityIdentifier.standard->data = (uint8*) OSCL_DEFAULT_MALLOC(7 * sizeof(uint8));
genericCap->capabilityIdentifier.standard->data[0] = 0x00;
genericCap->capabilityIdentifier.standard->data[1] = 0x08;
genericCap->capabilityIdentifier.standard->data[2] = 0x81;
genericCap->capabilityIdentifier.standard->data[3] = 0x75;
genericCap->capabilityIdentifier.standard->data[4] = 0x01;
genericCap->capabilityIdentifier.standard->data[5] = 0x01;
genericCap->capabilityIdentifier.standard->data[6] = 0x01;
genericCap->option_of_maxBitRate = true;
genericCap->maxBitRate = bitrate;
genericCap->option_of_collapsing = true;
genericCap->size_of_collapsing = 1;
genericCap->collapsing = (PS_GenericParameter) OSCL_DEFAULT_MALLOC(1 * sizeof(S_GenericParameter));
genericCap->collapsing[0].parameterIdentifier.index = 0;
genericCap->collapsing[0].parameterIdentifier.standard = 0;
genericCap->collapsing[0].parameterValue.index = 2;
genericCap->collapsing[0].parameterValue.unsignedMin = 1;
genericCap->collapsing[0].option_of_supersedes = false;
genericCap->option_of_nonCollapsing = false;
genericCap->option_of_nonCollapsingRaw = false;
genericCap->option_of_transport = false;
break;
case PV_VID_TYPE_H263:
/* (LCN=3): H263 Video */
PS_H263VideoCapability h263VideoCap;
pDataType->index = 2;
/* NEW245: allocate memory for videoData */
pDataType->videoData = (PS_VideoCapability) OSCL_DEFAULT_MALLOC(sizeof(S_VideoCapability));
oscl_memset(pDataType->videoData, 0, sizeof(S_VideoCapability));
pDataType->videoData->index = 3;
/* NEW245: allocate memory for h263VideoCapability */
pDataType->videoData->h263VideoCapability =
h263VideoCap =
(PS_H263VideoCapability) OSCL_DEFAULT_MALLOC(sizeof(S_H263VideoCapability));
oscl_memset(pDataType->videoData->h263VideoCapability, 0, sizeof(S_H263VideoCapability));
if (iTcsIn_H263_sqcifMPI && IsResolutionSupported(PVMF_RESOLUTION_SQCIF, iResolutionsTx))
{
h263VideoCap->option_of_sqcifMPI = true;
h263VideoCap->sqcifMPI = (uint8)iTcsIn_H263_sqcifMPI;
}
if (iTcsIn_H263_qcifMPI && IsResolutionSupported(PVMF_RESOLUTION_QCIF, iResolutionsTx))
{
h263VideoCap->option_of_qcifMPI = true;
h263VideoCap->qcifMPI = 2;
}
if (iTcsIn_H263_cifMPI && IsResolutionSupported(PVMF_RESOLUTION_CIF, iResolutionsTx))
{
h263VideoCap->option_of_cifMPI = true;
h263VideoCap->cifMPI = (uint8)iTcsIn_H263_cifMPI;
}
if (iTcsIn_H263_4cifMPI && IsResolutionSupported(PVMF_RESOLUTION_4CIF, iResolutionsTx))
{
h263VideoCap->option_of_cif4MPI = true;
h263VideoCap->cif4MPI = (uint8)iTcsIn_H263_4cifMPI;
}
if (iTcsIn_H263_16cifMPI && IsResolutionSupported(PVMF_RESOLUTION_16CIF, iResolutionsTx))
{
h263VideoCap->option_of_cif16MPI = true;
h263VideoCap->cif16MPI = (uint8)iTcsIn_H263_16cifMPI;
}
h263VideoCap->option_of_cifMPI = false;
h263VideoCap->option_of_cif4MPI = false;
h263VideoCap->option_of_cif16MPI = false;
h263VideoCap->maxBitRate = bitrate;
h263VideoCap->unrestrictedVector = false;
h263VideoCap->arithmeticCoding = false;
h263VideoCap->advancedPrediction = false;
h263VideoCap->pbFrames = false;
h263VideoCap->temporalSpatialTradeOffCapability = ON;
h263VideoCap->option_of_hrd_B = false;
h263VideoCap->option_of_bppMaxKb = false;
h263VideoCap->option_of_slowSqcifMPI = false;
h263VideoCap->option_of_slowQcifMPI = false;
h263VideoCap->option_of_slowCifMPI = false;
h263VideoCap->option_of_slowCif4MPI = false;
h263VideoCap->option_of_slowCif16MPI = false;
h263VideoCap->errorCompensation = false;
h263VideoCap->option_of_enhancementLayerInfo = false;
h263VideoCap->option_of_h263Options = false;
break;
case PV_VID_TYPE_MPEG4:
{
/* (LCN=3): MPEG4 Video */
pDataType->index = 2;
/* NEW245: allocate memory for videoData */
pDataType->videoData = (PS_VideoCapability) OSCL_DEFAULT_MALLOC(sizeof(S_VideoCapability));
pDataType->videoData->index = 5;
/* NEW245: allocate memory for genericVideoCapability */
pDataType->videoData->genericVideoCapability =
genericCap =
(PS_GenericCapability) OSCL_DEFAULT_MALLOC(sizeof(S_GenericCapability));
genericCap->capabilityIdentifier.index = 0;
/* NEW245: allocate memory for standard */
genericCap->capabilityIdentifier.standard = (PS_OBJECTIDENT) OSCL_DEFAULT_MALLOC(sizeof(S_OBJECTIDENT));
genericCap->capabilityIdentifier.standard->size = 7;
genericCap->capabilityIdentifier.standard->data = (uint8*) OSCL_DEFAULT_MALLOC(7 * sizeof(uint8));
genericCap->capabilityIdentifier.standard->data[0] = 0x00;
genericCap->capabilityIdentifier.standard->data[1] = 0x08;
genericCap->capabilityIdentifier.standard->data[2] = 0x81;
genericCap->capabilityIdentifier.standard->data[3] = 0x75;
genericCap->capabilityIdentifier.standard->data[4] = 0x01;
genericCap->capabilityIdentifier.standard->data[5] = 0x00;
genericCap->capabilityIdentifier.standard->data[6] = 0x00;
genericCap->option_of_maxBitRate = true;
genericCap->maxBitRate = bitrate;
genericCap->option_of_collapsing = false;
genericCap->option_of_nonCollapsing = true;
genericCap->size_of_nonCollapsing = 3;
genericCap->nonCollapsing = (PS_GenericParameter) OSCL_DEFAULT_MALLOC(3 * sizeof(S_GenericParameter));
genericCap->nonCollapsing[0].parameterIdentifier.index = 0;
genericCap->nonCollapsing[0].parameterIdentifier.standard = 0;
genericCap->nonCollapsing[0].parameterValue.index = 3;
// Value on next line changed to 8 (RAN - PandL)
genericCap->nonCollapsing[0].parameterValue.unsignedMax = 8; /* simple profile level 0 */
genericCap->nonCollapsing[0].option_of_supersedes = false;
genericCap->nonCollapsing[1].parameterIdentifier.index = 0;
genericCap->nonCollapsing[1].parameterIdentifier.standard = 1;
genericCap->nonCollapsing[1].parameterValue.index = 3;
genericCap->nonCollapsing[1].parameterValue.unsignedMax = 1; /* simple profile object */
genericCap->nonCollapsing[1].option_of_supersedes = false;
/* WWU_VOAL2: BLCMP4 temporally off */
genericCap->nonCollapsing[2].parameterIdentifier.index = 0;
genericCap->nonCollapsing[2].parameterIdentifier.standard = 2;
genericCap->nonCollapsing[2].parameterValue.index = 6;
/* NEW245: allocate memory for octetString */
genericCap->nonCollapsing[2].parameterValue.octetString =
(PS_OCTETSTRING) OSCL_DEFAULT_MALLOC(sizeof(S_OCTETSTRING));
if (csi && csi_len)
{
genericCap->nonCollapsing[2].parameterValue.octetString->data = (uint8*)OSCL_DEFAULT_MALLOC(csi_len);
oscl_memcpy(genericCap->nonCollapsing[2].parameterValue.octetString->data,
csi,
csi_len);
genericCap->nonCollapsing[2].parameterValue.octetString->size = csi_len;
}
else // need to set it to FILLER FSI otherwise PER copy/delete routines will Leave
{
genericCap->nonCollapsing[2].parameterValue.octetString->data = (uint8*)OSCL_DEFAULT_MALLOC(PV2WAY_FILLER_FSI_LEN);
SetFillerFsi(genericCap->nonCollapsing[2].parameterValue.octetString->data, PV2WAY_FILLER_FSI_LEN);
genericCap->nonCollapsing[2].parameterValue.octetString->size = PV2WAY_FILLER_FSI_LEN;
}
genericCap->nonCollapsing[2].option_of_supersedes = false;
genericCap->option_of_nonCollapsingRaw = false;
genericCap->option_of_transport = false;
}
break;
default:
/* NULL data type */
pDataType->index = 1;
}
return pDataType;
}
/* The following routine verifies if an incoming datatype is syntactically valid and supported */
PVMFStatus TSC_capability::ValidateIncomingDataType(bool forRev, PS_DataType pDataType)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability::ValidateIncomingDataType(%d,%x)", forRev, pDataType));
if (!pDataType)
return PVMFFailure;
if (pDataType->index == 1) // null data
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability::ValidateIncomingDataType - null data type received"));
if (forRev)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability::ValidateIncomingDataType Error - null data not acceptable for forward parameters"));
return PVMFFailure;
}
return PVMFSuccess;
}
else if (pDataType->index == 2) // videoData
{
PS_VideoCapability video_cap = pDataType->videoData;
if (video_cap->index == 3) /* H263 */
{
PS_H263VideoCapability h263Cap = video_cap->h263VideoCapability;
// checks only valid on forward parameters
if (forRev)
{
// check if any unsupported resolution is indicated
if ((h263Cap->option_of_sqcifMPI && !IsResolutionSupported(PVMF_RESOLUTION_SQCIF, iResolutionsRx)) ||
(h263Cap->option_of_qcifMPI && !IsResolutionSupported(PVMF_RESOLUTION_QCIF, iResolutionsRx)) ||
(h263Cap->option_of_cifMPI && !IsResolutionSupported(PVMF_RESOLUTION_CIF, iResolutionsRx)) ||
(h263Cap->option_of_cif4MPI && !IsResolutionSupported(PVMF_RESOLUTION_4CIF, iResolutionsRx)) ||
(h263Cap->option_of_cif16MPI && !IsResolutionSupported(PVMF_RESOLUTION_16CIF, iResolutionsRx)))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_REL, iLogger, PVLOGMSG_EMERG,
(0, "TSC_capability::ValidateIncomingDataType ERROR - Unsuported resolution"));
return PVMFErrNotSupported;
}
// check if atleast one resolution is enabled
if (!(h263Cap->option_of_sqcifMPI ||
h263Cap->option_of_qcifMPI ||
h263Cap->option_of_cifMPI ||
h263Cap->option_of_cif4MPI ||
h263Cap->option_of_cif16MPI))
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_REL, iLogger, PVLOGMSG_EMERG,
(0, "TSC_capability::ValidateIncomingDataType ERROR - Invalid datatype for H.263. No resolutions indicated."));
return PVMFFailure;
}
}
else // checks only valid on reverse parameters
{
unsigned num_ok_resolutions = 0;
if (h263Cap->option_of_sqcifMPI &&
IsResolutionSupported(PVMF_RESOLUTION_SQCIF, iResolutionsTx))
{
if (h263Cap->sqcifMPI < 1 || h263Cap->sqcifMPI > 30)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_REL, iLogger, PVLOGMSG_EMERG,
(0, "TSC_capability::ValidateIncomingDataType ERROR - Invalid H263 SQCIF mpi"));
}
else
num_ok_resolutions++;
}
if (h263Cap->option_of_qcifMPI &&
IsResolutionSupported(PVMF_RESOLUTION_QCIF, iResolutionsTx))
{
if (h263Cap->qcifMPI < 1 || h263Cap->qcifMPI > 30)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_REL, iLogger, PVLOGMSG_EMERG,
(0, "TSC_capability::ValidateIncomingDataType ERROR - Invalid H263 QCIF mpi"));
}
else
num_ok_resolutions++;
}
if (h263Cap->option_of_cifMPI &&
IsResolutionSupported(PVMF_RESOLUTION_CIF, iResolutionsTx))
{
if (h263Cap->cifMPI < 1 || h263Cap->cifMPI > 30)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_REL, iLogger, PVLOGMSG_EMERG,
(0, "TSC_capability::ValidateIncomingDataType ERROR - Invalid H263 QCIF mpi"));
}
else
num_ok_resolutions++;
}
if (h263Cap->option_of_cif4MPI &&
IsResolutionSupported(PVMF_RESOLUTION_4CIF, iResolutionsTx))
{
if (h263Cap->cif4MPI < 1 || h263Cap->cif4MPI > 30)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_REL, iLogger, PVLOGMSG_EMERG,
(0, "TSC_capability::ValidateIncomingDataType ERROR - Invalid H263 QCIF mpi"));
}
else
num_ok_resolutions++;
}
if (h263Cap->option_of_cif16MPI &&
IsResolutionSupported(PVMF_RESOLUTION_16CIF, iResolutionsTx))
{
if (h263Cap->cif16MPI < 1 || h263Cap->cif16MPI > 30)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_REL, iLogger, PVLOGMSG_EMERG,
(0, "TSC_capability::ValidateIncomingDataType ERROR - Invalid H263 QCIF mpi"));
}
else
num_ok_resolutions++;
}
if (num_ok_resolutions == 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_REL, iLogger, PVLOGMSG_EMERG,
(0, "TSC_capability::ValidateIncomingDataType ERROR - Cannot transmit using this codec"));
return PVMFFailure;
}
}
if (h263Cap->maxBitRate > 640)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_REL, iLogger, PVLOGMSG_EMERG,
(0, "TSC_capability::ValidateIncomingDataType ERROR - Invalid bitrate(%d)", h263Cap->maxBitRate));
return PVMFFailure;
}
}
else if (video_cap->index == 5) /* MPEG 4 */
{
//PS_GenericCapability m4vCap=video_cap->genericVideoCapability;
uint8* fsi = NULL;
unsigned fsisz =::GetFormatSpecificInfo(pDataType, fsi);
if (fsi != NULL && fsisz != 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_REL, iLogger, PVLOGMSG_EMERG,
(0, "TSC_capability::ValidateIncomingDataType VOL header dump"));
printBuffer(iLogger, fsi, (uint16)fsisz);
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_REL, iLogger, PVLOGMSG_EMERG,
(0, "TSC_capability::ValidateIncomingDataType VOL header not given"));
}
}
else
{
return PVMFErrNotSupported;
}
}
else if (pDataType->index == 3) // audioData
{
PS_AudioCapability audio_cap = pDataType->audioData;
if (audio_cap->index == 8) /* G.723 */
{
//PS_G7231 g723Cap = audio_cap->g7231;
}
else if (audio_cap->index == 20) /* AMR */
{
//PS_GenericCapability amrCap=audio_cap->genericAudioCapability;
}
else
{
return PVMFErrNotSupported;
}
}
else
{
return PVMFErrNotSupported;
}
return PVMFSuccess;
}
/* The following routines return our preferences for DataType and H223LogicalChannelParameters */
bool TSC_capability::IsSegmentable(TPVDirection direction, PV2WayMediaType media_type)
{
OSCL_UNUSED_ARG(direction);
switch (media_type)
{
case PV_AUDIO:
return false;
case PV_VIDEO:
return true;
default:
return true;
}
}
PS_H223LogicalChannelParameters
TSC_capability::GetOutgoingLcnParams(PV2WayMediaType media_type, PS_AdaptationLayerType adaptation_layer)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability:GetLcnParams - media_type(%d), layer(%x)", media_type, adaptation_layer));
OSCL_ASSERT(media_type == PV_AUDIO || media_type == PV_VIDEO);
PS_H223LogicalChannelParameters pParameter = (PS_H223LogicalChannelParameters)OSCL_DEFAULT_MALLOC(sizeof(S_H223LogicalChannelParameters));
oscl_memset(pParameter , 0, sizeof(S_H223LogicalChannelParameters));
pParameter->segmentableFlag = IsSegmentable(OUTGOING, media_type);
pParameter->adaptationLayerType.index = adaptation_layer->index;
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability: GetLcnParams al index(%d) \n", pParameter->adaptationLayerType.index));
if (pParameter->adaptationLayerType.index == 5)
{
/* AL3(Video) */
pParameter->adaptationLayerType.al3 = (PS_Al3) OSCL_DEFAULT_MALLOC(sizeof(S_Al3));
oscl_memcpy(pParameter->adaptationLayerType.al3, adaptation_layer->al3, sizeof(S_Al3));
pParameter->adaptationLayerType.al3->sendBufferSize = 0;
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability: GetLcnParams controlFieldOctets(%d), sendBufferSize(%d)\n",
pParameter->adaptationLayerType.al3->controlFieldOctets,
pParameter->adaptationLayerType.al3->sendBufferSize));
}
return pParameter;
}
PVMFStatus TSC_capability::ValidateIncomingH223LcnParams(PS_H223LogicalChannelParameters h223params,
TPVDirection dir)
{
OSCL_UNUSED_ARG(dir);
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability::ValidateIncomingH223LcnParams(%x),dir(%d)",
h223params, dir));
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability::ValidateIncomingH223LcnParams AL index(%d)",
h223params->adaptationLayerType.index));
if (h223params->adaptationLayerType.index == 0 ||
h223params->adaptationLayerType.index > 5)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability::ValidateIncomingH223LcnParams invalid index(%d)",
h223params->adaptationLayerType.index));
return PVMFErrNotSupported;
}
if (h223params->adaptationLayerType.index == 5)
{
PS_Al3 al3 = h223params->adaptationLayerType.al3;
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability::ValidateIncomingH223LcnParams al3->controlFieldOctets(%d),al3->sendBufferSize(%d)", al3->controlFieldOctets, al3->sendBufferSize));
if (al3->controlFieldOctets > 2)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_REL, iLogger, PVLOGMSG_EMERG,
(0, "TSC_capability::ValidateIncomingH223LcnParams ERROR - Invalid al3->controlFieldOctets(%d)", al3->controlFieldOctets));
return PVMFFailure;
}
}
return PVMFSuccess;
}
PVMFStatus TSC_capability::ValidateForwardReverseParams(PS_ForwardReverseParam forRevParams,
TPVDirection dir)
{
if (forRevParams == NULL || dir == PV_DIRECTION_NONE)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability::ValidateForwardReverseParams forRevParams==NULL || dir==PV_DIRECTION_NONE"));
return PVMFFailure;
}
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability::ValidateForwardReverseParams params(%x), option_of_reverse(%d)",
forRevParams,
forRevParams->option_of_reverseLogicalChannelParameters));
if (dir&INCOMING)
{
PS_ForwardLogicalChannelParameters forwardParams = &forRevParams->forwardLogicalChannelParameters;
/* validate datatype */
PVMFStatus datatypeCheck = ValidateIncomingDataType(true, &forwardParams->dataType);
if (datatypeCheck != PVMFSuccess)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_REL, iLogger, PVLOGMSG_EMERG,
(0, "TSC_capability::ValidateForwardReverseParams ERROR - forward datatype not supported."));
return datatypeCheck;
}
/* Validate lcp */
if (forwardParams->multiplexParameters.index != 1)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability::ValidateForwardReverseParams Invalid index for forward multipleParameters(%d)", forwardParams->multiplexParameters.index));
return PVMFFailure;
}
if (forwardParams->multiplexParameters.h223LogicalChannelParameters == NULL)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability::ValidateForwardReverseParams forward multipleParameters==NULL"));
return PVMFFailure;
}
PVMFStatus h223paramsCheck = ValidateIncomingH223LcnParams(forwardParams->multiplexParameters.h223LogicalChannelParameters, INCOMING);
if (h223paramsCheck != PVMFSuccess)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_REL, iLogger, PVLOGMSG_EMERG,
(0, "TSC_capability::ValidateForwardReverseParams ERROR - forward h223params not supported."));
return h223paramsCheck;
}
}
if (dir&OUTGOING)
{
if (!forRevParams->option_of_reverseLogicalChannelParameters)
return PVMFSuccess;
PS_ReverseLogicalChannelParameters reverseParams = &forRevParams->reverseLogicalChannelParameters;
/* validate datatype */
PVMFStatus datatypeCheck = ValidateIncomingDataType(false, &reverseParams->dataType);
if (datatypeCheck != PVMFSuccess)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_REL, iLogger, PVLOGMSG_EMERG,
(0, "TSC_capability::ValidateForwardReverseParams ERROR - reverse datatype not supported."));
return datatypeCheck;
}
if (!reverseParams->option_of_rlcMultiplexParameters)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability::ValidateForwardReverseParams no option for reverse multipleParameters"));
return PVMFFailure;
}
/* Validate lcp */
if (reverseParams->rlcMultiplexParameters.index != 0)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability::ValidateForwardReverseParams Invalid index for reverse multipleParameters(%d)", reverseParams->rlcMultiplexParameters.index));
return PVMFFailure;
}
if (reverseParams->rlcMultiplexParameters.h223LogicalChannelParameters == NULL)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability::ValidateForwardReverseParams reverse multipleParameters==NULL"));
return PVMFFailure;
}
PVMFStatus h223paramsCheck = ValidateIncomingH223LcnParams(reverseParams->rlcMultiplexParameters.h223LogicalChannelParameters, OUTGOING);
if (h223paramsCheck != PVMFSuccess)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_REL, iLogger, PVLOGMSG_EMERG,
(0, "TSC_capability::ValidateForwardReverseParams ERROR - reverse h223params not supported."));
return h223paramsCheck;
}
}
return PVMFSuccess;
}
bool TSC_capability::VerifyReverseParameters(PS_ForwardReverseParam forRevParams,
TSCObserver* aObserver,
PVMFStatus& status)
{
OSCL_UNUSED_ARG(aObserver);
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability::VerifyReverseParameters"));
status = PVMFSuccess;
status = ValidateForwardReverseParams(forRevParams, OUTGOING);
if (status != PVMFSuccess)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability:VerifyReverseParameters - Reverse params invalid"));
return true;
}
PVCodecType_t codec = GetCodecType(&forRevParams->reverseLogicalChannelParameters.dataType);
GetMediaType(codec);
if (!CodecRequiresFsi(codec))
{
status = PVMFSuccess;
return true;
}
status = PVMFFailure;
return false;
}
CPvtTerminalCapability* TSC_capability::GetRemoteCapability()
{
return iRemoteCapability;
}
uint32 TSC_capability::GetMaxBitrateForOutgoingChannel(PVCodecType_t codecType)
{
uint32 bitrate = 0;
/* lookup the bitrate from remote capabilities */
for (uint16 i = 0; i < iRemoteCapability->GetNumCapabilityItems(); i++)
{
if (iRemoteCapability->GetCapabilityItem(i)->GetFormatType() == PVCodecTypeToPVMFFormatType(codecType))
bitrate = iRemoteCapability->GetCapabilityItem(i)->GetBitrate();
}
return bitrate;
}
PS_DataType
TSC_capability::GetDataType(PVCodecType_t codecType,
uint32 bitrate,
const uint8* dci,
uint16 dci_len)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability::GetDataType - codecType(%d),bitrate(%d),dci(%x),dci_len(%d)",
codecType, bitrate, dci, dci_len));
bitrate /= 100;
PS_DataType pDataType = (PS_DataType) OSCL_DEFAULT_MALLOC(sizeof(S_DataType));
oscl_memset(pDataType , 0, sizeof(S_DataType));
PS_GenericCapability genericCap = NULL;
switch (codecType)
{
case PV_AUD_TYPE_G723: /* WWURM: change H324_AUDIO_RECV to H324_AUDIO_SEND */
/* (LCN=2): G723 Audio */
PS_G7231 g723Cap;
pDataType->index = 3;
/* NEW245: allocate memory for audioData*/
pDataType->audioData = (PS_AudioCapability) OSCL_DEFAULT_MALLOC(sizeof(S_AudioCapability));
pDataType->audioData->index = 8;
/* NEW245: allocate memory for g7231 */
pDataType->audioData->g7231 =
g723Cap =
(PS_G7231) OSCL_DEFAULT_MALLOC(sizeof(S_G7231));
g723Cap->maxAl_sduAudioFrames = 1;
g723Cap->silenceSuppression = false;
break;
case PV_AUD_TYPE_GSM:
/* (LCN=2): Amr Audio */
pDataType->index = 3;
/* NEW245: allocate memory for audioData */
pDataType->audioData = (PS_AudioCapability) OSCL_DEFAULT_MALLOC(sizeof(S_AudioCapability));
pDataType->audioData->index = 20;
/* NEW245: allocate memory for genericAudioCapability */
pDataType->audioData->genericAudioCapability =
genericCap =
(PS_GenericCapability) OSCL_DEFAULT_MALLOC(sizeof(S_GenericCapability));
genericCap->capabilityIdentifier.index = 0;
/* NEW245: allocate memory for standard */
genericCap->capabilityIdentifier.standard = (PS_OBJECTIDENT) OSCL_DEFAULT_MALLOC(sizeof(S_OBJECTIDENT));
genericCap->capabilityIdentifier.standard->size = 7;
genericCap->capabilityIdentifier.standard->data = (uint8*) OSCL_DEFAULT_MALLOC(7 * sizeof(uint8));
genericCap->capabilityIdentifier.standard->data[0] = 0x00;
genericCap->capabilityIdentifier.standard->data[1] = 0x08;
genericCap->capabilityIdentifier.standard->data[2] = 0x81;
genericCap->capabilityIdentifier.standard->data[3] = 0x75;
genericCap->capabilityIdentifier.standard->data[4] = 0x01;
genericCap->capabilityIdentifier.standard->data[5] = 0x01;
genericCap->capabilityIdentifier.standard->data[6] = 0x01;
genericCap->option_of_maxBitRate = true;
genericCap->maxBitRate = bitrate;
genericCap->option_of_collapsing = true;
genericCap->size_of_collapsing = 1;
genericCap->collapsing = (PS_GenericParameter) OSCL_DEFAULT_MALLOC(1 * sizeof(S_GenericParameter));
genericCap->collapsing[0].parameterIdentifier.index = 0;
genericCap->collapsing[0].parameterIdentifier.standard = 0;
genericCap->collapsing[0].parameterValue.index = 2;
genericCap->collapsing[0].parameterValue.unsignedMin = 1;
genericCap->collapsing[0].option_of_supersedes = false;
genericCap->option_of_nonCollapsing = false;
genericCap->option_of_nonCollapsingRaw = false;
genericCap->option_of_transport = false;
break;
case PV_VID_TYPE_H263:
/* (LCN=3): H263 Video */
PS_H263VideoCapability h263VideoCap;
pDataType->index = 2;
/* NEW245: allocate memory for videoData */
pDataType->videoData = (PS_VideoCapability) OSCL_DEFAULT_MALLOC(sizeof(S_VideoCapability));
oscl_memset(pDataType->videoData, 0, sizeof(S_VideoCapability));
pDataType->videoData->index = 3;
/* NEW245: allocate memory for h263VideoCapability */
pDataType->videoData->h263VideoCapability =
h263VideoCap =
(PS_H263VideoCapability) OSCL_DEFAULT_MALLOC(sizeof(S_H263VideoCapability));
oscl_memset(pDataType->videoData->h263VideoCapability, 0, sizeof(S_H263VideoCapability));
if (iTcsIn_H263_sqcifMPI && IsResolutionSupported(PVMF_RESOLUTION_SQCIF, iResolutionsTx))
{
h263VideoCap->option_of_sqcifMPI = true;
h263VideoCap->sqcifMPI = (uint8)iTcsIn_H263_sqcifMPI;
}
if (iTcsIn_H263_qcifMPI && IsResolutionSupported(PVMF_RESOLUTION_QCIF, iResolutionsTx))
{
h263VideoCap->option_of_qcifMPI = true;
h263VideoCap->qcifMPI = 2;
}
if (iTcsIn_H263_cifMPI && IsResolutionSupported(PVMF_RESOLUTION_CIF, iResolutionsTx))
{
h263VideoCap->option_of_cifMPI = true;
h263VideoCap->cifMPI = (uint8)iTcsIn_H263_cifMPI;
}
if (iTcsIn_H263_4cifMPI && IsResolutionSupported(PVMF_RESOLUTION_4CIF, iResolutionsTx))
{
h263VideoCap->option_of_cif4MPI = true;
h263VideoCap->cif4MPI = (uint8)iTcsIn_H263_4cifMPI;
}
if (iTcsIn_H263_16cifMPI && IsResolutionSupported(PVMF_RESOLUTION_16CIF, iResolutionsTx))
{
h263VideoCap->option_of_cif16MPI = true;
h263VideoCap->cif16MPI = (uint8)iTcsIn_H263_16cifMPI;
}
h263VideoCap->option_of_cifMPI = false;
h263VideoCap->option_of_cif4MPI = false;
h263VideoCap->option_of_cif16MPI = false;
h263VideoCap->maxBitRate = bitrate;
h263VideoCap->unrestrictedVector = false;
h263VideoCap->arithmeticCoding = false;
h263VideoCap->advancedPrediction = false;
h263VideoCap->pbFrames = false;
h263VideoCap->temporalSpatialTradeOffCapability = ON;
h263VideoCap->option_of_hrd_B = false;
h263VideoCap->option_of_bppMaxKb = false;
h263VideoCap->option_of_slowSqcifMPI = false;
h263VideoCap->option_of_slowQcifMPI = false;
h263VideoCap->option_of_slowCifMPI = false;
h263VideoCap->option_of_slowCif4MPI = false;
h263VideoCap->option_of_slowCif16MPI = false;
h263VideoCap->errorCompensation = false;
h263VideoCap->option_of_enhancementLayerInfo = false;
h263VideoCap->option_of_h263Options = false;
break;
case PV_VID_TYPE_MPEG4:
{
/* (LCN=3): MPEG4 Video */
pDataType->index = 2;
/* NEW245: allocate memory for videoData */
pDataType->videoData = (PS_VideoCapability) OSCL_DEFAULT_MALLOC(sizeof(S_VideoCapability));
pDataType->videoData->index = 5;
/* NEW245: allocate memory for genericVideoCapability */
pDataType->videoData->genericVideoCapability =
genericCap =
(PS_GenericCapability) OSCL_DEFAULT_MALLOC(sizeof(S_GenericCapability));
genericCap->capabilityIdentifier.index = 0;
/* NEW245: allocate memory for standard */
genericCap->capabilityIdentifier.standard = (PS_OBJECTIDENT) OSCL_DEFAULT_MALLOC(sizeof(S_OBJECTIDENT));
genericCap->capabilityIdentifier.standard->size = 7;
genericCap->capabilityIdentifier.standard->data = (uint8*) OSCL_DEFAULT_MALLOC(7 * sizeof(uint8));
genericCap->capabilityIdentifier.standard->data[0] = 0x00;
genericCap->capabilityIdentifier.standard->data[1] = 0x08;
genericCap->capabilityIdentifier.standard->data[2] = 0x81;
genericCap->capabilityIdentifier.standard->data[3] = 0x75;
genericCap->capabilityIdentifier.standard->data[4] = 0x01;
genericCap->capabilityIdentifier.standard->data[5] = 0x00;
genericCap->capabilityIdentifier.standard->data[6] = 0x00;
genericCap->option_of_maxBitRate = true;
genericCap->maxBitRate = bitrate;
genericCap->option_of_collapsing = false;
genericCap->option_of_nonCollapsing = true;
genericCap->size_of_nonCollapsing = (uint16)((dci && dci_len) ? 3 : 2);
genericCap->nonCollapsing = (PS_GenericParameter) OSCL_DEFAULT_MALLOC(3 * sizeof(S_GenericParameter));
genericCap->nonCollapsing[0].parameterIdentifier.index = 0;
genericCap->nonCollapsing[0].parameterIdentifier.standard = 0;
genericCap->nonCollapsing[0].parameterValue.index = 3;
// Value on next line changed to 8 (RAN - PandL)
genericCap->nonCollapsing[0].parameterValue.unsignedMax = 8; /* simple profile level 0 */
genericCap->nonCollapsing[0].option_of_supersedes = false;
genericCap->nonCollapsing[1].parameterIdentifier.index = 0;
genericCap->nonCollapsing[1].parameterIdentifier.standard = 1;
genericCap->nonCollapsing[1].parameterValue.index = 3;
genericCap->nonCollapsing[1].parameterValue.unsignedMax = 1; /* simple profile object */
genericCap->nonCollapsing[1].option_of_supersedes = false;
if (dci && dci_len)
{
/* WWU_VOAL2: BLCMP4 temporally off */
genericCap->nonCollapsing[2].parameterIdentifier.index = 0;
genericCap->nonCollapsing[2].parameterIdentifier.standard = 2;
genericCap->nonCollapsing[2].parameterValue.index = 6;
/* NEW245: allocate memory for octetString */
genericCap->nonCollapsing[2].parameterValue.octetString =
(PS_OCTETSTRING) OSCL_DEFAULT_MALLOC(sizeof(S_OCTETSTRING));
genericCap->nonCollapsing[2].parameterValue.octetString->data =
(uint8*)OSCL_DEFAULT_MALLOC(dci_len);
oscl_memcpy(genericCap->nonCollapsing[2].parameterValue.octetString->data,
dci, dci_len);
genericCap->nonCollapsing[2].parameterValue.octetString->size = dci_len;
genericCap->nonCollapsing[2].option_of_supersedes = false;
}
genericCap->option_of_nonCollapsingRaw = false;
genericCap->option_of_transport = false;
}
break;
default:
/* NULL data type */
pDataType->index = 1;
}
return pDataType;
}
uint16
TSC_capability::GetSupportedCodecCapabilityInfo(TPVDirection dir,
PV2WayMediaType mediaType,
Oscl_Vector<CodecCapabilityInfo*, OsclMemAllocator>& codec_info_list)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_capability::GetSupportedCodecCapabilityInfo dir=%d, mediaType=%d",
dir, mediaType));
Oscl_Vector<H324ChannelParameters, PVMFTscAlloc>* channel_config =
iTSCcomponent->GetChannelConfig(dir);
if (channel_config == NULL)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_capability::GetSupportedCodecCapabilityInfo channel config for this direction == NULL"));
return 0;
}
for (unsigned n = 0; n < channel_config->size(); n++)
{
PV2WayMediaType channelMediaType = (*channel_config)[n].GetMediaType();
if (channelMediaType != mediaType)
{
continue;
}
Oscl_Vector<FormatCapabilityInfo, OsclMemAllocator>* formats = (*channel_config)[n].GetCodecs();
if (!formats)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_WARNING,
(0, "TSC_capability::GetSupportedCodecCapabilityInfo No formats specified for format type(%d)", channelMediaType));
continue;
}
for (unsigned m = 0; m < formats->size(); m++)
{
CodecCapabilityInfo* info = NULL;
PVCodecType_t codec_type = PVMFFormatTypeToPVCodecType((*formats)[m].format);
TPVDirection dir = (*formats)[m].dir;
if (GetMediaType(codec_type) == PV_VIDEO)
{
info = new VideoCodecCapabilityInfo;
((VideoCodecCapabilityInfo*)info)->resolutions = (dir == OUTGOING) ? iResolutionsTx : iResolutionsRx;
}
else
{
info = new CodecCapabilityInfo;
}
info->codec = codec_type;
info->dir = dir;
codec_info_list.push_back(info);
}
}
return (uint16)codec_info_list.size();
}
bool
TSC_capability::HasSymmetryConstraint(Oscl_Vector<CodecCapabilityInfo*, OsclMemAllocator>& codec_list)
{
for (unsigned i = 0; i < codec_list.size(); i++)
{
if (codec_list[i]->dir == PV_DIRECTION_BOTH)
return true;
}
return false;
}
CodecCapabilityInfo*
TSC_capability::SelectOutgoingCodec(Oscl_Vector<CodecCapabilityInfo*, OsclMemAllocator>* remote_list,
Oscl_Vector<CodecCapabilityInfo*, OsclMemAllocator>* local_list)
{
Oscl_Vector<CodecCapabilityInfo*, OsclMemAllocator>* list1 = remote_list;
Oscl_Vector<CodecCapabilityInfo*, OsclMemAllocator>* list2 = local_list;
if (iTSCstatemanager.ReadState(TSC_MSD_DECISION) == MASTER)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability::SelectOutgoingCodec Selecting our preferred codec for mediaType since we are master"));
list1 = local_list;
list2 = remote_list;
}
for (unsigned i = 0; i < (*list1).size(); i++)
{
CodecCapabilityInfo* supported_codec_info =::IsSupported((*list1)[i], *list2);
if (supported_codec_info == NULL)
continue;
// check if we support transmitting this codec
FormatCapabilityInfo capability_info;
if (iTSCcomponent->IsSupported(OUTGOING,
supported_codec_info->codec, capability_info))
{
return (list1 == remote_list) ? (*list1)[i] : supported_codec_info;
}
else
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_capability::SelectOutgoingCodec Codec=%d not supported in outgoing direction",
supported_codec_info->codec));
}
}
return NULL;
}
CodecCapabilityInfo*
TSC_capability::SelectOutgoingCodec(Oscl_Vector < CodecCapabilityInfo*,
OsclMemAllocator > * remote_list)
{
for (unsigned i = 0; i < (*remote_list).size(); i++)
{
// check if this includes receive capability
if ((*remote_list)[i]->dir == OUTGOING)
{
continue;
}
// check if we support transmitting this codec
FormatCapabilityInfo capability_info;
if (iTSCcomponent->IsSupported(OUTGOING,
(*remote_list)[i]->codec, capability_info))
{
return (*remote_list)[i];
}
}
return NULL;
}