--- ../../asterisk-addons-1.6.1.0/channels/chan_ooh323.c 2009-06-11 08:59:31.000000000 +0400 +++ channels/chan_ooh323.c 2009-06-14 22:34:31.000000000 +0400 @@ -1168,9 +1168,9 @@ if (p->owner->writeformat == 0) p->owner->writeformat = fmt; ast_set_write_format(p->owner, p->owner->writeformat); - if (p->owner->readformat == 0) + /* if (p->owner->readformat == 0) p->owner->readformat = fmt; - ast_set_read_format(p->owner, p->owner->readformat); + ast_set_read_format(p->owner, p->owner->readformat); */ ast_channel_unlock(p->owner); } else ast_log(LOG_ERROR, "No owner found\n"); @@ -1222,9 +1222,9 @@ if (p->owner->readformat == 0) p->owner->readformat = fmt; ast_set_read_format(p->owner, p->owner->readformat); - if (p->owner->writeformat == 0) + /* if (p->owner->writeformat == 0) p->owner->writeformat = fmt; - ast_set_write_format(p->owner, p->owner->writeformat); + ast_set_write_format(p->owner, p->owner->writeformat); */ ast_channel_unlock(p->owner); } else ast_log(LOG_ERROR, "No owner found\n"); @@ -3189,8 +3189,16 @@ return OO_G711ALAW64K; case AST_FORMAT_GSM: return OO_GSMFULLRATE; + +#ifdef AST_FORMAT_AMRNB + case AST_FORMAT_AMRNB: + return OO_AMRNB; +#endif + case AST_FORMAT_G729A: return OO_G729A; + case AST_FORMAT_G726: + return OO_G726; case AST_FORMAT_G723_1: return OO_G7231; case AST_FORMAT_H263: --- ../../asterisk-addons-1.6.1.0/channels/ooh323cDriver.c 2009-06-10 12:51:12.000000000 +0400 +++ channels/ooh323cDriver.c 2009-06-14 22:34:11.000000000 +0400 @@ -171,7 +171,7 @@ &ooh323c_stop_receive_channel, &ooh323c_stop_transmit_channel); if(gH323Debug) - ast_verbose("\tAdding g729B capability to H323 endpoint\n"); + ast_verbose("\tAdding g729b capability to H323 endpoint\n"); ret |= ooH323EpAddG729Capability(OO_G729B, 2, 24, OORXANDTX, &ooh323c_start_receive_channel, &ooh323c_start_transmit_channel, @@ -191,6 +191,18 @@ } + if(format & AST_FORMAT_G726) + { + if(gH323Debug) + ast_verbose("\tAdding g726 capability to H323 endpoint\n"); + ret = ooH323EpAddG726Capability(OO_G726, gtxframes, grxframes, FALSE, + OORXANDTX, &ooh323c_start_receive_channel, + &ooh323c_start_transmit_channel, + &ooh323c_stop_receive_channel, + &ooh323c_stop_transmit_channel); + + } + if(format & AST_FORMAT_H263) { if(gH323Debug) @@ -215,6 +227,20 @@ } +#ifdef AST_FORMAT_AMRNB + if(format & AST_FORMAT_AMRNB) + { + if(gH323Debug) + ast_verbose("\tAdding amr nb capability to H323 endpoint\n"); + ret = ooH323EpAddAMRNBCapability(OO_AMRNB, 4, 4, FALSE, + OORXANDTX, &ooh323c_start_receive_channel, + &ooh323c_start_transmit_channel, + &ooh323c_stop_receive_channel, + &ooh323c_stop_transmit_channel); + + } +#endif + } if(dtmf & H323_DTMF_RFC2833) @@ -272,6 +298,20 @@ &ooh323c_stop_transmit_channel); } + if(format & AST_FORMAT_G726) + { + if(gH323Debug) + ast_verbose("\tAdding g726 capability to call (%s, %s)\n", + call->callType, call->callToken); + txframes = prefs->framing[x]; + ret = ooCallAddG726Capability(call, OO_G726, txframes, grxframes, FALSE, + OORXANDTX, &ooh323c_start_receive_channel, + &ooh323c_start_transmit_channel, + &ooh323c_stop_receive_channel, + &ooh323c_stop_transmit_channel); + + } + if(format & AST_FORMAT_G729A) { @@ -341,6 +381,19 @@ &ooh323c_stop_transmit_channel); } +#ifdef AST_FORMAT_AMRNB + if(format & AST_FORMAT_AMRNB) + { + if(gH323Debug) + ast_verbose("\tAdding AMR capability to call(%s, %s)\n", + call->callType, call->callToken); + ret = ooCallAddAMRNBCapability(call, OO_AMRNB, 4, 4, FALSE, + OORXANDTX, &ooh323c_start_receive_channel, + &ooh323c_start_transmit_channel, + &ooh323c_stop_receive_channel, + &ooh323c_stop_transmit_channel); + } +#endif } } @@ -422,6 +475,12 @@ return AST_FORMAT_ALAW; case OO_GSMFULLRATE: return AST_FORMAT_GSM; + +#ifdef AST_FORMAT_AMRNB + case OO_AMRNB: + return AST_FORMAT_AMRNB; +#endif + case OO_G729: return AST_FORMAT_G729A; case OO_G729A: @@ -430,6 +489,8 @@ return AST_FORMAT_G729A; case OO_G7231: return AST_FORMAT_G723_1; + case OO_G726: + return AST_FORMAT_G726; case OO_H263VIDEO: return AST_FORMAT_H263; default: --- ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooCalls.c 2009-06-12 03:52:54.000000000 +0400 +++ channels/ooh323c/src/ooCalls.c 2009-06-14 21:42:41.000000000 +0400 @@ -530,6 +530,31 @@ /* Used to override global end point capabilities and add call specific capabilities */ +int ooCallAddG726Capability(OOH323CallData *call, int cap, int txframes, + int rxframes, OOBOOL silenceSuppression, int dir, + cb_StartReceiveChannel startReceiveChannel, + cb_StartTransmitChannel startTransmitChannel, + cb_StopReceiveChannel stopReceiveChannel, + cb_StopTransmitChannel stopTransmitChannel) +{ + return ooCapabilityAddSimpleCapability(call, cap, txframes, rxframes, + silenceSuppression, dir, startReceiveChannel, + startTransmitChannel, stopReceiveChannel, + stopTransmitChannel, FALSE); +} +int ooCallAddAMRNBCapability(OOH323CallData *call, int cap, int txframes, + int rxframes, OOBOOL silenceSuppression, int dir, + cb_StartReceiveChannel startReceiveChannel, + cb_StartTransmitChannel startTransmitChannel, + cb_StopReceiveChannel stopReceiveChannel, + cb_StopTransmitChannel stopTransmitChannel) +{ + return ooCapabilityAddSimpleCapability(call, cap, txframes, rxframes, + silenceSuppression, dir, startReceiveChannel, + startTransmitChannel, stopReceiveChannel, + stopTransmitChannel, FALSE); +} + int ooCallAddG7231Capability(OOH323CallData *call, int cap, int txframes, int rxframes, OOBOOL silenceSuppression, int dir, cb_StartReceiveChannel startReceiveChannel, --- ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooCapability.h 2008-02-07 23:59:47.000000000 +0300 +++ channels/ooh323c/src/ooCapability.h 2009-06-14 22:37:37.000000000 +0400 @@ -33,6 +33,7 @@ supported */ typedef enum OOCapabilities{ OO_CAP_AUDIO_BASE = 0, + OO_G726 = 1, OO_G711ALAW64K = 2, OO_G711ALAW56K = 3, OO_G711ULAW64K = 4, @@ -44,8 +45,12 @@ OO_G728 = 10, OO_G729 = 11, OO_G729A = 12, +#if 0 OO_IS11172_AUDIO = 13, OO_IS13818_AUDIO = 14, +#else + OO_AMRNB = 13, +#endif OO_G729B = 15, OO_G729AB = 16, OO_G7231C = 17, @@ -579,6 +584,8 @@ */ struct H245AudioCapability* ooCapabilityCreateSimpleCapability (ooH323EpCapability *epCap, OOCTXT* pctxt, int dir); +struct H245AudioCapability* ooCapabilityCreateNonStandardCapability + (ooH323EpCapability *epCap, OOCTXT* pctxt, int dir); /** --- ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooh323ep.c 2009-05-31 00:22:53.000000000 +0400 +++ channels/ooh323c/src/ooh323ep.c 2009-06-14 21:45:52.000000000 +0400 @@ -648,6 +648,31 @@ stopTransmitChannel, FALSE); } +int ooH323EpAddG726Capability(int cap, int txframes, int rxframes, + OOBOOL silenceSuppression, int dir, + cb_StartReceiveChannel startReceiveChannel, + cb_StartTransmitChannel startTransmitChannel, + cb_StopReceiveChannel stopReceiveChannel, + cb_StopTransmitChannel stopTransmitChannel) +{ + return ooCapabilityAddSimpleCapability(NULL, cap, txframes, rxframes, + silenceSuppression, dir, startReceiveChannel, + startTransmitChannel, stopReceiveChannel, + stopTransmitChannel, FALSE); +} +int ooH323EpAddAMRNBCapability(int cap, int txframes, int rxframes, + OOBOOL silenceSuppression, int dir, + cb_StartReceiveChannel startReceiveChannel, + cb_StartTransmitChannel startTransmitChannel, + cb_StopReceiveChannel stopReceiveChannel, + cb_StopTransmitChannel stopTransmitChannel) +{ + return ooCapabilityAddSimpleCapability(NULL, cap, txframes, rxframes, + silenceSuppression, dir, startReceiveChannel, + startTransmitChannel, stopReceiveChannel, + stopTransmitChannel, FALSE); +} + int ooH323EpAddGSMCapability(int cap, ASN1USINT framesPerPkt, OOBOOL comfortNoise, OOBOOL scrambled, int dir, cb_StartReceiveChannel startReceiveChannel, --- ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooh245.c 2009-06-12 03:52:54.000000000 +0400 +++ channels/ooh323c/src/ooh245.c 2009-06-14 21:44:35.000000000 +0400 @@ -2949,7 +2949,8 @@ case OO_G711ALAW56K: case OO_G711ULAW64K: case OO_G711ULAW56K: - /*case OO_G726:*/ + case OO_G726: + case OO_AMRNB: case OO_G728: case OO_G729: case OO_G729A: --- ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooCapability.c 2009-06-10 12:51:12.000000000 +0400 +++ channels/ooh323c/src/ooCapability.c 2009-06-14 22:08:40.000000000 +0400 @@ -612,13 +612,15 @@ case OO_G711ALAW56K: case OO_G711ULAW64K: case OO_G711ULAW56K: - /*case OO_G726:*/ case OO_G728: case OO_G729: case OO_G729A: case OO_G729B: case OO_G7231: return ooCapabilityCreateSimpleCapability(epCap, pctxt, dir); + case OO_G726: + case OO_AMRNB: + return ooCapabilityCreateNonStandardCapability(epCap, pctxt, dir); case OO_GSMHALFRATE: case OO_GSMENHANCEDFULLRATE: case OO_GSMFULLRATE: @@ -854,13 +856,6 @@ 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) @@ -912,6 +907,76 @@ } return NULL; } +/* This is used for g726, AMRNB */ +struct H245AudioCapability* ooCapabilityCreateNonStandardCapability + (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_AMRNB: + case OO_G726: + pAudio->t = T_H245AudioCapability_nonStandard; + pAudio->u.nonStandard = (H245NonStandardParameter*)memAlloc(pctxt, + sizeof(H245NonStandardParameter)); + if(!pAudio->u.nonStandard) + { + OOTRACEERR1("Error:Memory - ooCapabilityCreateSimpleCapability - g726\n"); + memFreePtr(pctxt, pAudio); + return NULL; + } + + pAudio->u.nonStandard->nonStandardIdentifier.t=T_H245NonStandardIdentifier_h221NonStandard; + pAudio->u.nonStandard->nonStandardIdentifier.u.h221NonStandard = + (H245NonStandardIdentifier_h221NonStandard *) memAlloc(pctxt, + sizeof(H245NonStandardIdentifier_h221NonStandard)); + if (!pAudio->u.nonStandard->nonStandardIdentifier.u.h221NonStandard) { + OOTRACEERR2("Error:Memory - ooCapabilityCreateSimpleCapability - %d\n", epCap->cap); + memFreePtr(pctxt, pAudio); + return NULL; + } + + pAudio->u.nonStandard->nonStandardIdentifier.u.h221NonStandard->t35CountryCode = + gH323ep.t35CountryCode; + pAudio->u.nonStandard->nonStandardIdentifier.u.h221NonStandard->t35Extension = + gH323ep.t35Extension; + pAudio->u.nonStandard->nonStandardIdentifier.u.h221NonStandard->manufacturerCode = + gH323ep.manufacturerCode; + + switch (epCap->cap) { + case OO_G726: + pAudio->u.nonStandard->data.data = "G.726-32k"; + pAudio->u.nonStandard->data.numocts = sizeof("G.726-32k")-1; + break; + case OO_AMRNB: + pAudio->u.nonStandard->data.data = "AMRNB"; + pAudio->u.nonStandard->data.numocts = sizeof("AMRNB")-1; + } + 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 @@ -964,6 +1029,7 @@ cap = OO_G7231; noofframes = audioCap->u.g7231->maxAl_sduAudioFrames; break; + default: return FALSE; } @@ -1003,6 +1069,47 @@ return FALSE; } +/* Used for g726, AMRNB */ +ASN1BOOL ooCapabilityCheckCompatibility_NonStandard + (OOH323CallData *call, ooH323EpCapability* epCap, + H245AudioCapability* audioCap, int dir) +{ + int noofframes=0, cap; + + OOTRACEDBGC2("Comparing channel with codec type: %d\n", audioCap->t); + + if (audioCap->t == T_H245AudioCapability_nonStandard && + audioCap->u.nonStandard && + audioCap->u.nonStandard->nonStandardIdentifier.t == + T_H245NonStandardIdentifier_h221NonStandard) { + switch (audioCap->u.nonStandard->data.numocts) { + case sizeof("G.726-32k")-1: + if (!strncmp(audioCap->u.nonStandard->data.data, "G.726-32k", + audioCap->u.nonStandard->data.numocts)) + cap = OO_G726; + else + return FALSE; + break; + case sizeof("AMRNB")-1: + if (!strncmp(audioCap->u.nonStandard->data.data, "AMRNB", + audioCap->u.nonStandard->data.numocts)) + cap = OO_AMRNB; + else + return FALSE; + break; + default: + return FALSE; + } + } else + return FALSE; + + OOTRACEDBGC3("Comparing codecs: current=%d, requested=%d\n", + epCap->cap, cap); + if(cap != epCap->cap) { return FALSE; } + + return TRUE; + +} OOBOOL ooCapabilityCheckCompatibility_GSM @@ -1229,8 +1336,11 @@ case T_H245AudioCapability_g728: case T_H245AudioCapability_g729: case T_H245AudioCapability_g729AnnexA: + case T_H245AudioCapability_g729wAnnexB: case T_H245AudioCapability_g7231: return ooCapabilityCheckCompatibility_Simple(call, epCap, audioCap, dir); + case T_H245AudioCapability_nonStandard: + return ooCapabilityCheckCompatibility_NonStandard(call, epCap, audioCap, dir); case T_H245AudioCapability_gsmHalfRate: case T_H245AudioCapability_gsmEnhancedFullRate: case T_H245AudioCapability_gsmFullRate: @@ -1309,7 +1419,6 @@ case OO_G711ALAW56K: case OO_G711ULAW64K: case OO_G711ULAW56K: - /*case OO_G726:*/ case OO_G728: case OO_G729: case OO_G729A: @@ -1523,6 +1632,7 @@ framesPerPkt = audioCap->u.g7231->maxAl_sduAudioFrames; cap = OO_G7231; break; + default: return NULL; } @@ -1635,6 +1745,135 @@ return NULL; } +/* used for g726, AMRNB */ +ooH323EpCapability* ooIsAudioDataTypeNonStandardSupported + (OOH323CallData *call, H245AudioCapability* audioCap, int dir) +{ + int cap; + ooH323EpCapability *cur=NULL, *epCap=NULL; + OOCapParams * params= NULL; + + if (audioCap->t == T_H245AudioCapability_nonStandard && + audioCap->u.nonStandard && + audioCap->u.nonStandard->nonStandardIdentifier.t == + T_H245NonStandardIdentifier_h221NonStandard) { + switch (audioCap->u.nonStandard->data.numocts) { + case sizeof("G.726-32k")-1: + if (!strncmp(audioCap->u.nonStandard->data.data, "G.726-32k", + audioCap->u.nonStandard->data.numocts)) + cap = OO_G726; + else + return NULL; + break; + case sizeof("AMRNB")-1: + if (!strncmp(audioCap->u.nonStandard->data.data, "AMRNB", + audioCap->u.nonStandard->data.numocts)) + cap = OO_AMRNB; + else + return NULL; + break; + default: + return NULL; + } + } else + 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) + { + 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)); + OOTRACEDBGC4("Returning copy of matched transmit capability %s." + "(%s, %s)\n", + ooGetCapTypeText(cur->cap), call->callType, + call->callToken); + return epCap; + } + return NULL; +} + ooH323EpCapability* ooIsAudioDataTypeSupported @@ -1651,8 +1890,11 @@ case T_H245AudioCapability_g728: case T_H245AudioCapability_g729: case T_H245AudioCapability_g729AnnexA: + case T_H245AudioCapability_g729wAnnexB: case T_H245AudioCapability_g7231: return ooIsAudioDataTypeSimpleSupported(call, audioCap, dir); + case T_H245AudioCapability_nonStandard: + return ooIsAudioDataTypeNonStandardSupported(call, audioCap, dir); case T_H245AudioCapability_gsmFullRate: case T_H245AudioCapability_gsmHalfRate: case T_H245AudioCapability_gsmEnhancedFullRate: @@ -2068,6 +2310,26 @@ return ooCapabilityAddSimpleCapability(call, OO_G726, txframes, rxframes, FALSE, dir, NULL, NULL, NULL, NULL, TRUE); */ + case T_H245AudioCapability_nonStandard: + if (audioCap->u.nonStandard && + audioCap->u.nonStandard->nonStandardIdentifier.t == + T_H245NonStandardIdentifier_h221NonStandard && + audioCap->u.nonStandard->data.numocts == sizeof("G.726-32k")-1 && + !strncmp(audioCap->u.nonStandard->data.data, "G.726-32k", + audioCap->u.nonStandard->data.numocts)) + return ooCapabilityAddSimpleCapability(call, OO_G726, 20, + 240, FALSE, dir, NULL, NULL, NULL, NULL, TRUE); + + if (audioCap->u.nonStandard && + audioCap->u.nonStandard->nonStandardIdentifier.t == + T_H245NonStandardIdentifier_h221NonStandard && + audioCap->u.nonStandard->data.numocts == sizeof("AMRNB")-1 && + !strncmp(audioCap->u.nonStandard->data.data, "AMRNB", + audioCap->u.nonStandard->data.numocts)) + return ooCapabilityAddSimpleCapability(call, OO_AMRNB, 4, + 4, FALSE, dir, NULL, NULL, NULL, NULL, TRUE); + break; + case T_H245AudioCapability_g728: if(dir&OOTX) txframes = audioCap->u.g728; else if(dir&OORX) rxframes = audioCap->u.g728; @@ -2354,7 +2616,7 @@ { static const char *capTypes[]={ "unknown", - "OO_NONSTANDARD", + "OO_G726", "OO_G711ALAW64K", "OO_G711ALAW56K", "OO_G711ULAW64K", @@ -2366,8 +2628,8 @@ "OO_G728", "OO_G729", "OO_G729ANNEXA", - "OO_IS11172AUDIO", - "OO_IS13818AUDIO", + "OO_AMRNB", + "OO_UNUSED", "OO_G729WANNEXB", "OO_G729ANNEXAWANNEXB", "OO_G7231ANNEXC",