--- channels/chan_sip.c 2013-01-10 09:30:25.000000000 +1300 +++ channels/chan_sip.c 2013-06-10 15:37:06.000000000 +1200 @@ -10167,6 +10167,7 @@ char s[256]; unsigned int x; + p->t38.their_parms.rate = AST_T38_RATE_14400; if (initialize_udptl(p)) { return found; } @@ -11761,8 +11762,8 @@ p->sessionversion++; } + doing_directmedia = (!ast_sockaddr_isnull(&p->redirip) && p->redircodecs) ? TRUE : FALSE; if (add_audio) { - doing_directmedia = (!ast_sockaddr_isnull(&p->redirip) && p->redircodecs) ? TRUE : FALSE; /* Check if we need video in this call */ if ((p->jointcapability & AST_FORMAT_VIDEO_MASK) && !p->novideo) { if (doing_directmedia && !(p->jointcapability & AST_FORMAT_VIDEO_MASK & p->redircodecs)) { @@ -11953,24 +11954,28 @@ if (add_t38) { /* Our T.38 end is */ - ast_udptl_get_us(p->udptl, &udptladdr); - - /* Determine T.38 UDPTL destination */ - if (!ast_sockaddr_isnull(&p->udptlredirip)) { - ast_sockaddr_copy(&udptldest, &p->udptlredirip); - } else { - ast_sockaddr_copy(&udptldest, &p->ourip); - ast_sockaddr_set_port(&udptldest, ast_sockaddr_port(&udptladdr)); - } + if (doing_directmedia) { + ast_str_append(&m_modem, 0, "m=image %d udptl t38\r\n", ast_sockaddr_port(&dest)); + }else{ + ast_udptl_get_us(p->udptl, &udptladdr); + + /* Determine T.38 UDPTL destination */ + if (!ast_sockaddr_isnull(&p->udptlredirip)) { + ast_sockaddr_copy(&udptldest, &p->udptlredirip); + } else { + ast_sockaddr_copy(&udptldest, &p->ourip); + ast_sockaddr_set_port(&udptldest, ast_sockaddr_port(&udptladdr)); + } - if (debug) { - ast_debug(1, "T.38 UDPTL is at %s port %d\n", ast_sockaddr_stringify_addr(&p->ourip), ast_sockaddr_port(&udptladdr)); - } + if (debug) { + ast_debug(1, "T.38 UDPTL is at %s port %d\n", ast_sockaddr_stringify_addr(&p->ourip), ast_sockaddr_port(&udptladdr)); + } - /* We break with the "recommendation" and send our IP, in order that our - peer doesn't have to ast_gethostbyname() us */ + /* We break with the "recommendation" and send our IP, in order that our + peer doesn't have to ast_gethostbyname() us */ - ast_str_append(&m_modem, 0, "m=image %d udptl t38\r\n", ast_sockaddr_port(&udptldest)); + ast_str_append(&m_modem, 0, "m=image %d udptl t38\r\n", ast_sockaddr_port(&udptldest)); + } if (!ast_sockaddr_cmp(&udptldest, &dest)) { ast_str_append(&m_modem, 0, "c=IN %s %s\r\n", @@ -11979,7 +11984,11 @@ } ast_str_append(&a_modem, 0, "a=T38FaxVersion:%d\r\n", p->t38.our_parms.version); - ast_str_append(&a_modem, 0, "a=T38MaxBitRate:%d\r\n", t38_get_rate(p->t38.our_parms.rate)); + if (doing_directmedia) { + ast_str_append(&a_modem, 0, "a=T38MaxBitRate:%d\r\n", t38_get_rate(p->t38.their_parms.rate)); + }else{ + ast_str_append(&a_modem, 0, "a=T38MaxBitRate:%d\r\n", t38_get_rate(p->t38.our_parms.rate)); + } if (p->t38.our_parms.fill_bit_removal) { ast_str_append(&a_modem, 0, "a=T38FaxFillBitRemoval\r\n"); } @@ -11997,7 +12006,11 @@ ast_str_append(&a_modem, 0, "a=T38FaxRateManagement:localTCF\r\n"); break; } - ast_str_append(&a_modem, 0, "a=T38FaxMaxDatagram:%u\r\n", ast_udptl_get_local_max_datagram(p->udptl)); + if (doing_directmedia) { + ast_str_append(&a_modem, 0, "a=T38FaxMaxDatagram:%u\r\n", ast_udptl_get_far_max_datagram(p->udptl)); + }else{ + ast_str_append(&a_modem, 0, "a=T38FaxMaxDatagram:%u\r\n", ast_udptl_get_local_max_datagram(p->udptl)); + } switch (ast_udptl_get_error_correction_scheme(p->udptl)) { case UDPTL_ERROR_CORRECTION_NONE: break;