diff --git a/channels/chan_sip.c b/channels/chan_sip.c index c42eaac1db544431e097af358ed7461cf2ecbf18..f588543a5ce61771d23cad750c12711b07f832c9 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -7711,7 +7711,7 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action if ((sscanf(a, "T38FaxMaxBuffer:%d", &x) == 1)) { found = 1; ast_debug(3, "MaxBufferSize:%d\n", x); - } else if ((sscanf(a, "T38MaxBitRate:%d", &x) == 1)) { + } else if ((sscanf(a, "T38MaxBitRate:%d", &x) == 1) || (sscanf(a, "T38FaxMaxRate:%d", &x) == 1)) { found = 1; ast_debug(3, "T38MaxBitRate: %d\n", x); switch (x) { @@ -7741,27 +7741,41 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action peert38capability |= T38FAX_VERSION_0; else if (x == 1) peert38capability |= T38FAX_VERSION_1; - } else if ((sscanf(a, "T38FaxMaxDatagram:%d", &x) == 1)) { + } else if ((sscanf(a, "T38FaxMaxDatagram:%d", &x) == 1) || (sscanf(a, "T38MaxDatagram:%d", &x) == 1)) { found = 1; ast_debug(3, "FaxMaxDatagram: %d\n", x); ast_udptl_set_far_max_datagram(p->udptl, x); ast_udptl_set_local_max_datagram(p->udptl, x); - } else if ((sscanf(a, "T38FaxFillBitRemoval:%d", &x) == 1)) { + } else if ((strncmp(a, "T38FaxFillBitRemoval", 20) == 0)) { found = 1; - ast_debug(3, "FillBitRemoval: %d\n", x); - if (x == 1) + if(sscanf(a, "T38FaxFillBitRemoval:%d", &x) == 1) { + ast_debug(3, "FillBitRemoval: %d\n", x); + if(x == 1) peert38capability |= T38FAX_FILL_BIT_REMOVAL; - } else if ((sscanf(a, "T38FaxTranscodingMMR:%d", &x) == 1)) { + } else { + ast_debug(3, "FillBitRemoval\n"); + peert38capability |= T38FAX_FILL_BIT_REMOVAL; + } + } else if ((strncmp(a, "T38FaxTranscodingMMR", 20) == 0)) { found = 1; - ast_debug(3, "Transcoding MMR: %d\n", x); - if (x == 1) + if(sscanf(a, "T38FaxTranscodingMMR:%d", &x) == 1) { + ast_debug(3, "Transcoding MMR: %d\n", x); + if(x == 1) peert38capability |= T38FAX_TRANSCODING_MMR; - } - if ((sscanf(a, "T38FaxTranscodingJBIG:%d", &x) == 1)) { + } else { + ast_debug(3, "Transcoding MMR\n"); + peert38capability |= T38FAX_TRANSCODING_MMR; + } + } else if ((strncmp(a, "T38FaxTranscodingJBIG", 21) == 0)) { found = 1; - ast_debug(3, "Transcoding JBIG: %d\n", x); - if (x == 1) + if(sscanf(a, "T38FaxTranscodingJBIG:%d", &x) == 1) { + ast_debug(3, "Transcoding JBIG: %d\n", x); + if(x == 1) peert38capability |= T38FAX_TRANSCODING_JBIG; + } else { + ast_debug(3, "Transcoding JBIG\n"); + peert38capability |= T38FAX_TRANSCODING_JBIG; + } } else if ((sscanf(a, "T38FaxRateManagement:%255s", s) == 1)) { found = 1; ast_debug(3, "RateManagement: %s\n", s); @@ -8815,25 +8829,25 @@ static int t38_get_rate(int t38cap) int maxrate = (t38cap & (T38FAX_RATE_14400 | T38FAX_RATE_12000 | T38FAX_RATE_9600 | T38FAX_RATE_7200 | T38FAX_RATE_4800 | T38FAX_RATE_2400)); if (maxrate & T38FAX_RATE_14400) { - ast_debug(2, "T38MaxFaxRate 14400 found\n"); + ast_debug(2, "T38MaxBitRate 14400 found\n"); return 14400; } else if (maxrate & T38FAX_RATE_12000) { - ast_debug(2, "T38MaxFaxRate 12000 found\n"); + ast_debug(2, "T38MaxBitRate 12000 found\n"); return 12000; } else if (maxrate & T38FAX_RATE_9600) { - ast_debug(2, "T38MaxFaxRate 9600 found\n"); + ast_debug(2, "T38MaxBitRate 9600 found\n"); return 9600; } else if (maxrate & T38FAX_RATE_7200) { - ast_debug(2, "T38MaxFaxRate 7200 found\n"); + ast_debug(2, "T38MaxBitRate 7200 found\n"); return 7200; } else if (maxrate & T38FAX_RATE_4800) { - ast_debug(2, "T38MaxFaxRate 4800 found\n"); + ast_debug(2, "T38MaxBitRate 4800 found\n"); return 4800; } else if (maxrate & T38FAX_RATE_2400) { - ast_debug(2, "T38MaxFaxRate 2400 found\n"); + ast_debug(2, "T38MaxBitRate 2400 found\n"); return 2400; } else { - ast_debug(2, "Strange, T38MaxFaxRate NOT found in peers T38 SDP.\n"); + ast_debug(2, "Strange, T38MaxBitRate NOT found in peers T38 SDP.\n"); return 0; } } @@ -8899,9 +8913,12 @@ static int add_t38_sdp(struct sip_request *resp, struct sip_pvt *p) ast_str_append(&a_modem, 0, "a=T38FaxVersion:1\r\n"); if ((x = t38_get_rate(p->t38.jointcapability))) ast_str_append(&a_modem, 0, "a=T38MaxBitRate:%d\r\n", x); - ast_str_append(&a_modem, 0, "a=T38FaxFillBitRemoval:%d\r\n", (p->t38.jointcapability & T38FAX_FILL_BIT_REMOVAL) ? 1 : 0); - ast_str_append(&a_modem, 0, "a=T38FaxTranscodingMMR:%d\r\n", (p->t38.jointcapability & T38FAX_TRANSCODING_MMR) ? 1 : 0); - ast_str_append(&a_modem, 0, "a=T38FaxTranscodingJBIG:%d\r\n", (p->t38.jointcapability & T38FAX_TRANSCODING_JBIG) ? 1 : 0); + if ((p->t38.jointcapability & T38FAX_FILL_BIT_REMOVAL) == T38FAX_FILL_BIT_REMOVAL) + ast_str_append(&a_modem, 0, "a=T38FaxFillBitRemoval\r\n"); + if ((p->t38.jointcapability & T38FAX_TRANSCODING_MMR) == T38FAX_TRANSCODING_MMR) + ast_str_append(&a_modem, 0, "a=T38FaxTranscodingMMR\r\n"); + if ((p->t38.jointcapability & T38FAX_TRANSCODING_JBIG) == T38FAX_TRANSCODING_JBIG) + ast_str_append(&a_modem, 0, "a=T38FaxTranscodingJBIG\r\n"); ast_str_append(&a_modem, 0, "a=T38FaxRateManagement:%s\r\n", (p->t38.jointcapability & T38FAX_RATE_MANAGEMENT_LOCAL_TCF) ? "localTCF" : "transferredTCF"); x = ast_udptl_get_local_max_datagram(p->udptl); ast_str_append(&a_modem, 0, "a=T38FaxMaxBuffer:%d\r\n", x);