mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 12:16:00 +00:00
Fix G.729 name annoucement to Open H.323 and inform Asterisk's RTP stack specifically which codec we are expecting.
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4508 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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;
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user