SWITCH_RTP_FLAG_SECURE - Secure RTP
SWITCH_RTP_FLAG_AUTOADJ - Auto-Adjust the dest based on the source
SWITCH_RTP_FLAG_RAW_WRITE - Try to forward packets unscathed
+ SWITCH_RTP_FLAG_GOOGLEHACK - Convert payload from 102 to 97
</pre>
*/
typedef enum {
SWITCH_RTP_FLAG_USE_TIMER = (1 << 2),
SWITCH_RTP_FLAG_SECURE = (1 << 3),
SWITCH_RTP_FLAG_AUTOADJ = (1 << 4),
- SWITCH_RTP_FLAG_RAW_WRITE = (1 << 5)
+ SWITCH_RTP_FLAG_RAW_WRITE = (1 << 5),
+ SWITCH_RTP_FLAG_GOOGLEHACK = (1 << 6)
} switch_rtp_flag_t;
/*!
return 0;
}
- if (!strcasecmp(tech_pvt->codec_name, "ilbc")) {
+ if (!strncasecmp(tech_pvt->codec_name, "ilbc", 4)) {
ms = 30;
}
tech_pvt->codec_num,
tech_pvt->read_codec.implementation->encoded_bytes_per_frame,
tech_pvt->read_codec.implementation->microseconds_per_frame,
- SWITCH_RTP_FLAG_USE_TIMER | SWITCH_RTP_FLAG_AUTOADJ,
+ SWITCH_RTP_FLAG_USE_TIMER | SWITCH_RTP_FLAG_AUTOADJ | SWITCH_RTP_FLAG_GOOGLEHACK,
NULL,
&err, switch_core_session_get_pool(tech_pvt->session)))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "RTP ERROR %s\n", err);
return 0;
}
+static char *lame(char *in)
+{
+ if (!strncasecmp(in, "ilbc", 4)) {
+ return "iLBC";
+ } else {
+ return in;
+ }
+}
+
static int do_describe(struct private_object *tech_pvt, int force)
{
ldl_payload_t payloads[5];
if (force || !switch_test_flag(tech_pvt, TFLAG_CODEC_READY)) {
if (tech_pvt->codec_index < 0) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Don't have my codec yet here's one\n");
- tech_pvt->codec_name = tech_pvt->codecs[0]->iananame;
+ tech_pvt->codec_name = lame(tech_pvt->codecs[0]->iananame);
tech_pvt->codec_num = tech_pvt->codecs[0]->ianacode;
tech_pvt->codec_index = 0;
- payloads[0].name = tech_pvt->codecs[0]->iananame;
+ payloads[0].name = lame(tech_pvt->codecs[0]->iananame);
payloads[0].id = tech_pvt->codecs[0]->ianacode;
-
+
} else {
- payloads[0].name = tech_pvt->codecs[tech_pvt->codec_index]->iananame;
+ payloads[0].name = lame(tech_pvt->codecs[tech_pvt->codec_index]->iananame);
payloads[0].id = tech_pvt->codecs[tech_pvt->codec_index]->ianacode;
}
while (!switch_test_flag(tech_pvt, TFLAG_BYE) && switch_test_flag(tech_pvt, TFLAG_IO) && tech_pvt->read_frame.datalen == 0) {
tech_pvt->read_frame.flags = 0;
status = switch_rtp_zerocopy_read_frame(tech_pvt->rtp_session, &tech_pvt->read_frame);
-
+
if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) {
return SWITCH_STATUS_FALSE;
}
}
if (rtp_session->recv_msg.header.version == 2) {
+ if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_GOOGLEHACK) && rtp_session->recv_msg.header.pt == 102) {
+ rtp_session->recv_msg.header.pt = 97;
+ }
if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_AUTOADJ) && rtp_session->from_addr->port &&
(rtp_session->from_addr->port != rtp_session->remote_port)) {
uint32_t old = rtp_session->remote_port;
bytes = sbytes;
}
+ if (switch_test_flag(rtp_session, SWITCH_RTP_FLAG_GOOGLEHACK) && rtp_session->send_msg.header.pt == 97) {
+ rtp_session->recv_msg.header.pt = 102;
+ }
switch_socket_sendto(rtp_session->sock, rtp_session->remote_addr, 0, (void*)send_msg, &bytes);
if (rtp_session->ice_user) {