| /* ------------------------------------------------------------------ |
| * 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; |
| } |
| |
| |