diff --git a/channels/chan_h323.c b/channels/chan_h323.c index 6b67304819963afb2cc392f64ee60fe28d47e7db..6309404edb4689c87cb56d64d21cf07a90f7e577 100755 --- a/channels/chan_h323.c +++ b/channels/chan_h323.c @@ -1166,15 +1166,25 @@ struct rtp_info *external_rtp_create(unsigned call_reference, const char * token int progress(unsigned call_reference, const char *token, int inband); +/** + * Definition taken from rtp.c for rtpPayloadType because we need it here. + */ +struct rtpPayloadType { + int isAstFormat; /* whether the following code is an AST_FORMAT */ + int code; +}; + /** * Call-back function passing remote ip/port information from H.323 to asterisk * * Returns nothing */ -void setup_rtp_connection(unsigned call_reference, const char *remoteIp, int remotePort, const char *token) +void setup_rtp_connection(unsigned call_reference, const char *remoteIp, int remotePort, const char *token, int pt) { struct oh323_pvt *pvt = NULL; struct sockaddr_in them; + struct rtpPayloadType rtptype; + int fmt; /* Find the call or allocate a private structure if call not found */ pvt = find_call(call_reference, token); @@ -1182,6 +1192,19 @@ void setup_rtp_connection(unsigned call_reference, const char *remoteIp, int rem ast_log(LOG_ERROR, "Something is wrong: rtp\n"); return; } + + rtptype = ast_rtp_lookup_pt(pvt->rtp, pt); + + fmt = ast_best_codec(pvt->owner->nativeformats); + + ast_mutex_lock(&pvt->lock); + pvt->owner->nativeformats = rtptype.code; + pvt->owner->readformat = fmt; + pvt->owner->writeformat = fmt; + ast_set_read_format(pvt->owner, pvt->owner->readformat); + ast_set_write_format(pvt->owner, pvt->owner->writeformat); + ast_mutex_unlock(&pvt->lock); + them.sin_family = AF_INET; /* only works for IPv4 */ them.sin_addr.s_addr = inet_addr(remoteIp); @@ -1191,6 +1214,7 @@ void setup_rtp_connection(unsigned call_reference, const char *remoteIp, int rem if (pvt->options.progress_audio) { progress(call_reference, token, 1); } + return; } diff --git a/channels/h323/ast_h323.cpp b/channels/h323/ast_h323.cpp index 91e8b85c160ed32e2e1a52efbe3465b2b1b351cc..20118837a8944f152b5ad8ae0c13840b00dc0d05 100755 --- a/channels/h323/ast_h323.cpp +++ b/channels/h323/ast_h323.cpp @@ -83,13 +83,9 @@ void MyProcess::Main() PTrace::Initialise(0, NULL, PTrace::Timestamp | PTrace::Thread | PTrace::FileAndLine); } -#define H323_G7231 OPAL_G7231_6k3 "{sw}" -#define H323_G729 OPAL_G729 "{sw}" -#define H323_G729A OPAL_G729A "{sw}" - -H323_REGISTER_CAPABILITY(H323_G7231Capability, H323_G7231); -H323_REGISTER_CAPABILITY(AST_G729Capability, H323_G729); -H323_REGISTER_CAPABILITY(AST_G729ACapability, H323_G729A); +H323_REGISTER_CAPABILITY(H323_G7231Capability, OPAL_G7231); +H323_REGISTER_CAPABILITY(AST_G729Capability, OPAL_G729); +H323_REGISTER_CAPABILITY(AST_G729ACapability, OPAL_G729A); H323_G7231Capability::H323_G7231Capability(BOOL annexA_) : H323AudioCapability(7, 4) @@ -120,7 +116,7 @@ PObject * H323_G7231Capability::Clone() const PString H323_G7231Capability::GetFormatName() const { - return H323_G7231; + return OPAL_G7231; } unsigned H323_G7231Capability::GetSubType() const @@ -172,7 +168,7 @@ unsigned AST_G729Capability::GetSubType() const PString AST_G729Capability::GetFormatName() const { - return H323_G729; + return OPAL_G729; } H323Codec * AST_G729Capability::CreateCodec(H323Codec::Direction direction) const @@ -197,7 +193,7 @@ unsigned AST_G729ACapability::GetSubType() const PString AST_G729ACapability::GetFormatName() const { - return H323_G729A; + return OPAL_G729A; } H323Codec * AST_G729ACapability::CreateCodec(H323Codec::Direction direction) const @@ -945,7 +941,7 @@ BOOL MyH323_ExternalRTPChannel::Start(void) /* Notify Asterisk of remote RTP information */ on_start_rtp_channel(connection.GetCallReference(), (const char *)remoteIpAddr.AsString(), remotePort, - (const char *)connection.GetCallToken()); + (const char *)connection.GetCallToken(), (int)payloadCode); return TRUE; } @@ -965,7 +961,7 @@ BOOL MyH323_ExternalRTPChannel::OnReceivedAckPDU(const H245_H2250LogicalChannelA cout << " -- remotePort: " << remotePort << endl; } on_start_rtp_channel(connection.GetCallReference(), (const char *)remoteIpAddress.AsString(), - remotePort, (const char *)connection.GetCallToken()); + remotePort, (const char *)connection.GetCallToken(), (int)payloadCode); return TRUE; } return FALSE; diff --git a/channels/h323/chan_h323.h b/channels/h323/chan_h323.h index fca116ea95ce307f0fc6344da4fb3bd991611773..a59da67fca28d60e84b2581a7632bb6182fb4f30 100755 --- a/channels/h323/chan_h323.h +++ b/channels/h323/chan_h323.h @@ -99,6 +99,8 @@ typedef struct call_details { char *call_source_name; char *call_source_e164; char *call_dest_e164; + int presentation; + int screening; char *sourceIp; } call_details_t; @@ -119,7 +121,7 @@ extern on_rtp_cb on_external_rtp_create; /* This is a callback prototype function, called to send the remote IP and RTP port from H.323 to Asterisk */ -typedef void (*start_rtp_cb)(unsigned int, const char *, int, const char *); +typedef void (*start_rtp_cb)(unsigned int, const char *, int, const char *, int); extern start_rtp_cb on_start_rtp_channel; /* This is a callback that happens when call progress is