--- channels/chan_ooh323.c 2009-06-10 12:42:49.000000000 +0400 +++ ../x/asterisk-addons-1.6.1.0/channels/chan_ooh323.c 2009-06-10 12:44:35.000000000 +0400 @@ -280,9 +280,10 @@ ast_channel_lock(ch); ch->tech = &ooh323_tech; - ch->nativeformats = i->capability; + /* ch->nativeformats = i->capability; */ + ch->nativeformats = 0; - fmt = ast_best_codec(ch->nativeformats); + /* fmt = ast_best_codec(ch->nativeformats); */ ch->fds[0] = ast_rtp_fd(i->rtp); ch->fds[1] = ast_rtcp_fd(i->rtp); @@ -291,10 +292,12 @@ ch->rings = 1; ch->adsicpe = AST_ADSI_UNAVAILABLE; - ch->writeformat = AST_FORMAT_SLINEAR; - ch->rawwriteformat = fmt; - ch->readformat = AST_FORMAT_SLINEAR; - ch->rawreadformat = fmt; + ch->writeformat = 0; + ch->rawwriteformat = 0; + /* ch->rawwriteformat = fmt; */ + ch->readformat = 0; + ch->rawreadformat = 0; + /* ch->rawreadformat = fmt; */ ch->tech_pvt = i; i->owner = ch; @@ -970,41 +973,49 @@ { struct ooh323_pvt *p = ast->tech_pvt; int res = 0; - char *callToken = (char *)NULL; + char *callToken = (char *)NULL; - if (f->frametype == AST_FRAME_VOICE) { - if (!(f->subclass & ast->nativeformats)) { - ast_log(LOG_WARNING, "Asked to transmit frame type %d, while native " - "formats is %d (read/write = %d/%d)\n", - f->subclass, ast->nativeformats, ast->readformat, + if (p) { + ast_mutex_lock(&p->lock); + +/* sending progress for first */ + if (!ast_test_flag(p, H323_OUTGOING) && !p->progsent) { + callToken = (p->callToken ? strdup(p->callToken) : NULL); + ooManualProgress(callToken); + p->progsent = 1; + free(callToken); + } + if (f->frametype == AST_FRAME_VOICE) { + if (!(f->subclass & ast->nativeformats)) { + if (ast->nativeformats != 0) { + ast_log(LOG_WARNING, "Asked to transmit frame type %d," + " while native " + "formats is %d (read/write = %d/%d)\n", + f->subclass, ast->nativeformats, ast->readformat, ast->writeformat); - /* ast_set_write_format(ast, f->subclass); */ + } else { + ast->nativeformats = f->subclass; + ast_set_write_format(ast, f->subclass); + } + ast_mutex_unlock(&p->lock); return 0; - } - if (p) { -/* sending progress for first */ - if (!ast_test_flag(p, H323_OUTGOING) && !p->progsent) { - ast_mutex_lock(&p->lock); - callToken = (p->callToken ? strdup(p->callToken) : NULL); - ast_mutex_unlock(&p->lock); - - /* ast_mutex_lock(&ooh323c_cmd_lock); */ - ooManualProgress(callToken); - /* ast_mutex_unlock(&ooh323c_cmd_lock); */ - p->progsent = 1; - free(callToken); - } - ast_mutex_lock(&p->lock); - if (p->rtp) - res = ast_rtp_write(p->rtp, f); + } + + if (p->rtp) + res = ast_rtp_write(p->rtp, f); + + ast_mutex_unlock(&p->lock); + + } else if (f->frametype == AST_FRAME_IMAGE) { ast_mutex_unlock(&p->lock); - } - } else if (f->frametype == AST_FRAME_IMAGE) { - return 0; - } else { - ast_log(LOG_WARNING, "Can't send %d type frames with SIP write\n", + return 0; + } else { + ast_log(LOG_WARNING, "Can't send %d type frames with OOH323 write\n", f->frametype); - return 0; + ast_mutex_unlock(&p->lock); + return 0; + } + } return res; @@ -1153,7 +1164,11 @@ ast_verbose("Writeformat before update %s\n", ast_getformatname_multiple(formats,512, p->owner->writeformat)); p->owner->nativeformats = fmt; + if (p->owner->writeformat == 0) + p->owner->writeformat = fmt; ast_set_write_format(p->owner, p->owner->writeformat); + if (p->owner->readformat == 0) + p->owner->readformat = fmt; ast_set_read_format(p->owner, p->owner->readformat); ast_channel_unlock(p->owner); } else @@ -1203,7 +1218,11 @@ ast_verbose("Readformat before update %s\n", ast_getformatname_multiple(formats,512, p->owner->readformat)); p->owner->nativeformats = fmt; + if (p->owner->readformat == 0) + p->owner->readformat = fmt; ast_set_read_format(p->owner, p->owner->readformat); + if (p->owner->writeformat == 0) + p->owner->writeformat = fmt; ast_set_write_format(p->owner, p->owner->writeformat); ast_channel_unlock(p->owner); } else @@ -3243,6 +3262,12 @@ ooAddMediaInfo(call, mediaInfo); strcpy(mediaInfo.dir, "receive"); ooAddMediaInfo(call, mediaInfo); + + strcpy(mediaInfo.dir, "transmit"); + mediaInfo.cap = OO_G729B; + ooAddMediaInfo(call, mediaInfo); + strcpy(mediaInfo.dir, "receive"); + ooAddMediaInfo(call, mediaInfo); } } --- channels/ooh323cDriver.c 2009-05-30 21:48:26.000000000 +0400 +++ ../x/asterisk-addons-1.6.1.0/channels/ooh323cDriver.c 2009-06-10 12:46:41.000000000 +0400 @@ -170,6 +170,13 @@ &ooh323c_start_transmit_channel, &ooh323c_stop_receive_channel, &ooh323c_stop_transmit_channel); + if(gH323Debug) + ast_verbose("\tAdding g729B capability to H323 endpoint\n"); + ret |= ooH323EpAddG729Capability(OO_G729B, 2, 24, + OORXANDTX, &ooh323c_start_receive_channel, + &ooh323c_start_transmit_channel, + &ooh323c_stop_receive_channel, + &ooh323c_stop_transmit_channel); } if(format & AST_FORMAT_G723_1) @@ -267,6 +274,7 @@ if(format & AST_FORMAT_G729A) { + if(gH323Debug) ast_verbose("\tAdding g729A capability to call(%s, %s)\n", call->callType, call->callToken); @@ -276,7 +284,6 @@ &ooh323c_start_transmit_channel, &ooh323c_stop_receive_channel, &ooh323c_stop_transmit_channel); - if(gH323Debug) ast_verbose("\tAdding g729 capability to call(%s, %s)\n", call->callType, call->callToken); @@ -285,6 +292,15 @@ &ooh323c_start_transmit_channel, &ooh323c_stop_receive_channel, &ooh323c_stop_transmit_channel); + if(gH323Debug) + ast_verbose("\tAdding g729B capability to call(%s, %s)\n", + call->callType, call->callToken); + ret|= ooCallAddG729Capability(call, OO_G729B, txframes, 24, + OORXANDTX, &ooh323c_start_receive_channel, + &ooh323c_start_transmit_channel, + &ooh323c_stop_receive_channel, + &ooh323c_stop_transmit_channel); + } if(format & AST_FORMAT_G723_1) @@ -324,6 +340,7 @@ &ooh323c_stop_receive_channel, &ooh323c_stop_transmit_channel); } + } } @@ -358,9 +375,9 @@ { int fmt=-1; fmt = convertH323CapToAsteriskCap(pChannel->chanCap->cap); - if(fmt>0) - ooh323_set_read_format(call, fmt); - else{ + if(fmt>0) { + /* ooh323_set_read_format(call, fmt); */ + }else{ ast_log(LOG_ERROR, "Invalid capability type for receive channel %s\n", call->callToken); return -1; @@ -372,9 +389,9 @@ { int fmt=-1; fmt = convertH323CapToAsteriskCap(pChannel->chanCap->cap); - if(fmt>0) + if(fmt>0) { ooh323_set_write_format(call, fmt); - else{ + }else{ ast_log(LOG_ERROR, "Invalid capability type for receive channel %s\n", call->callToken); return -1; @@ -409,6 +426,8 @@ return AST_FORMAT_G729A; case OO_G729A: return AST_FORMAT_G729A; + case OO_G729B: + return AST_FORMAT_G729A; case OO_G7231: return AST_FORMAT_G723_1; case OO_H263VIDEO: --- channels/ooh323c/src/ooSocket.c 2009-05-31 00:21:38.000000000 +0400 +++ ../x/asterisk-addons-1.6.1.0/channels/ooh323c/src/ooSocket.c 2009-06-10 01:02:00.000000000 +0400 @@ -15,6 +15,7 @@ *****************************************************************************/ #include #include +#include #include "ooSocket.h" #include "ootrace.h" @@ -489,7 +490,7 @@ if(reshost == NULL) return -1; /* Need to define a return value if made part of rtsrc */ memcpy(&addr, &phost.h_addr_list[0], sizeof(struct in_addr)); - strcpy(pIPAddrs, ast_inet_ntoa(addr)); + strcpy(pIPAddrs, (ast_inet_ntoa(addr) == NULL) ? "127.0.0.1" : ast_inet_ntoa(addr)); } else { return -1; } --- channels/ooh323c/src/ooLogChan.c 2009-05-31 00:00:17.000000000 +0400 +++ ../x/asterisk-addons-1.6.1.0/channels/ooh323c/src/ooLogChan.c 2009-06-09 01:09:52.000000000 +0400 @@ -190,7 +190,7 @@ { OOTRACEDBGC3("ooFindLogicalChannel, checking channel: %d:%s\n", pChannel->sessionID, pChannel->dir); - if(pChannel->sessionID == sessionID) + if(pChannel->sessionID == sessionID || pChannel->sessionID == 0) { if(!strcmp(pChannel->dir, dir)) { --- channels/ooh323c/src/ooh245.c 2009-05-31 00:21:02.000000000 +0400 +++ ../x/asterisk-addons-1.6.1.0/channels/ooh323c/src/ooh245.c 2009-06-09 06:51:45.000000000 +0400 @@ -2953,13 +2953,14 @@ case OO_G728: case OO_G729: case OO_G729A: + case OO_G729B: case OO_G7231: case OO_GSMFULLRATE: + case OO_GSMHALFRATE: + case OO_GSMENHANCEDFULLRATE: case OO_H263VIDEO: ooOpenChannel(call, epCap); break; - case OO_GSMHALFRATE: - case OO_GSMENHANCEDFULLRATE: default: --- channels/ooh323c/src/ooCapability.c 2009-06-08 00:25:13.000000000 +0400 +++ ../x/asterisk-addons-1.6.1.0/channels/ooh323c/src/ooCapability.c 2009-06-09 06:56:11.000000000 +0400 @@ -616,8 +616,11 @@ case OO_G728: case OO_G729: case OO_G729A: + case OO_G729B: case OO_G7231: return ooCapabilityCreateSimpleCapability(epCap, pctxt, dir); + case OO_GSMHALFRATE: + case OO_GSMENHANCEDFULLRATE: case OO_GSMFULLRATE: return ooCapabilityCreateGSMFullRateCapability(epCap, pctxt, dir); default: @@ -777,8 +780,16 @@ "pAudio/pGSMCap\n"); return NULL; } - - pAudio->t = T_H245AudioCapability_gsmFullRate; + switch (epCap->cap) { + case OO_GSMHALFRATE: + pAudio->t = T_H245AudioCapability_gsmHalfRate; + break; + case OO_GSMENHANCEDFULLRATE: + pAudio->t = T_H245AudioCapability_gsmEnhancedFullRate; + break; + default: + pAudio->t = T_H245AudioCapability_gsmFullRate; + } pAudio->u.gsmFullRate = pGSMCap; if(dir & OORX) pGSMCap->audioUnitSize = ((OOGSMCapParams*)epCap->params)->rxframes*OO_GSMFRAMESIZE; @@ -871,6 +882,13 @@ else pAudio->u.g729AnnexA = params->txframes; return pAudio; + case OO_G729B: + pAudio->t = T_H245AudioCapability_g729wAnnexB; + 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, @@ -938,6 +956,10 @@ cap = OO_G729A; noofframes = audioCap->u.g729AnnexA; break; + case T_H245AudioCapability_g729wAnnexB: + cap = OO_G729B; + noofframes = audioCap->u.g729wAnnexB; + break; case T_H245AudioCapability_g7231: cap = OO_G7231; noofframes = audioCap->u.g7231->maxAl_sduAudioFrames; @@ -1006,6 +1028,8 @@ return FALSE; } + if(cap != epCap->cap) { return FALSE; } + /* can we receive this capability */ if(dir & OORX) { @@ -1207,6 +1231,8 @@ case T_H245AudioCapability_g729AnnexA: case T_H245AudioCapability_g7231: return ooCapabilityCheckCompatibility_Simple(call, epCap, audioCap, dir); + case T_H245AudioCapability_gsmHalfRate: + case T_H245AudioCapability_gsmEnhancedFullRate: case T_H245AudioCapability_gsmFullRate: return ooCapabilityCheckCompatibility_GSM(call, epCap, audioCap, dir); default: @@ -1227,7 +1253,7 @@ videoCap, dir); default: OOTRACEDBGC3("ooCapabilityCheckCompatibility_Video - Unsupported video " - "capability. (%s, %s)\n", call->callType, call->callToken); + "capability. (%s, $s)\n", call->callType, call->callToken); } return FALSE; } @@ -1254,7 +1280,7 @@ case T_H245DataType_data: default: OOTRACEDBGC3("ooCapabilityCheckCompatibility - Unsupported " - "capability. (%s, %s)\n", call->callType, call->callToken); + "capability. (%s, $s)\n", call->callType, call->callToken); } return FALSE; @@ -1287,6 +1313,7 @@ case OO_G728: case OO_G729: case OO_G729A: + case OO_G729B: case OO_G7231: if(((OOCapParams*)txCap->params)->txframes <= ((OOCapParams*)rxCap->params)->rxframes) @@ -1488,6 +1515,10 @@ framesPerPkt = audioCap->u.g729AnnexA; cap = OO_G729A; break; + case T_H245AudioCapability_g729wAnnexB: + framesPerPkt = audioCap->u.g729wAnnexB; + cap = OO_G729B; + break; case T_H245AudioCapability_g7231: framesPerPkt = audioCap->u.g7231->maxAl_sduAudioFrames; cap = OO_G7231; @@ -2067,6 +2098,16 @@ return ooCapabilityAddSimpleCapability(call, OO_G729A, txframes, rxframes, FALSE, dir, NULL, NULL, NULL, NULL, TRUE); + case T_H245AudioCapability_g729wAnnexB: + if(dir&OOTX) txframes = audioCap->u.g729wAnnexB; + else if(dir&OORX) rxframes = audioCap->u.g729wAnnexB; + else{ + txframes = audioCap->u.g729wAnnexB; + rxframes = audioCap->u.g729wAnnexB; + } + return ooCapabilityAddSimpleCapability(call, OO_G729B, 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;