diff options
Diffstat (limited to 'addons/ooh323c/src/ooCapability.c')
-rw-r--r-- | addons/ooh323c/src/ooCapability.c | 2349 |
1 files changed, 2349 insertions, 0 deletions
diff --git a/addons/ooh323c/src/ooCapability.c b/addons/ooh323c/src/ooCapability.c new file mode 100644 index 000000000..aeecbee10 --- /dev/null +++ b/addons/ooh323c/src/ooCapability.c @@ -0,0 +1,2349 @@ +/* + * Copyright (C) 2004-2005 by Objective Systems, Inc. + * + * This software is furnished under an open source license and may be + * used and copied only in accordance with the terms of this license. + * The text of the license may generally be found in the root + * directory of this installation in the COPYING file. It + * can also be viewed online at the following URL: + * + * http://www.obj-sys.com/open/license.html + * + * Any redistributions of this file including modified versions must + * maintain this copyright notice. + * + *****************************************************************************/ +#include "ooCapability.h" +#include "ootrace.h" +#include "ooCalls.h" +#include "ooh323ep.h" +#include "ooUtils.h" +/** Global endpoint structure */ +extern OOH323EndPoint gH323ep; + +static int giDynamicRTPPayloadType = 101; + +int ooCapabilityEnableDTMFRFC2833 + (OOH323CallData *call, int dynamicRTPPayloadType) +{ + if(!call) + { + gH323ep.dtmfmode |= OO_CAP_DTMF_RFC2833; + OOTRACEINFO1("Enabled RFC2833 DTMF capability for end-point\n"); + } + else{ + call->dtmfmode |= OO_CAP_DTMF_RFC2833; + OOTRACEINFO3("Enabled RFC2833 DTMF capability for (%s, %s) \n", + call->callType, call->callToken); + } + + /*Dynamic RTP payload type range is from 96 - 127 */ + if(dynamicRTPPayloadType >= 96 && dynamicRTPPayloadType <= 127) + giDynamicRTPPayloadType = dynamicRTPPayloadType; + + return OO_OK; +} + + + +int ooCapabilityDisableDTMFRFC2833(OOH323CallData *call) +{ + if(!call){ + gH323ep.dtmfmode ^= OO_CAP_DTMF_RFC2833; + OOTRACEINFO1("Disabled RFC2833 DTMF capability for end-point\n"); + } + else{ + call->dtmfmode ^= OO_CAP_DTMF_RFC2833; + OOTRACEINFO3("Disabled RFC2833 DTMF capability for (%s, %s)\n", + call->callType, call->callToken); + } + + return OO_OK; +} + +int ooCapabilityEnableDTMFH245Alphanumeric(OOH323CallData *call) +{ + if(!call){ + gH323ep.dtmfmode |= OO_CAP_DTMF_H245_alphanumeric; + OOTRACEINFO1("Dtmf mode set to H.245(alphanumeric) for endpoint\n"); + } + else { + call->dtmfmode |= OO_CAP_DTMF_H245_alphanumeric; + OOTRACEINFO3("Dtmf mode set to H.245(alphanumeric) for (%s, %s)\n", + call->callType, call->callToken); + } + return OO_OK; +} + +int ooCapabilityDisableDTMFH245Alphanumeric(OOH323CallData *call) +{ + if(!call){ + gH323ep.dtmfmode ^= OO_CAP_DTMF_H245_alphanumeric; + OOTRACEINFO1("Dtmf mode H.245(alphanumeric) disabled for endpoint\n"); + } + else { + call->dtmfmode ^= OO_CAP_DTMF_H245_alphanumeric; + OOTRACEINFO3("Dtmf mode H.245(alphanumeric) disabled for (%s, %s)\n", + call->callType, call->callToken); + } + return OO_OK; +} + +int ooCapabilityEnableDTMFH245Signal(OOH323CallData *call) +{ + if(!call){ + gH323ep.dtmfmode |= OO_CAP_DTMF_H245_signal; + OOTRACEINFO1("Dtmf mode set to H.245(signal) for endpoint\n"); + } + else { + call->dtmfmode |= OO_CAP_DTMF_H245_signal; + OOTRACEINFO3("Dtmf mode set to H.245(signal) for (%s, %s)\n", + call->callType, call->callToken); + } + return OO_OK; +} + +int ooCapabilityDisableDTMFH245Signal(OOH323CallData *call) +{ + if(!call){ + gH323ep.dtmfmode ^= OO_CAP_DTMF_H245_signal; + OOTRACEINFO1("Dtmf mode H.245(signal) disabled for endpoint\n"); + } + else { + call->dtmfmode ^= OO_CAP_DTMF_H245_signal; + OOTRACEINFO3("Dtmf mode H.245(signal) disabled for (%s, %s)\n", + call->callType, call->callToken); + } + return OO_OK; +} + +int ooCapabilityEnableDTMFQ931Keypad(struct OOH323CallData *call) +{ + if(!call){ + gH323ep.dtmfmode |= OO_CAP_DTMF_Q931; + OOTRACEINFO1("Dtmf mode set to Q.931(keypad) for the endpoint\n"); + } + else { + call->dtmfmode |= OO_CAP_DTMF_Q931; + OOTRACEINFO3("Dtmf mode set to Q.931(keypad) for the call (%s, %s)\n", + call->callType, call->callToken); + } + return OO_OK; +} + +int ooCapabilityDisableDTMFQ931Keypad(struct OOH323CallData *call) +{ + if(!call){ + gH323ep.dtmfmode ^= OO_CAP_DTMF_Q931; + OOTRACEINFO1("Dtmf mode Q.931(keypad) disabled for the endpoint\n"); + } + else { + call->dtmfmode ^= OO_CAP_DTMF_Q931; + OOTRACEINFO3("Dtmf mode Q.931(keypad) disabled for the call (%s, %s)\n", + call->callType, call->callToken); + } + return OO_OK; +} + +int ooCapabilityAddH263VideoCapability(ooCallData *call, + unsigned sqcifMPI, unsigned qcifMPI, + unsigned cifMPI, unsigned cif4MPI, + unsigned cif16MPI, unsigned maxBitRate, int dir, + cb_StartReceiveChannel startReceiveChannel, + cb_StartTransmitChannel startTransmitChannel, + cb_StopReceiveChannel stopReceiveChannel, + cb_StopTransmitChannel stopTransmitChannel, + OOBOOL remote) +{ + int ret = OO_OK; + if(sqcifMPI>0) + { + ret = ooCapabilityAddH263VideoCapability_helper(call, sqcifMPI, 0, + 0, 0, 0, maxBitRate, dir, startReceiveChannel, + startTransmitChannel, stopReceiveChannel, + stopTransmitChannel, remote); + if(ret != OO_OK) + { + OOTRACEERR1("Error: Failed to add H263 sqcifMPI capability\n"); + return OO_FAILED; + } + } + if(qcifMPI>0) + { + ret = ooCapabilityAddH263VideoCapability_helper(call, 0, qcifMPI, 0, + 0, 0, maxBitRate, dir, startReceiveChannel, + startTransmitChannel, stopReceiveChannel, + stopTransmitChannel, remote); + if(ret != OO_OK) + { + OOTRACEERR1("Error: Failed to add H263 qcifMPI capability\n"); + return OO_FAILED; + } + } + if(cifMPI>0) + { + ret = ooCapabilityAddH263VideoCapability_helper(call, 0, 0, cifMPI, + 0, 0, maxBitRate, dir, startReceiveChannel, + startTransmitChannel, stopReceiveChannel, + stopTransmitChannel, remote); + if(ret != OO_OK) + { + OOTRACEERR1("Error: Failed to add H263 cifMPI capability\n"); + return OO_FAILED; + } + } + if(cif4MPI>0) + { + ret = ooCapabilityAddH263VideoCapability_helper(call, 0, 0, 0, + cif4MPI, 0, maxBitRate, dir, + startReceiveChannel, + startTransmitChannel, stopReceiveChannel, + stopTransmitChannel, remote); + if(ret != OO_OK) + { + OOTRACEERR1("Error: Failed to add H263 cif4MPI capability\n"); + return OO_FAILED; + } + } + if(cif16MPI>0) + { + ret = ooCapabilityAddH263VideoCapability_helper(call, dir, 0, 0, 0, 0, + cif16MPI, maxBitRate, startReceiveChannel, + startTransmitChannel, stopReceiveChannel, + stopTransmitChannel, remote); + if(ret != OO_OK) + { + OOTRACEERR1("Error: Failed to add H263 cif16MPI capability\n"); + return OO_FAILED; + } + } + return OO_OK; + +} + +int ooCapabilityAddH263VideoCapability_helper(ooCallData *call, + unsigned sqcifMPI, unsigned qcifMPI, + unsigned cifMPI, unsigned cif4MPI, + unsigned cif16MPI, unsigned maxBitRate, int dir, + cb_StartReceiveChannel startReceiveChannel, + cb_StartTransmitChannel startTransmitChannel, + cb_StopReceiveChannel stopReceiveChannel, + cb_StopTransmitChannel stopTransmitChannel, + OOBOOL remote) +{ + + ooH323EpCapability *epCap = NULL, *cur=NULL; + OOH263CapParams *params=NULL; + OOCTXT *pctxt=NULL; + char *pictureType = NULL; + int cap = OO_H263VIDEO; + + if(!call) pctxt = &gH323ep.ctxt; + else pctxt = call->pctxt; + + epCap = (ooH323EpCapability*)memAllocZ(pctxt, sizeof(ooH323EpCapability)); + params = (OOH263CapParams*) memAllocZ(pctxt, sizeof(OOH263CapParams)); + if(!epCap || !params) + { + OOTRACEERR1("Error:Memory - ooCapabilityAddH263Capability - epCap/params" + ".\n"); + return OO_FAILED; + } + + if(sqcifMPI>0) + { + params->MPI = sqcifMPI; + params->picFormat = OO_PICFORMAT_SQCIF; + pictureType = "SQCIF"; + } + if(qcifMPI>0) + { + params->MPI = qcifMPI; + params->picFormat = OO_PICFORMAT_QCIF; + pictureType = "QCIF"; + } + if(cifMPI>0) + { + params->MPI = cifMPI; + params->picFormat = OO_PICFORMAT_CIF; + pictureType = "CIF"; + } + if(cif4MPI>0) + { + params->MPI = cif4MPI; + params->picFormat = OO_PICFORMAT_CIF4; + pictureType = "CIF4"; + } + if(cif16MPI>0) + { + params->MPI = cif16MPI; + params->picFormat = OO_PICFORMAT_CIF16; + pictureType = "CIF16"; + } + + params->maxBitRate = maxBitRate; + + + if(dir & OORXANDTX) + { + epCap->dir = OORX; + epCap->dir |= OOTX; + } + else + epCap->dir = dir; + + epCap->cap = OO_H263VIDEO; + epCap->capType = OO_CAP_TYPE_VIDEO; + epCap->params = (void*)params; + epCap->startReceiveChannel = startReceiveChannel; + epCap->startTransmitChannel = startTransmitChannel; + epCap->stopReceiveChannel = stopReceiveChannel; + epCap->stopTransmitChannel = stopTransmitChannel; + + epCap->next = NULL; + + if(!call) + {/*Add as local capability */ + OOTRACEDBGC2("Adding endpoint H263 video capability %s.\n", pictureType); + if(!gH323ep.myCaps) + gH323ep.myCaps = epCap; + else{ + cur = gH323ep.myCaps; + while(cur->next) cur = cur->next; + cur->next = epCap; + } + ooAppendCapToCapPrefs(NULL, cap); + gH323ep.noOfCaps++; + } + else{ + if(remote) + { + /*Add as remote capability */ + if(!call->remoteCaps) + call->remoteCaps = epCap; + else{ + cur = call->remoteCaps; + while(cur->next) cur = cur->next; + cur->next = epCap; + } + } + else{ + /*Add as our capability */ + OOTRACEDBGC4("Adding call specific H263 video capability %s. " + "(%s, %s)\n", pictureType, call->callType, + call->callToken); + if(!call->ourCaps){ + call->ourCaps = epCap; + ooResetCapPrefs(call); + } + else{ + cur = call->ourCaps; + while(cur->next) cur = cur->next; + cur->next = epCap; + } + ooAppendCapToCapPrefs(call, cap); + } + } + + return OO_OK; +} + +/* Used for g711 ulaw/alaw, g728, g729 and g7231 */ +int ooCapabilityAddSimpleCapability + (OOH323CallData *call, int cap, int txframes, + int rxframes, OOBOOL silenceSuppression, int dir, + cb_StartReceiveChannel startReceiveChannel, + cb_StartTransmitChannel startTransmitChannel, + cb_StopReceiveChannel stopReceiveChannel, + cb_StopTransmitChannel stopTransmitChannel, + OOBOOL remote) +{ + ooH323EpCapability *epCap = NULL, *cur=NULL; + OOCapParams *params=NULL; + OOCTXT *pctxt=NULL; + if(!call) pctxt = &gH323ep.ctxt; + else pctxt = call->pctxt; + + epCap = (ooH323EpCapability*)memAlloc(pctxt, sizeof(ooH323EpCapability)); + params = (OOCapParams*) memAlloc(pctxt, sizeof(OOCapParams)); + if(!epCap || !params) + { + OOTRACEERR1("ERROR: Memory - ooCapabilityAddSimpleCapability - " + "epCap/params\n"); + return OO_FAILED; + } + + + params->txframes = txframes; + params->rxframes = rxframes; + /* Ignore silence suppression parameter unless cap is g7231 */ + if(cap == OO_G7231) + params->silenceSuppression = silenceSuppression; + else + params->silenceSuppression = FALSE; /* Set to false for g711 and g729*/ + + if(dir & OORXANDTX) { + epCap->dir = OORX; + epCap->dir |= OOTX; + } + else { + epCap->dir = dir; + } + + epCap->cap = cap; + epCap->capType = OO_CAP_TYPE_AUDIO; + epCap->params = (void*)params; + epCap->startReceiveChannel = startReceiveChannel; + epCap->startTransmitChannel = startTransmitChannel; + epCap->stopReceiveChannel = stopReceiveChannel; + epCap->stopTransmitChannel = stopTransmitChannel; + epCap->next = NULL; + + if(!call) + { + /* Add as local capability */ + OOTRACEDBGC2("Adding endpoint capability %s. \n", + ooGetCapTypeText(epCap->cap)); + if(!gH323ep.myCaps) { + gH323ep.myCaps = epCap; + } + else{ + cur = gH323ep.myCaps; + while(cur->next) cur = cur->next; + cur->next = epCap; + } + ooAppendCapToCapPrefs(NULL, cap); + gH323ep.noOfCaps++; + } + else{ + if(remote) + { + /* Add as remote capability */ + if(!call->remoteCaps) { + call->remoteCaps = epCap; + } + else{ + cur = call->remoteCaps; + while(cur->next) cur = cur->next; + cur->next = epCap; + } + } + else{ + /* Add as our capability */ + OOTRACEDBGC4("Adding call specific capability %s. (%s, %s)\n", + ooGetCapTypeText(epCap->cap), call->callType, + call->callToken); + if(!call->ourCaps){ + call->ourCaps = epCap; + ooResetCapPrefs(call); + } + else{ + cur = call->ourCaps; + while(cur->next) cur = cur->next; + cur->next = epCap; + } + ooAppendCapToCapPrefs(call, cap); + } + } + + return OO_OK; +} + + +int ooCapabilityAddGSMCapability(OOH323CallData *call, int cap, + unsigned framesPerPkt, OOBOOL comfortNoise, + OOBOOL scrambled, int dir, + cb_StartReceiveChannel startReceiveChannel, + cb_StartTransmitChannel startTransmitChannel, + cb_StopReceiveChannel stopReceiveChannel, + cb_StopTransmitChannel stopTransmitChannel, + OOBOOL remote) +{ + + ooH323EpCapability *epCap = NULL, *cur=NULL; + OOGSMCapParams *params=NULL; + OOCTXT *pctxt = NULL; + + if(!call) pctxt = &gH323ep.ctxt; + else pctxt = call->pctxt; + + epCap = (ooH323EpCapability*)memAlloc(pctxt, sizeof(ooH323EpCapability)); + params = (OOGSMCapParams*) memAlloc(pctxt, sizeof(OOGSMCapParams)); + if(!epCap || !params) + { + OOTRACEERR1("Error:Memory - ooCapabilityAddGSMCapability - " + "epCap/params\n"); + return OO_FAILED; + } + + + params->rxframes = framesPerPkt; + params->txframes = framesPerPkt; + params->comfortNoise = comfortNoise; + params->scrambled = scrambled; + if(dir & OORXANDTX) + { + epCap->dir = OORX; + epCap->dir |= OOTX; + } + else + epCap->dir = dir; + + epCap->cap = cap; + epCap->capType = OO_CAP_TYPE_AUDIO; + epCap->params = (void*)params; + epCap->startReceiveChannel = startReceiveChannel; + epCap->startTransmitChannel = startTransmitChannel; + epCap->stopReceiveChannel = stopReceiveChannel; + epCap->stopTransmitChannel = stopTransmitChannel; + + epCap->next = NULL; + /* Add as local capability */ + if(!call) + { + if(!gH323ep.myCaps) + gH323ep.myCaps = epCap; + else{ + cur = gH323ep.myCaps; + while(cur->next) cur = cur->next; + cur->next = epCap; + } + ooAppendCapToCapPrefs(NULL, cap); + gH323ep.noOfCaps++; + } + else{ + if(remote) + { + /*Add as remote capability */ + if(!call->remoteCaps) + call->remoteCaps = epCap; + else{ + cur = call->remoteCaps; + while(cur->next) cur = cur->next; + cur->next = epCap; + } + } + else{ + OOTRACEDBGC4("Adding call specific capability %s. (%s, %s)\n", + ooGetCapTypeText(epCap->cap), call->callType, + call->callToken); + /*Add as our capability */ + if(!call->ourCaps){ + call->ourCaps = epCap; + ooResetCapPrefs(call); + } + else{ + cur = call->ourCaps; + while(cur->next) cur = cur->next; + cur->next = epCap; + } + ooAppendCapToCapPrefs(call, cap); + } + } + + return OO_OK; +} + + + + +struct H245VideoCapability* ooCapabilityCreateVideoCapability + (ooH323EpCapability *epCap, OOCTXT *pctxt, int dir) +{ + + if(!epCap) + { + OOTRACEERR1("Error:Invalid capability parameter passed to " + "ooCapabilityCreateVideoCapability.\n"); + return NULL; + } + + if(!(epCap->dir & dir)) + { + OOTRACEERR1("Error:Failed to create capability due to direction " + "mismatch.\n"); + return NULL; + } + + switch(epCap->cap) + { + case OO_H263VIDEO: + return ooCapabilityCreateH263VideoCapability(epCap, pctxt, dir); + + case OO_NONSTDVIDEO: + case OO_H261VIDEO: + case OO_H262VIDEO: + case OO_IS11172VIDEO: + case OO_GENERICVIDEO: + case OO_EXTELEMVIDEO: + default: + OOTRACEERR2("ERROR: Don't know how to create video capability %s\n", + ooGetCapTypeText(epCap->cap)); + } + return NULL; +} + + + +struct H245AudioCapability* ooCapabilityCreateAudioCapability + (ooH323EpCapability *epCap, OOCTXT *pctxt, int dir) +{ + + if(!epCap) + { + OOTRACEERR1("Error:Invalid capability parameter passed to " + "ooCapabilityCreateAudioCapability.\n"); + return NULL; + } + + if(!(epCap->dir & dir)) + { + OOTRACEERR1("Error:Failed to create capability due to direction " + "mismatch.\n"); + return NULL; + } + + switch(epCap->cap) + { + case OO_G711ALAW64K: + case OO_G711ALAW56K: + case OO_G711ULAW64K: + case OO_G711ULAW56K: + /*case OO_G726:*/ + case OO_G728: + case OO_G729: + case OO_G729A: + case OO_G7231: + return ooCapabilityCreateSimpleCapability(epCap, pctxt, dir); + case OO_GSMFULLRATE: + return ooCapabilityCreateGSMFullRateCapability(epCap, pctxt, dir); + default: + OOTRACEERR2("ERROR: Don't know how to create audio capability %d\n", + epCap->cap); + } + return NULL; +} + + + +void* ooCapabilityCreateDTMFCapability(int cap, OOCTXT *pctxt) +{ + H245AudioTelephonyEventCapability *pATECap=NULL; + H245UserInputCapability *userInput = NULL; + char *events=NULL; + switch(cap) + { + case OO_CAP_DTMF_RFC2833: + pATECap = (H245AudioTelephonyEventCapability*)memAlloc(pctxt, + sizeof(H245AudioTelephonyEventCapability)); + if(!pATECap) + { + OOTRACEERR1("Error:Memory - ooCapabilityCreateDTMFCapability - pATECap\n"); + return NULL; + } + memset(pATECap, 0, sizeof(H245AudioTelephonyEventCapability)); + pATECap->dynamicRTPPayloadType = giDynamicRTPPayloadType; + events = (char*)memAlloc(pctxt, strlen("0-16")+1); + if(!events) + { + OOTRACEERR1("Error:Memory - ooCapabilityCreateDTMFCapability - events\n"); + memFreePtr(pctxt, pATECap); + return NULL; + } + strncpy(events, "0-16", strlen("0-16")); + pATECap->audioTelephoneEvent = events; + return pATECap; + case OO_CAP_DTMF_H245_alphanumeric: + userInput = (H245UserInputCapability*)memAllocZ(pctxt, + sizeof(H245UserInputCapability)); + if(!userInput) + { + OOTRACEERR1("Error:Memory - ooCapabilityCreateDTMFCapability - " + "userInput\n"); + return NULL; + } + userInput->t = T_H245UserInputCapability_basicString; + return userInput; + case OO_CAP_DTMF_H245_signal: + userInput = (H245UserInputCapability*)memAllocZ(pctxt, + sizeof(H245UserInputCapability)); + if(!userInput) + { + OOTRACEERR1("Error:Memory - ooCapabilityCreateDTMFCapability - " + "userInput\n"); + return NULL; + } + userInput->t = T_H245UserInputCapability_dtmf; + return userInput; + default: + OOTRACEERR1("Error:unknown dtmf capability type\n"); + } + return NULL; +} + + + +struct H245VideoCapability* ooCapabilityCreateH263VideoCapability + (ooH323EpCapability *epCap, OOCTXT* pctxt, int dir) +{ + H245VideoCapability *pVideo=NULL; + OOH263CapParams *params=NULL; + H245H263VideoCapability *pH263Cap=NULL; + + if(!epCap || !epCap->params) + { + OOTRACEERR1("Error:Invalid capability parameters to " + "ooCapabilityCreateH263VideoCapability.\n"); + return NULL; + } + params =(OOH263CapParams*)epCap->params; + + pVideo = (H245VideoCapability*)memAllocZ(pctxt, + sizeof(H245VideoCapability)); + pH263Cap = (H245H263VideoCapability*) memAllocZ(pctxt, + sizeof(H245H263VideoCapability)); + if(!pVideo || !pH263Cap) + { + OOTRACEERR1("ERROR:Memory - ooCapabilityCreateH263VideoCapability - " + "pVideo/pH263Cap\n"); + return NULL; + } + + pVideo->t = T_H245VideoCapability_h263VideoCapability; + pVideo->u.h263VideoCapability = pH263Cap; + + + if(params->picFormat == OO_PICFORMAT_SQCIF) { + pH263Cap->m.sqcifMPIPresent = TRUE; + pH263Cap->sqcifMPI = params->MPI; + } + else if(params->picFormat == OO_PICFORMAT_QCIF) { + pH263Cap->m.qcifMPIPresent = TRUE; + pH263Cap->qcifMPI = params->MPI; + } + else if(params->picFormat == OO_PICFORMAT_CIF) { + pH263Cap->m.cifMPIPresent = TRUE; + pH263Cap->cifMPI = params->MPI; + } + else if(params->picFormat == OO_PICFORMAT_CIF4) { + pH263Cap->m.cif4MPIPresent = TRUE; + pH263Cap->cif4MPI = params->MPI; + } + else if(params->picFormat == OO_PICFORMAT_CIF16) { + pH263Cap->m.cif16MPIPresent = TRUE; + pH263Cap->cif16MPI = params->MPI; + } + + pH263Cap->m.errorCompensationPresent = TRUE; + pH263Cap->maxBitRate = params->maxBitRate; + pH263Cap->unrestrictedVector = FALSE; + pH263Cap->arithmeticCoding = FALSE; + pH263Cap->advancedPrediction = FALSE; + pH263Cap->pbFrames = FALSE; + pH263Cap->temporalSpatialTradeOffCapability = FALSE; + pH263Cap->hrd_B = 0; + pH263Cap->bppMaxKb = 0; + pH263Cap->slowSqcifMPI = FALSE; + pH263Cap->slowQcifMPI = FALSE; + pH263Cap->slowCifMPI = FALSE; + pH263Cap->slowCif4MPI = FALSE; + pH263Cap->slowCif16MPI = FALSE; + pH263Cap->errorCompensation = FALSE; + return pVideo; +} + +struct H245AudioCapability* ooCapabilityCreateGSMFullRateCapability + (ooH323EpCapability *epCap, OOCTXT* pctxt, int dir) +{ + H245AudioCapability *pAudio=NULL; + H245GSMAudioCapability *pGSMCap=NULL; + if(!epCap || !epCap->params) + { + OOTRACEERR1("Error:Invalid capability parameters to " + "ooCapabilityCreateGSMFullRateCapability.\n"); + return NULL; + } + + pAudio = (H245AudioCapability*)memAlloc(pctxt, + sizeof(H245AudioCapability)); + pGSMCap = (H245GSMAudioCapability*)memAlloc(pctxt, + sizeof(H245GSMAudioCapability)); + if(!pAudio || !pGSMCap) + { + OOTRACEERR1("ERROR:Memory - ooCapabilityCreateGSMFullRateCapability - " + "pAudio/pGSMCap\n"); + return NULL; + } + + pAudio->t = T_H245AudioCapability_gsmFullRate; + pAudio->u.gsmFullRate = pGSMCap; + if(dir & OORX) + pGSMCap->audioUnitSize = ((OOGSMCapParams*)epCap->params)->rxframes*OO_GSMFRAMESIZE; + else + pGSMCap->audioUnitSize = ((OOGSMCapParams*)epCap->params)->txframes*OO_GSMFRAMESIZE; + + pGSMCap->comfortNoise = ((OOGSMCapParams*)epCap->params)->comfortNoise; + pGSMCap->scrambled = ((OOGSMCapParams*)epCap->params)->scrambled; + + return pAudio; +} + +/* This is used for g711 ulaw/alaw, g728, g729, g729A, g7231*/ +struct H245AudioCapability* ooCapabilityCreateSimpleCapability + (ooH323EpCapability *epCap, OOCTXT* pctxt, int dir) +{ + H245AudioCapability *pAudio=NULL; + OOCapParams *params; + if(!epCap || !epCap->params) + { + OOTRACEERR1("Error:Invalid capability parameters to " + "ooCapabilityCreateSimpleCapability.\n"); + return NULL; + } + params =(OOCapParams*)epCap->params; + pAudio = (H245AudioCapability*)memAlloc(pctxt, + sizeof(H245AudioCapability)); + if(!pAudio) + { + OOTRACEERR1("ERROR:Memory - ooCapabilityCreateSimpleCapability - pAudio\n"); + return NULL; + } + + + switch(epCap->cap) + { + case OO_G711ALAW64K: + pAudio->t = T_H245AudioCapability_g711Alaw64k; + if(dir & OORX) + pAudio->u.g711Alaw64k = params->rxframes; + else + pAudio->u.g711Alaw64k = params->txframes; + return pAudio; + case OO_G711ALAW56K: + pAudio->t = T_H245AudioCapability_g711Alaw56k; + if(dir & OORX) + pAudio->u.g711Alaw56k = params->rxframes; + else + pAudio->u.g711Alaw56k = params->txframes; + return pAudio; + case OO_G711ULAW64K: + pAudio->t = T_H245AudioCapability_g711Ulaw64k; + if(dir & OORX) + pAudio->u.g711Ulaw64k = params->rxframes; + else + pAudio->u.g711Ulaw64k = params->txframes; + return pAudio; + case OO_G711ULAW56K: + pAudio->t = T_H245AudioCapability_g711Ulaw56k; + if(dir & OORX) + pAudio->u.g711Ulaw56k = params->rxframes; + else + pAudio->u.g711Ulaw64k = params->txframes; + return pAudio; + /*case OO_G726: + pAudio->t = T_H245AudioCapability_g726; + if(dir & OORX) + pAudio->u.g726 = params->rxframes; + else + pAudio->u.g726 = params->txframes; + return pAudio;*/ + case OO_G728: + pAudio->t = T_H245AudioCapability_g728; + if(dir & OORX) + pAudio->u.g728 = params->rxframes; + else + pAudio->u.g728 = params->txframes; + return pAudio; + case OO_G729: + pAudio->t = T_H245AudioCapability_g729; + if(dir & OORX) + pAudio->u.g729 = params->rxframes; + else + pAudio->u.g729 = params->txframes; + return pAudio; + case OO_G729A: + pAudio->t = T_H245AudioCapability_g729AnnexA; + if(dir & OORX) + pAudio->u.g729AnnexA = params->rxframes; + else + pAudio->u.g729AnnexA = params->txframes; + return pAudio; + case OO_G7231: + pAudio->t = T_H245AudioCapability_g7231; + pAudio->u.g7231 = (H245AudioCapability_g7231*)memAlloc(pctxt, + sizeof(H245AudioCapability_g7231)); + if(!pAudio->u.g7231) + { + OOTRACEERR1("Error:Memory - ooCapabilityCreateSimpleCapability - g7231\n"); + memFreePtr(pctxt, pAudio); + return NULL; + } + pAudio->u.g7231->silenceSuppression = params->silenceSuppression; + if(dir & OORX) + pAudio->u.g7231->maxAl_sduAudioFrames = params->rxframes; + else + pAudio->u.g7231->maxAl_sduAudioFrames = params->txframes; + return pAudio; + + default: + OOTRACEERR2("ERROR: Don't know how to create audio capability %d\n", + epCap->cap); + } + return NULL; +} + +/* Used for g711 ulaw/alaw, g728, g729, g729a, g7231 */ +ASN1BOOL ooCapabilityCheckCompatibility_Simple + (OOH323CallData *call, ooH323EpCapability* epCap, + H245AudioCapability* audioCap, int dir) +{ + int noofframes=0, cap; + + OOTRACEDBGC2("Comparing channel with codec type: %d\n", audioCap->t); + + switch(audioCap->t) + { + case T_H245AudioCapability_g711Ulaw56k: + cap = OO_G711ULAW56K; + noofframes = audioCap->u.g711Ulaw56k; + break; + case T_H245AudioCapability_g711Ulaw64k: + cap = OO_G711ULAW64K; + noofframes = audioCap->u.g711Ulaw64k; + break; + case T_H245AudioCapability_g711Alaw64k: + cap = OO_G711ALAW64K; + noofframes = audioCap->u.g711Alaw64k; + break; + case T_H245AudioCapability_g711Alaw56k: + cap = OO_G711ALAW56K; + noofframes = audioCap->u.g711Alaw56k; + break; + /*case T_H245AudioCapability_g726: + cap = OO_G726; + noofframes = audioCap->u.g726; + break;*/ + case T_H245AudioCapability_g728: + cap = OO_G728; + noofframes = audioCap->u.g728; + break; + case T_H245AudioCapability_g729: + cap = OO_G729; + noofframes = audioCap->u.g729; + break; + case T_H245AudioCapability_g729AnnexA: + cap = OO_G729A; + noofframes = audioCap->u.g729AnnexA; + break; + case T_H245AudioCapability_g7231: + cap = OO_G7231; + noofframes = audioCap->u.g7231->maxAl_sduAudioFrames; + break; + default: + return FALSE; + } + + OOTRACEDBGC3("Comparing codecs: current=%d, requested=%d\n", + epCap->cap, cap); + if(cap != epCap->cap) { return FALSE; } + + /* Can we receive this capability */ + if(dir & OORX) + { + OOTRACEDBGC3("Comparing RX frame rate: channel's=%d, requested=%d\n", + ((OOCapParams*)epCap->params)->rxframes, noofframes); + if(((OOCapParams*)epCap->params)->rxframes >= noofframes) { + return TRUE; + } + //else { + // not supported, as already told other ep our max. receive rate + // our ep can't receive more rate than it + // return FALSE; + //} + } + + /* Can we transmit compatible stream */ + if(dir & OOTX) + { + OOTRACEDBGC3("Comparing TX frame rate: channel's=%d, requested=%d\n", + ((OOCapParams*)epCap->params)->txframes, noofframes); + if(((OOCapParams*)epCap->params)->txframes <= noofframes) { + return TRUE; + } + //else { + // TODO: reduce our ep transmission rate, as peer EP has low receive + // cap, than return TRUE + //} + } + return FALSE; + +} + + +OOBOOL ooCapabilityCheckCompatibility_GSM + (OOH323CallData *call, ooH323EpCapability* epCap, + H245AudioCapability* audioCap, int dir) +{ + unsigned noofframes=0, cap; + switch(audioCap->t) + { + case T_H245AudioCapability_gsmFullRate: + cap = OO_GSMFULLRATE; + noofframes = (audioCap->u.gsmFullRate->audioUnitSize)/OO_GSMFRAMESIZE; + break; + case T_H245AudioCapability_gsmHalfRate: + cap = OO_GSMHALFRATE; + noofframes = (audioCap->u.gsmHalfRate->audioUnitSize)/OO_GSMFRAMESIZE; + break; + case T_H245AudioCapability_gsmEnhancedFullRate: + cap = OO_GSMENHANCEDFULLRATE; + noofframes = (audioCap->u.gsmEnhancedFullRate->audioUnitSize)/OO_GSMFRAMESIZE; + break; + default: + return FALSE; + } + + /* can we receive this capability */ + if(dir & OORX) + { + if(((OOGSMCapParams*)epCap->params)->rxframes >= noofframes) + return TRUE; + } + + /* Make sure we transmit compatible stream */ + if(dir & OOTX) + { + if(((OOGSMCapParams*)epCap->params)->txframes > noofframes){ + OOTRACEDBGA5("Reducing txframes for GSM from %d to %d to match " + "receive capability of remote end.(%s, %s)\n", + ((OOGSMCapParams*)epCap->params)->txframes, noofframes, + call->callType, call->callToken); + ((OOGSMCapParams*)epCap->params)->txframes = noofframes; + } + return TRUE; + } + return FALSE; + +} + + +OOBOOL ooCapabilityCheckCompatibility_H263Video + (struct OOH323CallData *call, ooH323EpCapability *epCap, + H245VideoCapability *pVideoCap, int dir) +{ + H245H263VideoCapability *pH263Cap = NULL; + + OOH263CapParams *params = epCap->params; + if(!pVideoCap->u.h263VideoCapability) + { + OOTRACEERR3("Error:No H263 video capability present in video capability" + "structure. (%s, %s)\n", call->callType, call->callToken); + return FALSE; + } + pH263Cap = pVideoCap->u.h263VideoCapability; + + /* can we receive/transmit this capability */ + if(OORX & dir) + { + if(pH263Cap->m.sqcifMPIPresent) + { + if(params->picFormat != OO_PICFORMAT_SQCIF) + { + return FALSE; + } + else{ + if(pH263Cap->sqcifMPI >= params->MPI) + return TRUE; + else + return FALSE; + } + } + if(pH263Cap->m.qcifMPIPresent) + { + if(params->picFormat != OO_PICFORMAT_QCIF) + { + return FALSE; + } + else{ + if(pH263Cap->qcifMPI >= params->MPI) + return TRUE; + else + return FALSE; + } + } + if(pH263Cap->m.cifMPIPresent) + { + if(params->picFormat != OO_PICFORMAT_CIF) + { + return FALSE; + } + else{ + if(pH263Cap->cifMPI >= params->MPI) + return TRUE; + else + return FALSE; + } + } + if(pH263Cap->m.cif4MPIPresent) + { + if(params->picFormat != OO_PICFORMAT_CIF4) + { + return FALSE; + } + else{ + if(pH263Cap->cif4MPI >= params->MPI) + return TRUE; + else + return FALSE; + } + } + if(pH263Cap->m.cif16MPIPresent) + { + if(params->picFormat != OO_PICFORMAT_CIF16) + { + return FALSE; + } + else{ + if(pH263Cap->cif16MPI >= params->MPI) + return TRUE; + else + return FALSE; + } + } + } + + /* Can we transmit */ + if(OOTX & dir) + { + if(pH263Cap->m.sqcifMPIPresent) + { + if(params->picFormat != OO_PICFORMAT_SQCIF) + { + return FALSE; + } + else{ + if(pH263Cap->sqcifMPI <= params->MPI) + return TRUE; + else + return FALSE; + } + } + if(pH263Cap->m.qcifMPIPresent) + { + if(params->picFormat != OO_PICFORMAT_QCIF) + { + return FALSE; + } + else{ + if(pH263Cap->qcifMPI <= params->MPI) + return TRUE; + else + return FALSE; + } + } + if(pH263Cap->m.cifMPIPresent) + { + if(params->picFormat != OO_PICFORMAT_CIF) + { + return FALSE; + } + else{ + if(pH263Cap->cifMPI <= params->MPI) + return TRUE; + else + return FALSE; + } + } + if(pH263Cap->m.cif4MPIPresent) + { + if(params->picFormat != OO_PICFORMAT_CIF4) + { + return FALSE; + } + else{ + if(pH263Cap->cif4MPI <= params->MPI) + return TRUE; + else + return FALSE; + } + } + if(pH263Cap->m.cif16MPIPresent) + { + if(params->picFormat != OO_PICFORMAT_CIF16) + { + return FALSE; + } + else{ + if(pH263Cap->cif16MPI <= params->MPI) + return TRUE; + else + return FALSE; + } + } + } + + return FALSE; + +} + + +OOBOOL ooCapabilityCheckCompatibility_Audio + (OOH323CallData *call, ooH323EpCapability* epCap, + H245AudioCapability* audioCap, int dir) +{ + + switch(audioCap->t) + { + case T_H245AudioCapability_g711Ulaw56k: + case T_H245AudioCapability_g711Ulaw64k: + case T_H245AudioCapability_g711Alaw64k: + case T_H245AudioCapability_g711Alaw56k: + /*case T_H245AudioCapability_g726:*/ + case T_H245AudioCapability_g728: + case T_H245AudioCapability_g729: + case T_H245AudioCapability_g729AnnexA: + case T_H245AudioCapability_g7231: + return ooCapabilityCheckCompatibility_Simple(call, epCap, audioCap, dir); + case T_H245AudioCapability_gsmFullRate: + return ooCapabilityCheckCompatibility_GSM(call, epCap, audioCap, dir); + default: + return FALSE; + } + + return FALSE; +} + +OOBOOL ooCapabilityCheckCompatibility_Video + (OOH323CallData *call, ooH323EpCapability* epCap, + H245VideoCapability* videoCap, int dir) +{ + switch(videoCap->t) + { + case T_H245VideoCapability_h263VideoCapability: + return ooCapabilityCheckCompatibility_H263Video(call, epCap, + videoCap, dir); + default: + OOTRACEDBGC3("ooCapabilityCheckCompatibility_Video - Unsupported video " + "capability. (%s, %s)\n", call->callType, call->callToken); + } + return FALSE; +} +/* + Note: In faststart if we sent transmit rate (x>y) and remote + can receive only y, then we can't reduce our transmit rate +*/ +OOBOOL ooCapabilityCheckCompatibility + (struct OOH323CallData *call, ooH323EpCapability* epCap, + H245DataType* dataType, int dir) +{ + switch(dataType->t) + { + case T_H245DataType_audioData: + if(epCap->capType == OO_CAP_TYPE_AUDIO) + return ooCapabilityCheckCompatibility_Audio(call, epCap, + dataType->u.audioData, dir); + break; + case T_H245DataType_videoData: + if(epCap->capType == OO_CAP_TYPE_VIDEO) + return ooCapabilityCheckCompatibility_Video(call, epCap, + dataType->u.videoData, dir); + break; + case T_H245DataType_data: + default: + OOTRACEDBGC3("ooCapabilityCheckCompatibility - Unsupported " + "capability. (%s, %s)\n", call->callType, call->callToken); + } + + return FALSE; +} + +#if 0 +/** + TODO: If txCap is local and number of txframes is greater than remote can + receive, we should automatically decrease it. And logical channel cap should + be the one where it should be decreased. The start logical channel will + indicate the application that it is supposed to tx and a reduced rate. + */ +ASN1BOOL ooCheckCompatibility + (OOH323CallData *call, ooH323EpCapability *txCap, ooH323EpCapability *rxCap) +{ + + if(txCap->cap != rxCap->cap) return FALSE; + + if(!(txCap->dir & OOTX)) return FALSE; + + if(!(rxCap->dir & OORX)) return FALSE; + + switch(txCap->cap) + { + case OO_G711ALAW64K: + case OO_G711ALAW56K: + case OO_G711ULAW64K: + case OO_G711ULAW56K: + /*case OO_G726:*/ + case OO_G728: + case OO_G729: + case OO_G729A: + case OO_G7231: + if(((OOCapParams*)txCap->params)->txframes <= + ((OOCapParams*)rxCap->params)->rxframes) + return TRUE; + else{ + OOTRACEDBGA4("Simple caps %s are not compatible.(%s, %s)\n", + ooGetCapTypeText(txCap->cap), call->callType, + call->callToken); + return FALSE; + } + case OO_GSMFULLRATE: + case OO_GSMHALFRATE: + case OO_GSMENHANCEDFULLRATE: + if(((OOGSMCapParams*)txCap->params)->txframes <= + ((OOGSMCapParams*)rxCap->params)->rxframes) + return TRUE; + else{ + OOTRACEDBGA3("GSM caps are not compatible. (%s, %s)\n", call->callType, + call->callToken); + return FALSE; + } + default: + OOTRACEWARN3("WARN: Unsupported capabilities being compared. (%s, %s)\n", + call->callType, call->callToken); + } + return FALSE; + +} + +#endif + +ooH323EpCapability* ooIsAudioDataTypeGSMSupported + (OOH323CallData *call, H245AudioCapability* audioCap, int dir) +{ + unsigned framesPerPkt=0; + int cap=0; + ooH323EpCapability *cur = NULL, *epCap=NULL; + OOGSMCapParams *params = NULL; + + switch(audioCap->t) + { + case T_H245AudioCapability_gsmFullRate: + framesPerPkt = (audioCap->u.gsmFullRate->audioUnitSize)/OO_GSMFRAMESIZE; + cap = OO_GSMFULLRATE; + break; + case T_H245AudioCapability_gsmHalfRate: + framesPerPkt = (audioCap->u.gsmHalfRate->audioUnitSize)/OO_GSMFRAMESIZE; + cap = OO_GSMHALFRATE; + break; + case T_H245AudioCapability_gsmEnhancedFullRate: + framesPerPkt = (audioCap->u.gsmEnhancedFullRate->audioUnitSize)/OO_GSMFRAMESIZE; + cap = OO_GSMENHANCEDFULLRATE; + break; + default: + OOTRACEERR3("Error:Invalid GSM capability type.(%s, %s)\n", + call->callType, call->callToken); + return NULL; + } + + OOTRACEDBGC4("Determined audio data type to be of type %d. Searching" + " for matching capability.(%s, %s)\n", cap, call->callType, + call->callToken); + + /* If we have call specific caps then we use them, otherwise we use + general endpoint caps*/ + if(call->ourCaps) + cur = call->ourCaps; + else + cur = gH323ep.myCaps; + + while(cur) + { + OOTRACEDBGC4("Local cap being compared %d. (%s, %s)\n", cur->cap, + call->callType, call->callToken); + + if(cur->cap == cap && (cur->dir & dir)) + break; + cur = cur->next; + } + + if(!cur) return NULL; + + OOTRACEDBGC4("Found matching audio capability type %d. Comparing" + " other parameters. (%s, %s)\n", cap, call->callType, + call->callToken); + + /* can we receive this capability */ + if(dir & OORX) + { + if(((OOGSMCapParams*)cur->params)->rxframes < framesPerPkt) + return NULL; + else{ + epCap = (ooH323EpCapability*)memAlloc(call->pctxt, + sizeof(ooH323EpCapability)); + params =(OOGSMCapParams*)memAlloc(call->pctxt,sizeof(OOGSMCapParams)); + if(!epCap || !params) + { + OOTRACEERR3("Error:Memory - ooIsAudioDataTypeGSMSupported - " + "epCap/params (%s, %s)\n", call->callType, + call->callToken); + return NULL; + } + epCap->params = params; + epCap->cap = cur->cap; + epCap->dir = cur->dir; + epCap->capType = cur->capType; + epCap->startReceiveChannel = cur->startReceiveChannel; + epCap->startTransmitChannel= cur->startTransmitChannel; + epCap->stopReceiveChannel = cur->stopReceiveChannel; + epCap->stopTransmitChannel = cur->stopTransmitChannel; + epCap->next = NULL; + memcpy(epCap->params, cur->params, sizeof(OOGSMCapParams)); + return epCap; + } + } + + /* Can we transmit compatible stream */ + if(dir & OOTX) + { + epCap = (ooH323EpCapability*)memAlloc(call->pctxt, + sizeof(ooH323EpCapability)); + params =(OOGSMCapParams*)memAlloc(call->pctxt,sizeof(OOGSMCapParams)); + if(!epCap || !params) + { + OOTRACEERR3("Error:Memory - ooIsAudioDataTypeGSMSupported - " + "epCap/params (%s, %s)\n", call->callType, + call->callToken); + return NULL; + } + epCap->params = params; + epCap->cap = cur->cap; + epCap->dir = cur->dir; + epCap->capType = cur->capType; + epCap->startReceiveChannel = cur->startReceiveChannel; + epCap->startTransmitChannel= cur->startTransmitChannel; + epCap->stopReceiveChannel = cur->stopReceiveChannel; + epCap->stopTransmitChannel = cur->stopTransmitChannel; + epCap->next = NULL; + memcpy(epCap->params, cur->params, sizeof(OOGSMCapParams)); + if(params->txframes > framesPerPkt) + { + OOTRACEINFO5("Reducing framesPerPkt for transmission of GSM " + "capability from %d to %d to match receive capability of" + " remote endpoint.(%s, %s)\n", params->txframes, + framesPerPkt, call->callType, call->callToken); + params->txframes = framesPerPkt; + } + + return epCap; + + } + return NULL; + +} + +/* used for g711 ulaw/alaw, g728, g729, g729a, g7231 */ +ooH323EpCapability* ooIsAudioDataTypeSimpleSupported + (OOH323CallData *call, H245AudioCapability* audioCap, int dir) +{ + int cap, framesPerPkt=0; + ooH323EpCapability *cur=NULL, *epCap=NULL; + OOCapParams * params= NULL; + + /* Find similar capability */ + switch(audioCap->t) + { + case T_H245AudioCapability_g711Alaw64k: + framesPerPkt = audioCap->u.g711Alaw64k; + cap = OO_G711ALAW64K; + break; + case T_H245AudioCapability_g711Alaw56k: + framesPerPkt = audioCap->u.g711Alaw56k; + cap = OO_G711ALAW56K; + break; + case T_H245AudioCapability_g711Ulaw56k: + framesPerPkt = audioCap->u.g711Ulaw56k; + cap = OO_G711ULAW56K; + break; + case T_H245AudioCapability_g711Ulaw64k: + framesPerPkt = audioCap->u.g711Ulaw64k; + cap = OO_G711ULAW64K; + break; + +/* case T_H245AudioCapability_g726: + framesPerPkt = audioCap->u.g726; + cap = OO_G726; + break; +*/ + case T_H245AudioCapability_g728: + framesPerPkt = audioCap->u.g728; + cap = OO_G728; + break; + + case T_H245AudioCapability_g729: + framesPerPkt = audioCap->u.g729; + cap = OO_G729; + break; + case T_H245AudioCapability_g729AnnexA: + framesPerPkt = audioCap->u.g729AnnexA; + cap = OO_G729A; + break; + case T_H245AudioCapability_g7231: + framesPerPkt = audioCap->u.g7231->maxAl_sduAudioFrames; + cap = OO_G7231; + break; + default: + return NULL; + } + + OOTRACEDBGC4("Determined Simple audio data type to be of type %s. Searching" + " for matching capability.(%s, %s)\n", + ooGetCapTypeText(cap), call->callType, call->callToken); + + /* If we have call specific caps, we use them; otherwise use general + endpoint caps + */ + if(call->ourCaps) + cur = call->ourCaps; + else + cur = gH323ep.myCaps; + + while(cur) + { + OOTRACEDBGC4("Local cap being compared %s. (%s, %s)\n", + ooGetCapTypeText(cur->cap),call->callType, call->callToken); + + if(cur->cap == cap && (cur->dir & dir)) + break; + cur = cur->next; + } + + if(!cur) return NULL; + + OOTRACEDBGC4("Found matching simple audio capability type %s. Comparing" + " other parameters. (%s, %s)\n", ooGetCapTypeText(cap), + call->callType, call->callToken); + + /* can we receive this capability */ + if(dir & OORX) + { + if(((OOCapParams*)cur->params)->rxframes < framesPerPkt) + return NULL; + else{ + OOTRACEDBGC4("We can receive Simple capability %s. (%s, %s)\n", + ooGetCapTypeText(cur->cap), call->callType, + call->callToken); + epCap = (ooH323EpCapability*)memAlloc(call->pctxt, + sizeof(ooH323EpCapability)); + params=(OOCapParams*)memAlloc(call->pctxt,sizeof(OOCapParams)); + if(!epCap || !params) + { + OOTRACEERR3("Error:Memory - ooIsAudioDataTypeSimpleSupported - " + "epCap/params (%s, %s)\n", call->callType, + call->callToken); + return NULL; + } + epCap->params = params; + epCap->cap = cur->cap; + epCap->dir = cur->dir; + epCap->capType = cur->capType; + epCap->startReceiveChannel = cur->startReceiveChannel; + epCap->startTransmitChannel= cur->startTransmitChannel; + epCap->stopReceiveChannel = cur->stopReceiveChannel; + epCap->stopTransmitChannel = cur->stopTransmitChannel; + epCap->next = NULL; + memcpy(epCap->params, cur->params, sizeof(OOCapParams)); + OOTRACEDBGC4("Returning copy of matched receive capability %s. " + "(%s, %s)\n", + ooGetCapTypeText(cur->cap), call->callType, + call->callToken); + return epCap; + } + } + + /* Can we transmit compatible stream */ + if(dir & OOTX) + { + OOTRACEDBGC4("We can transmit Simple capability %s. (%s, %s)\n", + ooGetCapTypeText(cur->cap), call->callType, + call->callToken); + epCap = (ooH323EpCapability*)memAlloc(call->pctxt, + sizeof(ooH323EpCapability)); + params =(OOCapParams*)memAlloc(call->pctxt,sizeof(OOCapParams)); + if(!epCap || !params) + { + OOTRACEERR3("Error:Memory - ooIsAudioDataTypeSimpleSupported - " + "epCap/params (%s, %s)\n", call->callType, + call->callToken); + return NULL; + } + epCap->params = params; + epCap->cap = cur->cap; + epCap->dir = cur->dir; + epCap->capType = cur->capType; + epCap->startReceiveChannel = cur->startReceiveChannel; + epCap->startTransmitChannel= cur->startTransmitChannel; + epCap->stopReceiveChannel = cur->stopReceiveChannel; + epCap->stopTransmitChannel = cur->stopTransmitChannel; + epCap->next = NULL; + memcpy(epCap->params, cur->params, sizeof(OOCapParams)); + if(params->txframes > framesPerPkt) + { + OOTRACEINFO5("Reducing framesPerPkt for transmission of Simple " + "capability from %d to %d to match receive capability of" + " remote endpoint.(%s, %s)\n", params->txframes, + framesPerPkt, call->callType, call->callToken); + params->txframes = framesPerPkt; + } + OOTRACEDBGC4("Returning copy of matched transmit capability %s." + "(%s, %s)\n", + ooGetCapTypeText(cur->cap), call->callType, + call->callToken); + return epCap; + } + return NULL; +} + + + +ooH323EpCapability* ooIsAudioDataTypeSupported + (OOH323CallData *call, H245AudioCapability* audioCap, int dir) +{ + /* Find similar capability */ + switch(audioCap->t) + { + case T_H245AudioCapability_g711Alaw64k: + case T_H245AudioCapability_g711Alaw56k: + case T_H245AudioCapability_g711Ulaw56k: + case T_H245AudioCapability_g711Ulaw64k: + /*case T_H245AudioCapability_g726:*/ + case T_H245AudioCapability_g728: + case T_H245AudioCapability_g729: + case T_H245AudioCapability_g729AnnexA: + case T_H245AudioCapability_g7231: + return ooIsAudioDataTypeSimpleSupported(call, audioCap, dir); + case T_H245AudioCapability_gsmFullRate: + case T_H245AudioCapability_gsmHalfRate: + case T_H245AudioCapability_gsmEnhancedFullRate: + return ooIsAudioDataTypeGSMSupported(call, audioCap, dir); + default: + return NULL; + } +} + + +ooH323EpCapability* ooIsVideoDataTypeH263Supported + (OOH323CallData *call, H245H263VideoCapability* pH263Cap, int dir, + OOPictureFormat picFormat) +{ + int cap; + ooH323EpCapability *cur=NULL, *epCap=NULL; + OOH263CapParams *params= NULL; + char *pictureType=NULL; + unsigned mpi=0; + cap = OO_H263VIDEO; + + if(picFormat == OO_PICFORMAT_SQCIF && pH263Cap->m.sqcifMPIPresent) + { + pictureType = "SQCIF"; + mpi = pH263Cap->sqcifMPI; + } + if(picFormat == OO_PICFORMAT_QCIF && pH263Cap->m.qcifMPIPresent) + { + pictureType = "QCIF"; + mpi = pH263Cap->qcifMPI; + } + if(picFormat == OO_PICFORMAT_CIF && pH263Cap->m.cifMPIPresent) + { + pictureType = "CIF"; + mpi = pH263Cap->cifMPI; + } + if(picFormat == OO_PICFORMAT_CIF4 && pH263Cap->m.cif4MPIPresent) + { + pictureType = "CIF4"; + mpi = pH263Cap->cif4MPI; + } + if(picFormat == OO_PICFORMAT_CIF16 && pH263Cap->m.cif16MPIPresent) + { + pictureType = "CIF16"; + mpi = pH263Cap->cif16MPI; + } + + + OOTRACEDBGA4("Looking for H263 video capability(%s). (%s, %s)\n", + pictureType, call->callType, call->callToken); + + /* If we have call specific caps, we use them; otherwise use general + endpoint caps + */ + if(call->ourCaps) + cur = call->ourCaps; + else + cur = gH323ep.myCaps; + + while(cur) + { + OOTRACEDBGC4("Local cap being compared %s. (%s, %s)\n", + ooGetCapTypeText(cur->cap),call->callType, call->callToken); + + if(cur->cap == cap && (cur->dir & dir)) + { + if(((OOH263CapParams*)cur->params)->picFormat == picFormat) + break; + } + cur = cur->next; + } + + if(!cur) return NULL; + + OOTRACEDBGC4("Found matching H.263 video capability type %s. Comparing" + " other parameters. (%s, %s)\n", ooGetCapTypeText(cap), + call->callType, call->callToken); + if(dir & OORX) + { + if(mpi < ((OOH263CapParams*)cur->params)->MPI) + return NULL; + else{ + epCap = (ooH323EpCapability*)memAlloc(call->pctxt, + sizeof(ooH323EpCapability)); + params = (OOH263CapParams*) memAlloc(call->pctxt, + sizeof(OOH263CapParams)); + if(!epCap || !params) + { + OOTRACEERR3("Error:Memory - ooIsVideoDataTypeH263Supported - " + "epCap/params. (%s, %s)\n", call->callType, + call->callToken); + return NULL; + } + epCap->params = params; + epCap->cap = cur->cap; + epCap->dir = cur->dir; + epCap->capType = cur->capType; + epCap->startReceiveChannel = cur->startReceiveChannel; + epCap->startTransmitChannel= cur->startTransmitChannel; + epCap->stopReceiveChannel = cur->stopReceiveChannel; + epCap->stopTransmitChannel = cur->stopTransmitChannel; + epCap->next = NULL; + memcpy(epCap->params, cur->params, sizeof(OOH263CapParams)); + OOTRACEDBGC4("Returning copy of matched receive capability %s. " + "(%s, %s)\n", ooGetCapTypeText(cur->cap), call->callType, + call->callToken); + return epCap; + } + } + if(dir & OOTX) + { + epCap = (ooH323EpCapability*)memAlloc(call->pctxt, + sizeof(ooH323EpCapability)); + params = (OOH263CapParams*) memAlloc(call->pctxt, + sizeof(OOH263CapParams)); + if(!epCap || !params) + { + OOTRACEERR3("Error:Memory - ooIsVideoDataTypeH263Supported - " + "epCap/params. (%s, %s)\n", call->callType, + call->callToken); + return NULL; + } + epCap->params = params; + epCap->cap = cur->cap; + epCap->dir = cur->dir; + epCap->capType = cur->capType; + epCap->startReceiveChannel = cur->startReceiveChannel; + epCap->startTransmitChannel= cur->startTransmitChannel; + epCap->stopReceiveChannel = cur->stopReceiveChannel; + epCap->stopTransmitChannel = cur->stopTransmitChannel; + epCap->next = NULL; + memcpy(epCap->params, cur->params, sizeof(OOH263CapParams)); + if(params->MPI < mpi) + { + OOTRACEINFO5("Increasing minimum picture interval for transmission of" + " H263 video capability from %d to %d to match receive " + "capability of remote endpoint.(%s, %s)\n", params->MPI, + mpi, call->callType, call->callToken); + params->MPI = mpi; + } + OOTRACEDBGC4("Returning copy of matched receive capability %s. " + "(%s, %s)\n", ooGetCapTypeText(cur->cap), call->callType, + call->callToken); + return epCap; + } + return NULL; + +} + +ooH323EpCapability* ooIsVideoDataTypeSupported + (OOH323CallData *call, H245VideoCapability* pVideoCap, int dir) +{ + switch(pVideoCap->t) + { + case T_H245VideoCapability_h263VideoCapability: + if(pVideoCap->u.h263VideoCapability->m.sqcifMPIPresent) + return ooIsVideoDataTypeH263Supported(call, + pVideoCap->u.h263VideoCapability, dir, OO_PICFORMAT_SQCIF); + else if(pVideoCap->u.h263VideoCapability->m.qcifMPIPresent) + return ooIsVideoDataTypeH263Supported(call, + pVideoCap->u.h263VideoCapability, dir, OO_PICFORMAT_QCIF); + else if(pVideoCap->u.h263VideoCapability->m.cifMPIPresent) + return ooIsVideoDataTypeH263Supported(call, + pVideoCap->u.h263VideoCapability, dir, OO_PICFORMAT_CIF); + else if(pVideoCap->u.h263VideoCapability->m.cif4MPIPresent) + return ooIsVideoDataTypeH263Supported(call, + pVideoCap->u.h263VideoCapability, dir, OO_PICFORMAT_CIF4); + else if(pVideoCap->u.h263VideoCapability->m.cif16MPIPresent) + return ooIsVideoDataTypeH263Supported(call, + pVideoCap->u.h263VideoCapability, dir, OO_PICFORMAT_CIF16); + break; + case T_H245VideoCapability_nonStandard: + case T_H245VideoCapability_h261VideoCapability: + case T_H245VideoCapability_h262VideoCapability: + case T_H245VideoCapability_is11172VideoCapability: + case T_H245VideoCapability_genericVideoCapability: + case T_H245VideoCapability_extElem1: + default: + OOTRACEDBGA1("Unsupported video capability type in " + "ooIsVideoDataTypeSupported\n"); + return NULL; + } + return NULL; +} + +ooH323EpCapability* ooIsDataTypeSupported + (OOH323CallData *call, H245DataType *data, int dir) +{ + OOTRACEDBGC3("Looking for data type support. (%s, %s)\n", call->callType, + call->callToken); + + switch(data->t) + { + case T_H245DataType_nonStandard: + OOTRACEDBGC3("NonStandard data type not supported.(%s, %s)\n", + call->callType, call->callToken); + return NULL; + case T_H245DataType_nullData: + OOTRACEDBGC3("Null data type not supported.(%s, %s)\n", + call->callType, call->callToken); + return NULL; + case T_H245DataType_videoData: + OOTRACEDBGC3("Looking for video dataType support. (%s, %s)\n", + call->callType, call->callToken); + return ooIsVideoDataTypeSupported(call, data->u.videoData, dir); + case T_H245DataType_audioData: + OOTRACEDBGC3("Looking for audio dataType support. (%s, %s)\n", + call->callType, call->callToken); + return ooIsAudioDataTypeSupported(call, data->u.audioData, dir); + case T_H245DataType_data: + OOTRACEDBGC3("Data type not supported.(%s, %s)\n", + call->callType, call->callToken); + return NULL; + case T_H245DataType_encryptionData: + OOTRACEDBGC3("Encryption data type not supported.(%s, %s)\n", + call->callType, call->callToken); + return NULL; + case T_H245DataType_h235Control: + return NULL; + case T_H245DataType_h235Media: + return NULL; + case T_H245DataType_multiplexedStream: + return NULL; + default: + OOTRACEINFO3("Unknown data type (%s, %s)\n", call->callType, + call->callToken); + } + return NULL; +} + +int ooResetCapPrefs(OOH323CallData *call) +{ + OOCapPrefs *capPrefs=NULL; + if(call) + capPrefs = &call->capPrefs; + else + capPrefs = &gH323ep.capPrefs; + memset(capPrefs, 0, sizeof(OOCapPrefs)); + return OO_OK; +} + +int ooRemoveCapFromCapPrefs(OOH323CallData *call, int cap) +{ + int i=0, j=0; + OOCapPrefs *capPrefs=NULL, oldPrefs; + if(call) + capPrefs = &call->capPrefs; + else + capPrefs = &gH323ep.capPrefs; + + memcpy(&oldPrefs, capPrefs, sizeof(OOCapPrefs)); + memset(capPrefs, 0, sizeof(OOCapPrefs)); + for(i=0; i<oldPrefs.index; i++) + { + if(oldPrefs.order[i] != cap) + capPrefs->order[j++] = oldPrefs.order[i]; + } + capPrefs->index = j; + return OO_OK; +} + + +int ooAppendCapToCapPrefs(OOH323CallData *call, int cap) +{ + OOCapPrefs *capPrefs=NULL; + if(call) + capPrefs = &call->capPrefs; + else + capPrefs = &gH323ep.capPrefs; + + capPrefs->order[capPrefs->index++] = cap; + return OO_OK; +} + +int ooChangeCapPrefOrder(OOH323CallData *call, int cap, int pos) +{ + int i=0, j=0; + OOCapPrefs *capPrefs = NULL; + + /* Whether to change prefs for call or for endpoint as a whole */ + if(call) + capPrefs = &call->capPrefs; + else + capPrefs = &gH323ep.capPrefs; + + /* check whether cap exists, cap must exist */ + for(i=0; i<capPrefs->index; i++) + { + if(capPrefs->order[i] == cap) + break; + } + if(i == capPrefs->index) return OO_FAILED; + + if(i==pos) return OO_OK; /* No need to change */ + + /* Decrease Pref order */ + if(i < pos) + { + for( ; i<pos; i++) + capPrefs->order[i] = capPrefs->order[i+1]; + capPrefs->order[i]=cap; + return OO_OK; + } + /* Increase Pref order */ + if(i>pos) + { + for(j=i; j>pos; j--) + capPrefs->order[j] = capPrefs->order[j-1]; + capPrefs->order[j] = cap; + return OO_OK; + } + + return OO_FAILED; + +} + +int ooPreppendCapToCapPrefs(OOH323CallData *call, int cap) +{ + int i=0, j=0; + OOCapPrefs *capPrefs=NULL, oldPrefs; + if(call) + capPrefs = &call->capPrefs; + else + capPrefs = &gH323ep.capPrefs; + + memcpy(&oldPrefs, capPrefs, sizeof(OOCapPrefs)); + + + capPrefs->order[j++] = cap; + + for(i=0; i<oldPrefs.index; i++) + { + if(oldPrefs.order[i] != cap) + capPrefs->order[j++] = oldPrefs.order[i]; + } + capPrefs->index = j; + return OO_OK; +} + + +int ooAddRemoteCapability(OOH323CallData *call, H245Capability *cap) +{ + switch(cap->t) + { + case T_H245Capability_receiveAudioCapability: + return ooAddRemoteAudioCapability(call, cap->u.receiveAudioCapability, + OORX); + case T_H245Capability_transmitAudioCapability: + return ooAddRemoteAudioCapability(call, cap->u.transmitAudioCapability, + OOTX); + case T_H245Capability_receiveAndTransmitAudioCapability: + return ooAddRemoteAudioCapability(call, + cap->u.receiveAndTransmitAudioCapability, OORXTX); + default: + OOTRACEDBGA3("Unsupported cap type encountered. Ignoring. (%s, %s)\n", + call->callType, call->callToken); + } + return OO_OK; +} + +int ooAddRemoteAudioCapability(OOH323CallData *call, + H245AudioCapability *audioCap, + int dir) +{ + int rxframes=0, txframes=0; + + switch(audioCap->t) + { + case T_H245AudioCapability_g711Alaw64k: + if(dir&OOTX) txframes = audioCap->u.g711Alaw64k; + else if(dir&OORX) rxframes = audioCap->u.g711Alaw64k; + else{ + txframes = audioCap->u.g711Alaw64k; + rxframes = audioCap->u.g711Alaw64k; + } + return ooCapabilityAddSimpleCapability(call, OO_G711ALAW64K, txframes, + rxframes, FALSE, dir, NULL, NULL, NULL, NULL,TRUE); + case T_H245AudioCapability_g711Alaw56k: + if(dir&OOTX) txframes = audioCap->u.g711Alaw56k; + else if(dir&OORX) rxframes = audioCap->u.g711Alaw56k; + else{ + txframes = audioCap->u.g711Alaw56k; + rxframes = audioCap->u.g711Alaw56k; + } + return ooCapabilityAddSimpleCapability(call, OO_G711ALAW56K, txframes, + rxframes, FALSE, dir, NULL, NULL, NULL, NULL, TRUE); + case T_H245AudioCapability_g711Ulaw64k: + if(dir&OOTX) txframes = audioCap->u.g711Ulaw64k; + else if(dir&OORX) rxframes = audioCap->u.g711Ulaw64k; + else{ + txframes = audioCap->u.g711Ulaw64k; + rxframes = audioCap->u.g711Ulaw64k; + } + return ooCapabilityAddSimpleCapability(call, OO_G711ULAW64K, txframes, + rxframes, FALSE, dir, NULL, NULL, NULL, NULL, TRUE); + case T_H245AudioCapability_g711Ulaw56k: + if(dir&OOTX) txframes = audioCap->u.g711Ulaw56k; + else if(dir&OORX) rxframes = audioCap->u.g711Ulaw56k; + else{ + txframes = audioCap->u.g711Ulaw56k; + rxframes = audioCap->u.g711Ulaw56k; + } + return ooCapabilityAddSimpleCapability(call, OO_G711ULAW56K, txframes, + rxframes, FALSE, dir, NULL, NULL, NULL, NULL, TRUE); + +/* case T_H245AudioCapability_g726: + if(dir&OOTX) txframes = audioCap->u.g726; + else if(dir&OORX) rxframes = audioCap->u.g726; + else{ + txframes = audioCap->u.g726; + rxframes = audioCap->u.g726; + } + return ooCapabilityAddSimpleCapability(call, OO_G726, txframes, + rxframes, FALSE, dir, NULL, NULL, NULL, NULL, TRUE); +*/ + case T_H245AudioCapability_g728: + if(dir&OOTX) txframes = audioCap->u.g728; + else if(dir&OORX) rxframes = audioCap->u.g728; + else{ + txframes = audioCap->u.g728; + rxframes = audioCap->u.g728; + } + return ooCapabilityAddSimpleCapability(call, OO_G728, txframes, + rxframes, FALSE, dir, NULL, NULL, NULL, NULL, TRUE); + + case T_H245AudioCapability_g729: + if(dir&OOTX) txframes = audioCap->u.g729; + else if(dir&OORX) rxframes = audioCap->u.g729; + else{ + txframes = audioCap->u.g729; + rxframes = audioCap->u.g729; + } + return ooCapabilityAddSimpleCapability(call, OO_G729, txframes, + rxframes, FALSE, dir, NULL, NULL, NULL, NULL, TRUE); + + case T_H245AudioCapability_g729AnnexA: + if(dir&OOTX) txframes = audioCap->u.g729AnnexA; + else if(dir&OORX) rxframes = audioCap->u.g729AnnexA; + else{ + txframes = audioCap->u.g729AnnexA; + rxframes = audioCap->u.g729AnnexA; + } + return ooCapabilityAddSimpleCapability(call, OO_G729A, txframes, + rxframes, FALSE, dir, NULL, NULL, NULL, NULL, TRUE); + + case T_H245AudioCapability_g7231: + if(dir&OOTX) txframes = audioCap->u.g7231->maxAl_sduAudioFrames; + else if(dir&OORX) rxframes = audioCap->u.g7231->maxAl_sduAudioFrames; + else{ + txframes = audioCap->u.g7231->maxAl_sduAudioFrames; + rxframes = audioCap->u.g7231->maxAl_sduAudioFrames; + } + return ooCapabilityAddSimpleCapability(call, OO_G7231, txframes,rxframes, + audioCap->u.g7231->silenceSuppression, + dir, NULL, NULL, NULL, NULL, TRUE); + case T_H245AudioCapability_gsmFullRate: + return ooCapabilityAddGSMCapability(call, OO_GSMFULLRATE, + (unsigned)(audioCap->u.gsmFullRate->audioUnitSize/OO_GSMFRAMESIZE), + audioCap->u.gsmFullRate->comfortNoise, + audioCap->u.gsmFullRate->scrambled, + dir, NULL, NULL, NULL, NULL, TRUE); + case T_H245AudioCapability_gsmHalfRate: + return ooCapabilityAddGSMCapability(call, OO_GSMHALFRATE, + (unsigned)(audioCap->u.gsmHalfRate->audioUnitSize/OO_GSMFRAMESIZE), + audioCap->u.gsmHalfRate->comfortNoise, + audioCap->u.gsmHalfRate->scrambled, + dir, NULL, NULL, NULL, NULL, TRUE); + case T_H245AudioCapability_gsmEnhancedFullRate: + return ooCapabilityAddGSMCapability(call, OO_GSMENHANCEDFULLRATE, + (unsigned)(audioCap->u.gsmEnhancedFullRate->audioUnitSize/OO_GSMFRAMESIZE), + audioCap->u.gsmEnhancedFullRate->comfortNoise, + audioCap->u.gsmEnhancedFullRate->scrambled, + dir, NULL, NULL, NULL, NULL, TRUE); + + default: + OOTRACEDBGA1("Unsupported audio capability type\n"); + + } + + return OO_OK; +} + + + + + +int ooCapabilityUpdateJointCapabilities + (OOH323CallData* call, H245Capability *cap) +{ + ooH323EpCapability * epCap = NULL, *cur = NULL; + OOTRACEDBGC3("checking whether we need to add cap to joint capabilities" + "(%s, %s)\n", call->callType, call->callToken); + + switch(cap->t) + { + case T_H245Capability_receiveAudioCapability: + epCap= ooIsAudioDataTypeSupported(call, cap->u.receiveAudioCapability, + OOTX); + break; + case T_H245Capability_transmitAudioCapability: + epCap = ooIsAudioDataTypeSupported(call, cap->u.transmitAudioCapability, + OORX); + break; + case T_H245Capability_receiveAndTransmitAudioCapability: + epCap = NULL; + break; + case T_H245Capability_receiveVideoCapability: + return ooCapabilityUpdateJointCapabilitiesVideo(call, + cap->u.receiveVideoCapability, OOTX); + case T_H245Capability_transmitVideoCapability: + return ooCapabilityUpdateJointCapabilitiesVideo(call, + cap->u.transmitVideoCapability, OORX); + case T_H245Capability_receiveUserInputCapability: + if((cap->u.receiveUserInputCapability->t == + T_H245UserInputCapability_basicString) && + (call->dtmfmode & OO_CAP_DTMF_H245_alphanumeric)) + { + call->jointDtmfMode |= OO_CAP_DTMF_H245_alphanumeric; + return OO_OK; + } + else if((cap->u.receiveUserInputCapability->t == + T_H245UserInputCapability_dtmf) && + (call->dtmfmode & OO_CAP_DTMF_H245_signal)) + { + call->jointDtmfMode |= OO_CAP_DTMF_H245_signal; + return OO_OK; + } + //break; + default: + OOTRACEDBGA3("Unsupported cap type encountered. Ignoring. (%s, %s)\n", + call->callType, call->callToken); + } + + if(epCap) + { + OOTRACEDBGC3("Adding cap to joint capabilities(%s, %s)\n",call->callType, + call->callToken); + /* Note:we add jointCaps in remote endpoints preference order.*/ + if(!call->jointCaps) + call->jointCaps = epCap; + else { + cur = call->jointCaps; + while(cur->next) cur = cur->next; + cur->next = epCap; + } + + return OO_OK; + } + + OOTRACEDBGC3("Not adding to joint capabilities. (%s, %s)\n", call->callType, + call->callToken); + return OO_OK; +} + + + +int ooCapabilityUpdateJointCapabilitiesVideo + (OOH323CallData *call, H245VideoCapability *videoCap, int dir) +{ + switch(videoCap->t) + { + case T_H245VideoCapability_h263VideoCapability: + return ooCapabilityUpdateJointCapabilitiesVideoH263(call, + videoCap->u.h263VideoCapability, dir); + default: + OOTRACEDBGC3("ooCapabilityUpdateJointCapabilitiesVideo - Unsupported" + "capability type. (%s, %s)\n", call->callType, + call->callToken); + } + return OO_OK; +} + + +int ooCapabilityUpdateJointCapabilitiesVideoH263 + (OOH323CallData *call, H245H263VideoCapability *pH263Cap, int dir) +{ + ooH323EpCapability *epCap = NULL, *cur = NULL; + if(pH263Cap->m.sqcifMPIPresent) + { + epCap = ooIsVideoDataTypeH263Supported(call, pH263Cap, dir, + OO_PICFORMAT_SQCIF); + if(epCap) + { + OOTRACEDBGC3("Adding H263-SQCIF to joint capabilities(%s, %s)\n", + call->callType, call->callToken); + /* Note:we add jointCaps in remote endpoints preference order.*/ + if(!call->jointCaps) + call->jointCaps = epCap; + else { + cur = call->jointCaps; + while(cur->next) cur = cur->next; + cur->next = epCap; + } + + } + } + + epCap = NULL; + + if(pH263Cap->m.qcifMPIPresent) + { + epCap = ooIsVideoDataTypeH263Supported(call, pH263Cap, dir, + OO_PICFORMAT_QCIF); + if(epCap) + { + OOTRACEDBGC3("Adding H263-QCIF to joint capabilities(%s, %s)\n", + call->callType, call->callToken); + /* Note:we add jointCaps in remote endpoints preference order.*/ + if(!call->jointCaps) + call->jointCaps = epCap; + else { + cur = call->jointCaps; + while(cur->next) cur = cur->next; + cur->next = epCap; + } + + } + } + + epCap = NULL; + + if(pH263Cap->m.cifMPIPresent) + { + epCap = ooIsVideoDataTypeH263Supported(call, pH263Cap, dir, + OO_PICFORMAT_CIF); + if(epCap) + { + OOTRACEDBGC3("Adding H263-CIF to joint capabilities(%s, %s)\n", + call->callType, call->callToken); + /* Note:we add jointCaps in remote endpoints preference order.*/ + if(!call->jointCaps) + call->jointCaps = epCap; + else { + cur = call->jointCaps; + while(cur->next) cur = cur->next; + cur->next = epCap; + } + + } + } + + epCap = NULL; + + if(pH263Cap->m.cif4MPIPresent) + { + epCap = ooIsVideoDataTypeH263Supported(call, pH263Cap, dir, + OO_PICFORMAT_CIF4); + if(epCap) + { + OOTRACEDBGC3("Adding H263-CIF4 to joint capabilities(%s, %s)\n", + call->callType, call->callToken); + /* Note:we add jointCaps in remote endpoints preference order.*/ + if(!call->jointCaps) + call->jointCaps = epCap; + else { + cur = call->jointCaps; + while(cur->next) cur = cur->next; + cur->next = epCap; + } + } + } + + epCap = NULL; + + if(pH263Cap->m.cif16MPIPresent) + { + epCap = ooIsVideoDataTypeH263Supported(call, pH263Cap, dir, + OO_PICFORMAT_CIF16); + if(epCap) + { + OOTRACEDBGC3("Adding H263-CIF16 to joint capabilities(%s, %s)\n", + call->callType, call->callToken); + /* Note:we add jointCaps in remote endpoints preference order.*/ + if(!call->jointCaps) + call->jointCaps = epCap; + else { + cur = call->jointCaps; + while(cur->next) cur = cur->next; + cur->next = epCap; + } + + } + } + + return OO_OK; +} + +const char* ooGetCapTypeText (OOCapabilities cap) +{ + static const char *capTypes[]={ + "unknown", + "OO_NONSTANDARD", + "OO_G711ALAW64K", + "OO_G711ALAW56K", + "OO_G711ULAW64K", + "OO_G711ULAW56K", + "OO_G72264K", + "OO_G72256K", + "OO_G72248K", + "OO_G7231", + "OO_G728", + "OO_G729", + "OO_G729ANNEXA", + "OO_IS11172AUDIO", + "OO_IS13818AUDIO", + "OO_G729WANNEXB", + "OO_G729ANNEXAWANNEXB", + "OO_G7231ANNEXC", + "OO_GSMFULLRATE", + "OO_GSMHALFRATE", + "OO_GSMENHANCEDFULLRATE", + "OO_GENERICAUDIO", + "OO_G729EXTENSIONS", + "OO_VBD", + "OO_AUDIOTELEPHONYEVENT", + "OO_AUDIOTONE", + "OO_EXTELEM1", + "OO_VIDEO_BASE", + "OO_NONSTDVIDEO", + "OO_H261VIDEO", + "OO_H262VIDEO", + "OO_H263VIDEO", + "OO_IS11172VIDEO", /* mpeg */ + "OO_GENERICVIDEO", + "OO_EXTELEMVIDEO" + }; + return ooUtilsGetText (cap, capTypes, OONUMBEROF(capTypes)); +} |